APP下载

基于EPROCESS 特征的物理内存查找方法

2013-09-20董振兴田庆宜

关键词:链表进程内存

陈 龙,敬 凯,董振兴,田庆宜

(1.重庆邮电大学计算机取证研究所,重庆 400065;2.重庆市公安局电子物证司法鉴定中心,重庆 400065)

0 引言

计算机取证是运用计算机及其相关科学和技术的原理与方法获取与计算机相关的证据以证明某个客观事实存在的过程[1]。传统的取证是基于文件系统的,采用传统的取证手段主要有以下几个理由:①获取方法简单,只需关掉计算机电源,保护好现场即可,对取证人员要求较低;②现在市场上能够买到的计算机取证调查工具大部分只适用于磁盘镜像。但是,如果只采用传统的方式进行取证,内存中的数据就会丢失。Windows内存取证是应用计算机取证工具分析Windows系统内存中的敏感信息,从而获得犯罪证据的一种技术。传统的计算机取证技术很难获得的犯罪证据,如当前正在运行的进程线程信息、网络连接信息等,都可以通过内存取证获得。

内存取证技术是从2005年开始才快速发展的。在2005年夏季,数字取证研究工作组(digital forensic research workshop,DFRWS)开展了一次 Forensics Challenge,主题就是针对物理内存镜像的分析。主办方提供了2个物理内存镜像文件:dfrws2005-physicalmemory1.dmp 和 dfrws2005-physical-memory2.dmp,文件系统的时间表(dfrws2005-timeline.txt),mactime格式的元数据(dfrws2005-body-file.fls),并依此对参赛者提出了相关问题。这场挑战赛鼓励选手们分析Windows2000中的内存管理机制。在本次大赛上Chris Betz开发出了能够重建进程列表并且分析进程内存信息的工具memparser。George M,Garner Jr.和Robert-Jan Mora开发出了能够获取物理内存并对其进行分析的工具 kntlist。2006 年,Andreas Schuster[2]提出了一种分析内存的方法,并开发出了相应的工具PTfinder。利用此方法可发现内存镜像中的一些进程和线程的信息,此方法只适用于Windows 2000、Windows xp的 sp1/sp2版本和 Windows Server 2003。2010 年,Richard M.Stevens 和 Eoghan Casey[3]剖析了命令提示符历史数据结构并且开发出了一种能够从Windows XP内存镜像中重构Windows命令提示符历史记录的工具。2011年,James Okolica和Gilbert L.Peterson[4]介绍了 Windows剪贴板的结构和恢复剪贴板中的数据的过程,并提出剪贴板内容数据的获取方法。此方法对文本有作用,但只能提取被剪切过的文本数据。

本文针对Windows提出一种提取系统运行进程所使用的物理内存的方法。运用此方法可以从系统内存镜像中提取出正常运行和被隐藏的进程的EPROCESS结构,及相应进程的内存数据。这就为进一步的取证分析工作打下了坚实的基础。

1 基于KPCR的内存分析方法

内核处理器控制区(kernel processor control region,KPCR)是用来保存与线程切换有关的全局信息的一种结构。2009年,基于在Windows中KPCR线性地址固定的特点,郭牧和王连海教授[5]提出一种在内存镜像中寻找系统KPCR的方法,通过KPCR还可以找到其他的与内核变量有关的重要信息。2010年,王连海教授[6]又针对其方法进行了相应的改进,使之适用于Windows 7。

在Windows的内核中有一个活动进程链表Ps-ActiveProcessList。这个双向链表保存着所有活动进程的EPROCESS结构,如图1所示。图1中,进程的EPROCESS结构包含一个具有指针成员FLINK和BLINK的LIST_ENTRY结构,这2个指针分别指向其后方进程和前方进程的LIST_ENTRY。

获取KPCR以后,可以根据KPCR内的KPRCB寻找到_KTHREAD结构,通过_KTHREAD找到_KAPC_STATE结构,通过_KAPC_STATE找到EPROCESS结构。最终所找到的就是当前正在被执行的进程的EPROCESS结构。当前运行的进程被一个双向链表连接在一起,通过所获得的EPROCESS结构就可以获得所有活动进程的EPROCESS结构。

图1 进程间的链接关系Fig.1 Link relationships between processes

基于KPCR结构对物理内存进行分析的方法是一种较为有效的方法,为内存取证领域提供了一种新的研究方式。但存在着以下的不足:①查找定位存在一定的不确定性。随着Windows系统版本的不断更新,其对内存大小的要求也越来越高。定位KPCR的限制条件较弱,查找结果可能较多,查找到的结构区域都需设法进一步验证;②无法找出隐藏的进程。利用DKOM(direct kernel object manipulation)直接内核对象操作技术在PsActiveProcessList链表上删除了某个进程的EPROCESS结构以后,该进程将被隐藏起来,但仍会在后台运行[7]。通过遍历此链表得到活动进程的方法将不会得到此进程。

