目录

进程对象、线程对象

进程对象

  1. Win系统在设计上,每一个R3的进程实体,在内核态都会有一个专门的内核对象叫做进程对象,这个对象叫做EPROCESS
  2. 由于Win内核属于是混合架构,又区分出了运行体、微内核,所以EPROCESS的头部抽象为了KPROCESS
  3. 关于KPROCESS,其中关键字段定义如下所示:
KPROCESS字段成员定义
_DISPATCH_HEADER分发头拥有这个分发头的对象,说明这是可以使用WaitForSingleObject等待的对象
DirectoryTableBase进程的页目录表基址,四级分页下指向的是PML4T
ThreadListHead当前线程的链表,其中包含了所有的线程对象ETHREAD
Affinity亲核性,规定了当前进程中的线程,可以运行在哪些核心上
BasePriority该进程创建新线程时,线程的默认优先级
KernelTime(UserTime)该进程处于内核态(用户态)的时间碎片统计
UserDirectoryTableBase在弃用内核页表隔离KPTI后,会有双Cr3
  1. 关于EPROCESS,其中关键字段定义如下所示:
EPROCESS字段成员定义
Pcb指向一个KPROCESS成员
UniqueProcessId当前进程Id,也是全局句柄表中的句柄值
ActiveProcessLinks双链表,正常进程都在其中
CreateTime当前进程创建时间
ExitTime进程退出时间,大部分情况下都是0。只有当进程退出后,会设置这个字段内容。这样需要注意:进程退出≠内核对象马上销毁
Peb进程环境块,这是一块存在于R3的内存
ObjectTable进程句柄句柄表(私有句柄表),保存进程、线程、锁、定时器等等各种句柄
Token进程权限令牌,提权关键字段,修改为System进程一致就是系统进程权限了
AddressCreationLock进程刚创建时不能分配内存,在进程创建回调中不能分配内存就是因为这把锁
SectionObject应该是主模块(exe)的节区对象
InheritedFromUniqueProcessId父进程Id
ImageFileName[15]进程名,会截断
DebugPort调试端口,存放调试对象,详细内容在后续调试体系分析中会展开
WoW64Process32位进程的Peb
ExitStatus进程是否退出,≠STATUS_PENDING就是退出了
VadRootVad二叉树的根节点

线程对象

  1. 线程对象也区分出了ETHREAD、KTHREAD
KTHREAD字段定义
_DISPATCH_HEADER分发头线程是可等待对象
InitialStack、StackLimit、KernelStack当前线程的栈底、栈顶、内核栈
Alerted线程可提前唤醒
Teb线程环境快
TrapFrame线程从R3进入R0时,保存寄存器环境
ApcState、SavedApcState跟APC调度相关,后续章节会详细展开
State线程状态:运行中、就绪(在就绪链表)、等待(等待同步对象)
BasePriority当前线程优先级
PreviousMode当前线程的先前模式
ThreadListEntry链接同进程下其他的线程
Process当前线程所属进程对象
WaitListEntry当前线程被挂到等待链表中时,就是靠这个来挂的
ETHREAD字段定义
Cid线程Id,也就是全局句柄表中的句柄值
ExitTime线程退出时间,同理
StartAddress线程入口点,CreateThread、PsCreateSystemThread传入的线程回调
Win32StartAddressGui线程,该字段才有值
ThreadInserted(Bit)该位置1,说明当前线程已经插入到私有句柄表了,这里可以反调试,因为OpenThread会失败
HideFromDebugger(Bit)该位置1则调试逃逸,该线程的所有异常消息,都不会派发到调试器
进程与线程 内核对象 Windows内核