欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

EPROCESS ETHREAD简介

发布时间:2025/3/21 编程问答 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 EPROCESS ETHREAD简介 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 声明
    • EPROCESS(0环)中的KPROCESS主要成员介绍:
    • EPROCESS其它成员介绍:
    • EPROCESS补充:
    • ETHREAD简介
    • ETHREAD成员中_KTHREAD:
    • ETHREAD其它成员:

声明

这个是0环的EPROCESS,并非3环的PEB

EPROCESS(0环)中的KPROCESS主要成员介绍:

1 .+0x000 Header:_DISPATCHER_HEADER
可等待对象”,比如Mutex互斥体,Event事件等(WaitForSingleObject)

2.+0x018 DirectoryTableBase:[2]Unit4B
页目录表的基址(这个值最终会填在Cr3寄存器中)(所谓进程切换就是切换Cr3的值)

3.+0x038 KernelTime : Unit4B
+0x03c UserTime:Unit4B
统计信息,记录了一个进程在内核模式/用户模式下所花的时间

4 .+0x05c Affinity :Unit4B(32位中4字节(即最多32核))
规定进程里面的所有线程能在哪个CPU上跑,如果值为1,那这个进程的所有线程只能在0号CPU上跑(00000001)(最右边是第0位)
如果值为3,那这个进程的所有线程能在0,1号CPU上跑(00000011)
如果值为4,那这个进程的所有线程能在2号CPU上跑(00000100)
如果值为5,那这个进程的所有线程能在0,2号CPU上跑(00000101)
4个字节共32位,所以最多32核

Windows64位就64核,
如果只有一个CPU把这个设置为4,那么这个进程就死了

+0x062 BasePriority:Char
基础优先级或最低优先级,该进程中的所有线程最起始的优先级

EPROCESS其它成员介绍:

1.0x070 CreateTime: _LARGE_INTEGER
0x070 ExitTime: _LARGE_INTEGER

2.+0x084 UniqueProcessId:Ptr32 Void
进程的编号,即任务管理的PID

3.0x088 ActiveProcessLinks:_LIST_ENTRY(断掉的话,可以达到进程隐藏的目的)
双向链表,所有的活动进程都连接在一起,构成了一个链表
PsActiveProcessHead指向了全局链表头
(注意:3环PEB里面有三个双向链表,断掉的话可以达到模块隐藏的目的)

并未指向头部,而是指向EPROCESS0x88的位置,所以一般都是(用所指向的地址-0x88)

4.+0x090 QuotaUsage:[3]Unit4B
+0x09c QuotaPeak:[3]Unit4B
物理页相关的统计信息

5.+0x0a8 CommitCharge :Unit4B
+0x0ac PeakVirtualSize:Unit4B
+0x0b0 VirtualSize :Unit4B
虚拟内存相关的统计信息

6.+0x11c VadRoot : Ptr32 Void
标识0-2G哪些地址没占用了
(指向了一棵平衡二叉树,这棵二叉树记录了低2G的地址哪些是分配的,哪些是未分配的(当在低2G申请地址时,首先查询这棵树,如果这个地址未在这棵树中,就说明未分配,那这个线性地址就分配给你。如果这个地址在这棵树中,那么这个线性地址就不能分配给你)和模块隐藏有关)

7.+0x0bc DebugPort : Ptr32 Void
(正常情况下,一个进程处于调试状态,这里会存储一个值,这个值也是一个结构体,这个结构体作为被调试进程和调试器之间的桥梁,有了这个值呢,被调试进程和调试器就可以进行通信(避免被调试的话,就可以DebugPort清零))
+0x0c0 ExceptionPort:Ptr32 Void
调试相关

8.+0x0c4 ObjectTable :Ptr32_HANDLE_TABLE
句柄表(每个进程都有个句柄表,在零环,这个句柄表中存储了还用了哪些其它的内核对象(例如在一个进程里面CreateThread))
(反调试手段:查其它进程的句柄表,如果在其它进程的句柄表中发现了进程结构体的地址,也就是当前自身EPROCESS的值,说明其它进程打开了自身,为什么被打开呢?也就是被调试了。。。。。)

9.+0x174 ImageFileName :[16]Uchar
进程镜像文件名 最多16个字节

10.+0x1a0 ActiveThreads:Unit4B
活动线程的数量

11.0x1b0 : Ptr32 _PEB(三环)
PEB(Process Environment Block 进程环境块):进程在3环的一个结构体,里面包含了进程的模块列表,是否处于调试状态等信息(也就是三环PEB的地址)

EPROCESS补充:

进程结构体EPROCESS(0x50和0x190)是2个链表,里面圈着当前进程所有的线程

对于进程断链,程序可以正常运行,原因是CPU执行与调度是基于线程的,进程断链只是影响一些遍历系统进程的API,并不会影响程序执行

对于线程断链也是一样的,断链后在Windbg或者OD中无法看到被断的掉的线程,但不影响其执行(仍然再跑)

ETHREAD简介

线程结构体ETHREAD
每个Windows线程在0环都有一个对应的结构体:ETHREAD这个结构体包含了线程所有重要的信息

ETHREAD成员中_KTHREAD:

1.+0x000 Header :_DISPATCHER_HEADER
"可等待"对象,比如Mutex互斥体,Event事件等(WaitForSingleObject)

2.+0x018 InitialStack:Ptr32 Void
+0x01c StackLimit: Ptr32 Void
+0x028 KernelStack:Ptr32 Void
线程相关切换

3.0x020 Teb :Ptr32 Void
TEB,Thread Environment Block,线程环境块
大小4KB,位于用户地址空间
FS:[0]–>TEB(3环时,0环时FS执行KPCR)
(0环结构体给操作系统使用,3环结构体给应用程序使用)

4.+0x02c DebugActive :Uchar
如果值为-1不能使用调试寄存器:Dr0-Dr7

5.+0x034 ApcState :_KAPC_STATE
+0x0e8 ApcQueueLock :Uint4B
+0x138 ApcStatePointer :_KAPC_STATE
APC相关

6.+0x02d State :Uchar
线程状态:就绪,等待还是运行

7.+0x06c BasePriority :Char
其初始值是所属进程的BasePriority值(KPROCESS---->BasePriority),以后可以通过KeSetBasePriorityThread()函数重新设定

8.+0x070 WaitBlock :[4]_KWAIT_BLOCK
等待哪个对象(WaitForSingleObject)

9.+0x0e0 ServiceTable:Ptr32 Void
指向系统服务表基址

10 . +0x134 TrapFrame
进0环时保存环境(当程序从3环进入0环时,3环原来的寄存器的值所存储的位置(TrapFrame结构体)一个线程中有一个结构体 )

11.+0x140 PreviousMode:Char
某些内核函数会判断程序是在0环调用还是3环调用的

12.+0x1b0 ThreadListEntry :LIST_ENTRY
双向链表 一个进程所有的线程,都挂在一个链表中,挂的就是这个位置,一共有两个这样的链表

ETHREAD其它成员:

1 . 0x1ec Cid:_CLIENT_ID
进程ID,线程ID

2 . +0x220 ThreadsProcess:Ptr32_EPROCESS
指向自己所属进程

3.+0x22c ThreadListEntry:_LIST_ENTRY
双向链表,一个进程所有的线程,都挂在一个链表中,挂的就是这个位置,一共有两个这样的链表

总结

以上是生活随笔为你收集整理的EPROCESS ETHREAD简介的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。