根据KPCR的方法来查找进程的过程是,找到当前被执行的进程的EPROCESS结构,然后根据此结构内的FLINK和BLINK 2个指针成员来遍历Ps-ActiveProcessList链表,找到所有运行的进程。由此可见,通过KPCR的方法无法找到被隐藏进程的EPROCESS结构。

2 基于EPROCESS结构的进程地址空间获取方法

每一个进程都有自己独立的寻址空间,有自己独立的页目录和页表来管理虚拟内存到物理内存的映射。如果知道一个进程的页目录基地址,那么寻找一个进程的物理地址空间的问题就转换成寻找此进程所使用的虚拟地址空间的问题。通过一个进程的虚拟地址空间和页目录基地址可以找到进程使用的物理页。下面我们以32位系统为例对此方法进行描述。

2.1 活动进程EPROCESS结构的查找

在Windows系统中,每个进程都由一个EPROCESS结构来表示。在Windows内核中,进程是靠EPROCESS结构来识别的。这个EPROCESS结构里面包含了与进程相关的重要的信息,如进程内的线程信息、当前系统所运行的进程链表的信息、进程名字等。Windows 7中与Windows XP中的EPROCESS结构是不同的。

图2、图 3分别为 Windows 7,Windows XP下EPROCESS结构的片段。Windows 7中此结构的大小为0x2C0,Windows XP中此结构的大小为0x25C。进程的许多信息都可以直接从这个结构体中获取。

图2 Windows 7下的EPROCESSFig.2 EPROCESS structure in Windows 7

图3 Windows XP下的EPROCESSFig.3 EPROCESS structure in Windows XP

Windows 7中:+0x0a8ExitTime是一个_LARGE_INTEGER类型,占用8个字节,该属性记录一个进程的退出时间,当一个进程正在运行时此属性的值为0。

+0x1a8 Peb进程环境块(process environment block,PEB),每个进程都有自己的 PEB信息,PEB中记录着进程的运行参数、映像装入地址等信息。EPROCESS结构中PEB属性的类型是一个指针,指向该进程的进程控制块。在Windows XP SP1及以前的版本中PEB的地址是固定的,都为0x7ffdf000,从Windows XP SP2以后系统引入了一个新的特性:PEB地址随机化。加入这个新特性后,每一个进程的PEB地址都不是固定的(除了system的PEB地址总是零)。尽管如此,PEB的地址还是有规律可循。系统创建进程时设置PEB的存储区域,这是在进程用户模式分区内分配的一块内存。PEB地址低16位随机化高16位是固定的,都为0x7ffd。

+0x274 ExitStatus

此属性表示进程的退出状态,通过进程的退出状态可以获知进程非正常退出的大致原因。一个运行进程默认的ExitStatus的状态是STATUS_PENDING也称为STILL_ACTIVE。此属性占4个字节,一个运行的进程对应的此属性的值为0x00000103。

Windows XP中这3个属性在EPRCESS结构中的位置与Windows 7不同,分别为

+0x078 ExitTime

+0x1b0 Peb

+0x24c ExitStatus

Windows XP中这3个属性的特性与Windows 7中的特性相同。由以上可得,在内存镜像中检索出运行进程的EPROCESS的方法如下。

Windows 7中,PEB相对于ExitTime的偏移量为0x100,ExitStatus相对于Peb的偏移量为0xCC,然后根据这3个属性的值也就可以定位出EPRCESS的位置。

Windows XP中,Peb相对于ExitTime的偏移量为0x138,ExitStatus相对于 Peb的偏移量为0x9C,然后根据这3个属性的值就可以定位出EPRCESS的位置。

2.2 获取页目录基地址

进程页目录的物理起始地址——页目录基地址保存在EPROCESS结构中,通过页目录基地址进行虚拟地址到物理地址的转换。

EPROCESS的第1个域即进程的进程控制块(process control block,PCB)。PCB是一个 KPROCESS结构,此结构位于EPROCESS的第1项,也就是说其地址和进程EPROCESS的地址相同。PCB是一种存放进程的管理和控制信息的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。

在Windows 7和Windows XP中进程的页目录基地址均在PCB内+0x18处。为DirectoryTable-Base前4个字节的值。通过此基地址可以进行虚拟地址和物理地址之间的转换,如图4-图5所示。

2.3 基于VadRoot域的数据获取

虚拟地址描述符(virtual address descriptor,VAD)。一个VAD保存一段被分配地址空间的信息,所有VAD组成一个二叉排序树来描述用户地址空间的情况。每个进程有自己的用户地址空间,所以每个进程也有自己的VAD二叉排序树。

每一个VAD结点的结构如图6所示。虚拟页号(virtual page number,VPN),StartingVpn 表示这个内存块的起始虚拟页号,EndingVpn表示这个内存块的结束虚拟页号。Parent是一个指向此VAD节点的父节点的指针,LeftChild是一个指向左孩子节点的指针,RightChild是一个指向右孩子节点的指针。VadRoot是指向VAD二叉排序树根节点的指针。Windows 7中的 VadRoot位于 EPROCESS内0x278处,Windows XP中的 VadRoot位于 EPROCESS内0x11c处,如图7所示。

