前言:操作系统创造进程和线程,实质就是构建一个结构体。
一、进程结构体EPROCESS
使用命令查看:dt _EPROCESS
PEB也是描述进程的一个结构体,但是是提供给3环使用的,而不是0环。每个windows进程在0环都有一个对应的结构体:EPROCESS 这个结构体包含了进程所有重要的信息。
成员之KPROCESS
+0x000 Header : _DISPATCHER_HEADER
"可等待”对象,比如Mutex互斥体、Event事件等(WaitForSingleObject),只要0环结构体中以_DISPATCHER_HEADER结构体开头的都是可等待对象,特点是可使用WaitForSingleObject
+0x018 DirectoryTableBase : [2] Uint4B
页目录表的基址,填到CR3寄存器的值,切换进程就是把进程的DirectoryTableBase填到CR3中
+0x038 KernelTime : Uint4B
+0x03c UserTime : Uint4B
统计信息 记录了一个进程在内核模式/用户模式下所花的时间
+0x05c Affinity : Uint4B
规定进程里面的所有线程能在哪个CPU上跑,如果值为1,那这个进程的所以线程只能在0号CPU上跑(00000001)
如果值为3,那这个进程的所以线程能在0、1号CPU上跑(000000011)
如果值为4,那这个进程的所以线程能在2号CPU上跑(000000100)
如果值为5,那这个进程的所以线程能在0,2号CPU上跑(000000101)
4个字节共32位 所以最多32核 Windows64位 就64核
如果只有一个CPU 把这个设置为4 那么这个进程就死了
+0x062 BasePriority : Char
基础优先级或最低优先级 该进程中的所有线程最起码的优先级.
KPROCESS其他成员
+0x070 CreateTime : _LARGE_INTEGER
+0x078 ExitTime : _LARGE_INTEGER
进程的创建/退出时间
+0x084 UniqueProcessId : Ptr32 Void
进程的编号 任务管理器中的PID
+0x088 ActiveProcessLinks : _LIST_ENTRY
双向链表 所有的活动进程都连接在一起,构成了一个链表
PsActiveProcessHead指向全局链表头
dd PsActiveProcessHead
我们可以查看写链表的第一个成员进程
0x090 QuotaUsage : [3] Uint4B
+0x09c QuotaPeak : [3] Uint4B
物理页相关的统计信息
+0x0a8 CommitCharge : Uint4B
+0x0ac PeakVirtualSize : Uint4B
+0x0b0 VirtualSize : Uint4B
虚拟内存相关的统计信息
+0x11c VadRoot : Ptr32 Void
指向了一颗平衡二叉树,表示0-2G内存地址分配使用情况
+0x0bc DebugPort : Ptr32 Void
+0x0c0 ExceptionPort : Ptr32 Void
调试相关,DebugPort清0可以防止反调试,断开调试器与被调试进程的桥梁
+0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE
句柄表(使用0环的一个对象,句柄表计数加一)
可以遍历系统所有进程的句柄表,发现自己的进程的EPROCESS的值,
则说明自己处于调试阶段。也可用此方法实现反调试
+0x174 ImageFileName : [16] UChar
进程镜像文件名 最多16个字节
24分钟
+0x1a0 ActiveThreads : Uint4B
活动线程的数量
+0x1b0 Peb : Ptr32 _PEB
PEB((Process Environment Block 进程环境块):进程在3环的一个结构体,里面包含了进程的模块列表、是否处于调试状态等信息。