在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB。把它们放到一起是因为这三个数据结构及其外延和windows中进程的表示关系密切,我们在做进程隐藏和进程枚举的时候一定会涉
在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习本文来源gao.dai.ma.com搞@代*码#网内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB。把它们放到一起是因为这三个数据结构及其外延和windows中进程的表示关系密切,我们在做进程隐藏和进程枚举的时候一定会涉及到这3类数据结构,所以这里有必要及时做一下总结,做个学习笔记,理清思路。
《windows 内核原理与实现》 — 潘爱民
《深入解析windows操作系统(第4版,中文版)》 — 潘爱民
《Windows核心编程(第四版)》中文版
首先我们来看一张windows的内核分布图,我们之后要讲的执行体和内核层都在上面。
每个windows进程都是由一个执行体进程块(EPROCESS)块来表示的。”EPROCESS块中除了包含许多与进程有关的属性之外,还包含和指向许多其他的相关数据结构”(这也是为什么能利用EPROCESS进行进程枚举的原因)。例如,每个进程都有一个或多个线程,这些线程由执行体线程块(ETHREAD)来表示。EPROCESS块和相关的数据结构位于系统空间中,不过,进程环境块(PEB)是个例外。它位于进程地址空间中(因为它包含一些需要由用户模式代码来修改的信息)。
除了EPROCESS块以外,windows子系统进程(Csrss.exe)为每个windows进程维护了一个类似的结构。而且,windows子系统的内核部分(Win32k.sys)有一个针对每个进程的数据结构(KPROCESS),当一个线程第一次调用windows的USER或GDI函数(它们在内核模式中实现的)时,此数据结构就会被创建。在学习的一开始,我们对这些数据结构在windows系统的层级位置和大致的作用有一个了解很关键。接下来,我们来详细了解这些数据结构。
一 . EPROCESS
EPEOCESS(执行体进程块,E是Execute的意思,注意和KPROCESS区分开来)位于内核层之上(KPROCESS就内核层,我们之后会学习到KPROCESS),它侧重于提供各种管理策略,同时为上层应用程序提供基本的功能接口。所以,在执行体层的进程和线程数据结构中,有些成员直接对应于上层应用程序中所看到的功能实体。
我们使用winDbg来查看windows XP下的EPROCESS数据结构(winDbg双机调试的方法在《寒江独钓》第一章以及网上有很多成熟的使用说明)。
我们接下来的例子都以windows XP下的notepad.exe作为实验材料。首先,启动winDbg后,找到notepad.exe这个进程(你在虚拟机里要先启动notepad.exe哦)
!process <span>0</span> <span>0</span> <span>//</span><span>查看当前进程 </span><span>....PROCESS 823e5490 SessionId: </span><span>0</span><span> Cid: 0af0 Peb: 7ffd5000 ParentCid: 02b8 DirBase: 0f200340 ObjectTable: e283dc30 HandleCount: </span><span>106</span><span>. Image: alg.exePROCESS 824a7020 SessionId: </span><span>0</span> Cid: 00a0 Peb: 7ffda000 ParentCid: <span>0668</span><span> DirBase: 0f2001a0 ObjectTable: e292f898 HandleCount: </span><span>44</span><span>. Image: notepad.exe...</span>