图4 Windows 7下PCBFig.4 Pcb structure in Windows 7

图5 Windows XP下PCBFig.5 Pcb structure in Windows XP

图6 Windows中vad结构Fig.6 Vad structure in Windows

图7 vad二叉排序树Fig.7 Vad binary sort tree

此二叉树是一个AVL自平衡二叉树[8],这种组织方式完全是方便快速查找。树中的每一个节点代表了一段虚拟地址空间。所以程序的代码段,数据段,堆段都会各占用一个或多个VAD节点。通过遍历此二叉树可以得到一个进程所使用的代码段,数据段,堆段,进而得到此进程所使用的物理内存。

虚拟首地址=StartingVpn<<12;

虚拟末地址=EndingVpn<<12;

从根结点开始遍历整个二叉树,就可以得到这个进程所使用的虚拟地址空间。根据页目录基地址进行转换,进而得到进程所使用的在用户地址空间的物理内存。

3 实验结果及分析

镜像提取工具:DumpIt。原因:用此工具获得的镜像文件的位移与实际物理内存地址相一致。根据此算法相应的程序已经写出,在多台计算机上做了相应的实验。

用dkom技术隐藏3个进程,任务管理器里面看不到此3个进程。做镜像的时候,通过任务管理器查看运行的进程数。设Windows XP SP2为S1,Windows XP SP3 为 S2,Windows 7 为 S3,Windows SP1为S4,用任务管理器查看的结果为A,用本文提出的方法找出的结果为B。实验结果如表1所示。

表1 实验结果统计表Tab.1 Statistics of experimental results

EPROCESS结构里的ImageFileName属性代表进程的名字,通过此属性可以验证结果的正确性。由表1可知,运用此方法找到的运行进程的数目与系统内实际运行的数目一致(包括被隐藏的进程)。我们已对找到的结果进行了人工验证,结果表明,所找到的进程均为系统内运行的进程。

综上可知,此方法能够找到包括被隐藏的进程在内的所有活动进程,其适用的系统版本有:Windows XP SP2,Windows XP SP3,Windows 7,Windows 7 SP1。

4 结束语

内存取证领域还是一个较新的领域,发展还不是太成熟,缺少能够应用于内存取证实践的工具和方法,且随着系统的不断更新,对取证技术的要求也不断变化。

本文提出一种内存查找取证方法,此方法能够有效地获取进程内存,不仅适用于Windows XP还适用于新的系统Windows 7。但是随着系统新版本的推出更新换代,对于内存取证技术的要求也会发生相应的变化。Linux和即将发布的Windows 8也需要我们做更进一步的研究。

[1]陈龙,王国胤.计算机取证技术综述[J].重庆邮电大学学报:自然科学版,2005,17(6):736-740.CHEN Long,WANG Guoyin.Summary on Computer Forensics[J].Journal of Chongqing University of Posts and Telecommunications:Natural Science Edition,2005,17(6):736-740.

[2]ANDREAS S.Searching for processes and threads in Microsoft Windows memory dumps[EB/OL].[2012-03-01].http://www.dfws.org/2006/proceedings/2-Schuster.pdf.

[3]RICHARD M S,EOGHAN C.Extracting Windows command line details from physical memory[EB/OL].[2012-03-01].http://www.dfrws.org/2010/proceedings/2010-307.pdf.

[4]JAMES O,GILBERT L P.Extracting the Windows clipboard from physical memory[EB/OL].[2012-03-01].http://www.dfrws.org/2011/proceedings/18-350.pdf.

[5]郭牧,王连海.基于KPCR结构的Windows物理内存分析方法[J].计算机工程与应用,2009,45(18):74-77.GUO Mu,WANG Lianhai.Windows memory analysis method based on KPCR structure[J].Computer Engineering and Applications,2009,45(18):74-77.

[6]ZHANG Shuhui,WANG Lianhai,ZHANG Rui-chao,et al.Exploratory Study on Memory Analysis of Windows 7 Operating System[C]//Pro.of ICACTE'2010.Cheng-Du:IEEE Press,2010:373-377.

[7]LI Peng,WANG Ruchuan,ZHANG Wei.Key technologies of new malicious code developments and defensive measures in communication networks[J].The Journal of China Universities of Posts and Telecommunications.2010,17(4):69-73.

[8]MARK R,DAVID S.Microsoft Windows Internals[M].Fifth Edition.Washington:Microsoft Press,2009:721-724.

猜你喜欢

链表进程内存
债券市场对外开放的进程与展望
基于二进制链表的粗糙集属性约简
“春夏秋冬”的内存
改革开放进程中的国际收支统计
跟麦咭学编程
基于链表多分支路径树的云存储数据完整性验证机制
内存搭配DDR4、DDR3L还是DDR3?
链表方式集中器抄表的设计
社会进程中的新闻学探寻
基于内存的地理信息访问技术