进程结构体

进程结构体EPROCESS

每个windows进程在0环都有对应的结构体:EPROCESS这个结构体包含了进程所有重要的信息。
使用windbg查看:dt _EPROCESS
EPROCESS与PEB是有区别的:EPROCESS在0环PEB在3环。

EPROCESS结构体属性(KPROCESS)

+0x0 Pcb 是一个KPROCESS结构体
Windbg查看KPROCESS:dt _KPROCESS
KPROCESS第一个属性:
+0x0 Header	DISPATCHER_HEARDER
只要是该DISPATCHER_HEARDER结构体就是可等待对象,
比如Mutex互斥体/Event事件(WaitForSingleObject)等

KPROCESS->DirectoryTableBase:[2]Uint4E

DirectoryTableBase:是页目录表基址
该属性位于EPRCOESS->PCB(KPORCESS)->0x18位置
在整个进程结构体中属于非常重要的属性结构。
该结构指向了进程线性地址指向的物理页,类似于PTT和PDT。
进程切换实际上就是将DirectoryTableBase取出来放到CR3里。
进程切换本质就是CR3的切换。

KPROCESS->KernelTime与UserTime

+0x38 KernleTime:在内核中运行的时间。
+0x3C UserTime:在3环中运行的时间。

KPROCESS->Affinity:Uint4B(4字节)

规定进程里面所有线程可以在那个CPU上执行,
比如值是1,那这个进程的所有线程就只能在0号CPU上面跑。
值1(00000001) 0号CPU
值2(00000011)0号和1号CPU
值4 (00000100)   3号CPU
如果一个CPU只有单核却设置为4则进程死了。
4字节32为最多32核,64位就64位(Windows下)

EPROCESS其他成员

+0x070 CreateTime	:_LARGE_INTEGER
+0x078 ExitTime	:_LARGE_INTEGER
进程的创建/退出时间
+0x084 UniqueProcessld:Ptr32 Void
进程的编号任务管理器中的PID
+0x88 ActiveProcessLinks:_LIST_ENTRY
双向链表所有的活动进程都连接在一起,构成了一个链表
PsActiveProcessHead指向全局链表头
需要注意的是要查看前一个要减去0x88,因为操作系统链在腰部需要减去偏移。
任务管理器中显示的所有进程都是通过该结构体找到到,因此可以断链表实现隐藏进程。
+0x090 QuotaUsage:[3]Uint4B
+0x09c QuotaPeak:[3]Uint4B
物理页相关统计信息
+0x0a8 CommitCharge:Uint4B
+0x0ac PeakVirtualSize:Uint4B
+0xb0 VirtualSizeLUint4B
虚拟内存相关的统计信息
+0x11c VadRoot :Ptr32 Void
标识0-2G那些地址没占用了(如果模块被隐藏可以使用该成员查看)
+0xbc DebugPort:Ptr32 Void
(反调试技术将该成员归0,如果处于调试模式则该成员指向一个结构体,
该结构体是调试器与被调试进程的桥梁可以进行数据的通讯)
+0x0c0 ExceptionPort:Ptr32 Void
调试相关
+0x0c4 ObjectTable:Ptr32_HANDLE_TABLE
如果使用了其他的内核对象那么该对象则存储了相关的句柄地址,
该表主要存储了使用了那些内核对象,该成员也可以用于反调试,
遍历所有进程的该成员,如果在其他进程的句柄表中发现了自己,
则说明该进程打开了自己,则说明自身被他正在调试。
句柄表
+0x174 ImageFileName:[16]UChar
进程镜像文件名最多16个字符,该进程的名字
+0x1a0 ActiveThreads:Uint4B
活动线程的数量
0x1b0 Peb 进程环境快

你可能感兴趣的:(操作系统,win内核,二进制,安全漏洞,反汇编,内核,操作系统)