其实我们创建进程或者线程就是分配一块内存填充一个结构体赋上具体的值这样进程或者线程也就创建出来了。
每个windows进程在0环执行体都有一个对应的结构体: _EPROCESS这个结构体包含了进程所有重要的信息。
kd> dt _EPROCESS
nt!_EPROCESS
//名称 //类型
+0x000 Pcb : _KPROCESS //子结构 (微内核)
+0x06c ProcessLock : _EX_PUSH_LOCK//推锁对象 保护_EPROCESS数据成员
+0x070 CreateTime : _LARGE_INTEGER //进程创建的时间
+0x078 ExitTime : _LARGE_INTEGER //进程退出时间
+0x080 RundownProtect : _EX_RUNDOWN_REF//进程的停止保护锁(所有线程释放了才能释放进程)
+0x084 UniqueProcessId : Ptr32 Void //Pid
+0x088 ActiveProcessLinks : _LIST_ENTRY /*
所有活动进程组成的双向链表,PsActiveProcessHead指向全局链表头。
dd PsActiveProcessHead得到的就是第一个进程
注意里面的地址都从_EPROCESS+0x88的位置开始 dt _EPROCESS 链表里的地址 -88
*/
+0x090 QuotaUsage : [3] Uint4B//内存使用量 物理页统计信息
+0x09c QuotaPeak : [3] Uint4B//尖峰使用量 物理页统计信息
+0x0a8 CommitCharge : Uint4B//虚拟内存以提交的页面
+0x0ac PeakVirtualSize : Uint4B//虚拟内存大小的尖峰值
+0x0b0 VirtualSize : Uint4B//虚拟内存的大小
+0x0b4 SessionProcessLinks : _LIST_ENTRY//系统会话链表节点地址
+0x0bc DebugPort : Ptr32 Void//调试端口
+0x0c0 ExceptionPort : Ptr32 Void//异常端口
+0x0c4 ObjectTable : Ptr32 _HANDLE_TABLE//句柄表
+0x0c8 Token : _EX_FAST_REF//进程安全访问检查
+0x0cc WorkingSetLock : _FAST_MUTEX
+0x0ec WorkingSetPage : Uint4B//包含进程工作集的页面
+0x0f0 AddressCreationLock : _FAST_MUTEX//保护虚拟地址的互斥锁
+0x110 HyperSpaceLock : Uint4B//自旋锁 用于保护进程超空间
+0x114 ForkInProgress : Ptr32 _ETHREAD//指向正在复制地址空间的那条线程
+0x118 HardwareTrigger : Uint4B//记录硬件错误性能分析次数
+0x11c VadRoot : Ptr32 Void//用户层 哪些地址没占用?
+0x120 VadHint : Ptr32 Void
+0x124 CloneRoot : Ptr32 Void//当进程空间地址复制时,此树会被创建
+0x128 NumberOfPrivatePages : Uint4B//进程私有页面的数量
+0x12c NumberOfLockedPages : Uint4B//被锁住的页面数量
+0x130 Win32Process : Ptr32 Void//不为NULL 说明是一个GUI进程
+0x134 Job : Ptr32 _EJOB
+0x138 SectionObject : Ptr32 Void//进程可执行映像文件的内存区对象
+0x13c SectionBaseAddress : Ptr32 Void//该内存区对象的基地址
+0x140 QuotaBlock : Ptr32 _EPROCESS_QUOTA_BLOCK//指向该进程的配额块
+0x144 WorkingSetWatch : Ptr32 _PAGEFAULT_HISTORY//用于监视一个进程的页面错误
+0x148 Win32WindowStation : Ptr32 Void//进程所属的窗口站的句柄
+0x14c InheritedFromUniqueProcessId : Ptr32 Void//父进程ID
+0x150 LdtInformation : Ptr32 Void//LDT表
+0x154 VadFreeHint : Ptr32 Void//指向一个提示VAD节点
+0x158 VdmObjects