在操作系统层面上,进程本质上就是一个结构体,当操作系统想要创建一个进程时,就分配一块内存,填入一个结构体,并为结构体中的每一项填充一些具体值。而这个结构体,就是EPROCESS
在+0x088
偏移处有一个指针ActiveProcessLinks
,指向的是 _LIST_ENTRY
。它是双向链表,所有的活动进程都连接在一起,构成了一个链表
那么链表总有一个头,全局变量PsActiveProcessHead
(八个字节)指向全局链表头。这个链表跟进程隐藏有关,只要我们把想要隐藏进程对应的EPROCESS
的链断掉,就可以达到在0环进程隐藏的目的。
我们看一下PsActiveProcessHead
kd> dd PsActiveProcessHead
前四个字节指向的是下一个EPROCESS
结构,但指向的并不是EPROCESS的首地址,而是每一个进程的 _EPROCESS + 0x88
的位置
所以当我们要查询下一个进程结构时,需要 -0x88。比如当前PsActiveProcessHead
指向的下一个地址为0x863b58b8
kd> dt _EPROCESS 863b58b8-0x88
在0x174偏移的地方存储着进程名,我们可以看到第一个EPROCESS
结构对应的是System
进程,这里0x88偏移存放的就是下一个EPROCESS
结构的地址,但是这里注意,因为这个结构的地址是指向下一个链表的地址,所以如果要得到EPROCESS
的首结构就需要-0x88
我们通过偏移得到下一个EPROCESS
结构,可以发现为smss.exe
进程