向涛,苟木理
重庆大学计算机学院,重庆 400044
Windows 8下基于镜像文件的内存取证研究
向涛,苟木理
重庆大学计算机学院,重庆 400044
随着社会信息化程度的不断提高和普及,利用计算机和网络等信息化手段进行作案的犯罪行为也日渐增多,数字取证在这样的背景下便逐渐成为人们研究与关注的焦点[1]。数字取证能为此类案件的侦破和审理提供重要的线索和电子证据。数字取证包括计算机取证和网络取证,计算机取证是指通过对以磁介质进行存储(例如硬盘、内存、闪存等)的计算机数据进行保护、提取、分析和归档,从而检查计算机系统,提取和保护计算机犯罪有关证据的过程。内存取证是计算机取证研究中的一个重点和难点,因为内存取证需要在不关闭目标计算机的情况下获取易失的内存数据。这些数据包括系统当前运行的进程、线程信息、注册表键值、网络连接,以及网页地址、口令、加密密钥和正在编辑的文件等驻留在内存中的信息。
内存取证技术是目前国内外关于计算机取证研究的前沿和热点课题之一。2005年数字取证工作研究组(Digital Forensic Research Workshop,DFRWS)举办了内存分析挑战大赛,利用Windows 2000的物理内存镜像文件进行分析提取有用的信息[2]。从此,内存取证逐渐成为了国际上关注的热点,很多学者围绕内存取证进行了大量的研究[3-9]。Betz开发了工具Mempaser[4],它能从Windows 2000的内存镜像文件中获取进程和线程的相关信息。文献[5]通过分析内核中的数据结构,提出了一种在Windows 2000到Windows Server 2003内存镜像文件中搜索进程和线程内核数据的方法。Okolica和Peterson基于微软程序数据库文件格式和内核数据结构,设计了一种从Windows NT内核操作系统镜像文件中提取进程和线程等信息的工具[6]。文献[7-9]分别研究了如何从Windows XP等操作系统的物理内存中获取注册表、命令行输入和剪贴板等系统信息。
图1 Windows系统中OBJECT_HEADER结构
但是目前的研究仅局限于Windows 7及其之前推出的操作系统,随着微软最新操作系统Windows 8的发布,内存取证的研究工作又面临新的挑战。Windows 8是一个具有革命性变化的操作系统,同时也是微软主推的整合个人电脑和手持设备的下一代主流操作系统。目前国内外针对Windows 8平台的内存取证研究都还比较少,而且通过研究发现,由于Windows 8在设计和实现上有很多改进和变化的地方,使得上述提到的众多现有内存取证方法和工具不能完全适用于该系统。另外,Windows系统源码的不开放性,也给其取证分析带来了一定的困难。
Windows 8虽然沿用了NT内核,但是为了提高系统的可靠性、安全性和可移植兼容性,Windows各版本的内存管理和内核数据结构在不断地进行改变和优化,进程和线程相关的内核数据结构也在改变[10]。这些演变都给取证人员分析内核及操作系统是如何控制进程和线程等内核对象带来了困难。
针对上述这些问题,本文基于Windows 8操作系统平台,研究了其进程、线程相关的内核数据结构及其特征。利用这些特征,提出并实现了从其镜像文件中查找进程(包括隐藏进程和非隐藏进程)和线程信息的算法,为取证人员进一步的分析奠定了基础。
2.1 相关内核结构
Windows内核对象指进程、线程、设备、文件等对象,它们是按一定数据结构,由内核分配的内存块来进行表示的。内核对象由系统创建,由内核对象管理器维护,并且只能由该内核访问。
内核对象由内存管理器创建,系统通过调用函数nt!ObpAllocateObject创建进程和线程对象,并记录进程和线程的相关信息;在该函数中,又调用函数nt!ExAllocate-PoolWithTag在非换页内存池上分配进程和线程内核对象所需内存空间。
内核对象所在内存区域之前有内存池头(POOL_HEADER),内存池头中的PoolTag域用于对该内核对象进行标注。经分析发现,Windows 8下PoolTag的取值与Windows XP和Windows 7下是不一样的。进程对象中PoolTag的值从“pro”变成了“proc”;线程对象中PoolTag的值从“thr”变成了“thre”。这些变化导致了当前的内存取证工具对镜像文件中进程和线程信息的检测失效。
每个内核对象都有一个与之紧邻的对象头(OBJECT_ HEADER)。对象头包含了控制对象生命周期的信息。相比Windows XP系统,Windows 8系统的对象头变化是比较大的。其中,Type、NameInfoOffset、HandleInfoOffset、QuotaInfoOffset域在Windows 8下分别由Lock、TypeIndex、Trace-Flags、InfoMask域所替代,如图1所示。
内核对象是紧接着对象头分配的,并且部分重叠,分析发现内核对象结构体是从对象头中的Body域偏移量为0x18处开始的。在Windows 7之前的操作系统,为了能够从对象头中获取对象类型指针,直接在对象头里保存了指向对象类型(OBJECT_TYPE)的指针,即对象头中的Type域指向对象类型,对象类型的数据结构定义如图2所示。
图2 OBJECT_TYPE结构
然而,在Windows 8中,这部分的结构和定义发生了如下的变化:(1)Type域被TypeIndex域所取代;(2)所有的对象类型被放在一个内核全局表ObTypeIndexTable里;(3) TypeIndex域并非直接指向对象类型,而是存放全局表ObTypeIndexTable的索引,同一种类型内核对象的对象类型是一样的,故TypeIndex取值相同;(4)经逆向分析,系统通过函数ObGetObjectType获取与掩码对应的对象类型。内核对象、对象头及对象类型的关系,如图3所示。
图3 Windows 8中内核对象、对象头及对象类型的关系
经分析发现,Windows 8中进程对象(EPROCESS)和线程对象(ETHREAD)的对象头中各特征域的取值情况如下:(1)在进程对象的对象头中,TypeIndex=0x07;其对应的对象类型中,Name.MaximumLength=0x10,Name.Length= 0x0e,Name.Buffer=”Process”,Index=0x07。(2)线程对象的对象头中,TypeIndex=0x08;其对应的对象类型中,Name. MaximumLength=0x10,Name.Length=0x0e,Name.Buffer=”Thread”,Index=0x08。
同时,所有的同步对象都有一个子结构DISPATHCER_HEADER,其定义如图4所示。进程和线程也都是同步对象,因此,进程对象和线程对象的内核控制块都是以子结构DISPATHCER_HEADER开始的。
图4 DISPATCHER_HEADER结构
DISPATHCER_HEADER中的Type域代表对象的类型,对不同的对象其取值是不同的。Windows 8中进程对象和线程对象的Type域取值分别为0x03和0x06;域TimerMisc-Flags的取值分别为0x28和0x00;域Abandoned和Size的含义目前尚不清楚。但是,经调试分析发现,Windows XP到Windows 8系统的各个版本它们的取值都为0x00。
2.2 地址转换
Windows 8使用的是虚拟地址,内核中使用的地址不能直接定位到镜像文件中的物理地址,需要通过虚拟内存管理器提供的分页机制来实现虚拟地址到物理地址的转换。EPROCESS结构中的域DirectoryTableBase存放的是进程页目录表或者页目录指针表的物理地址。当进程切换时,系统会将DirectoryTableBase的值赋给CR3寄存器,并使用CR3寄存器进行虚拟地址到物理地址的转换[11]。
在32位的x86系统上,物理地址空间的寻址范围为4 GB。为了解决物理地址寻址空间的局限性问题,Intel公司采取了物理地址扩展(Physical Address Extension,PAE)技术,而PAE技术在32位Windows 8中默认是打开的。
2.2.1 PAE关闭下地址转换
当系统未启用PAE时,虚拟地址的高10位是页目录表的索引。当页目录项的页面大小标志位PS为0时,虚拟地址中间10位为页表索引。此时,页目录表的每个页目录表项都分别指向大小为4 KB的页表,而页表的每项又分别指向大小为4 KB物理页,物理页内的地址偏移量由虚拟地址的低12位计算而得。当PS为1时,页目录表中的每项分别指向页面大小为4 MB的物理页。物理页的地址偏移量由虚拟地址的低22位计算而得。上述具体转换如图5所示。
图5 PAE关闭情况下虚拟地址转换
2.2.2 PAE开启下地址转换
当系统启用PAE时,物理地址从32位扩展到36位,最大物理内存寻址空间由4 GB增加到64 GB。但是32位虚拟地址空间未变,应用程序可见的地址空间大小仍为4 GB,操作系统利用分页机制将4 GB的虚拟地址空间映射到64 GB的物理内存上。此时,虚拟地址可以映射为4 KB或2 MB的物理页,DirectoryTableBase域中存放的页目录表的基地址被页目录指针表的物理地址覆盖。
虚拟地址的31-30位存放页目录指针表索引,通过它可计算页目录指针表项地址;29-21位存放页目录表索引,通过它可计算对应页目录表项地址。当页目录表项中的页面大小标志PS为1时,页目录表项指向2 MB的物理页,这时页面偏移量由虚拟地址低21位确定。当PS为0时,页目录表项指向页表;20-12位和低12位分别存放页表索引和页面偏移量。上述具体转换如图6所示。
图6 PAE开启情况下虚拟地址转换
经过前面对Windows 8下进程和线程对象结构和属性特征的分析,给出在Windows 8镜像文件中查找进程和线程的方法,具体步骤如下:
步骤1利用内核进程控制区域(Kernel Processor Control Region,KPCR)进行地址转换。
由于系统使用虚拟地址,故相关内核数据结构中存放的都是虚拟地址,但在镜像文件中,虚拟地址并不能直接定位到数据,需要进行地址转换。例如,当要查找与进程对象相对应的对象类型时,就必须进行地址转换。
结合文献[12-13]中给出的方法,查找KPCR的物理地址,以确定系统是否启用PAE地址转换,从而进行相应的虚拟地址到物理地址的转换。
步骤2根据进程对象的特征,从镜像文件中提取所有进程对象。
按步长8字节搜索镜像文件,并根据2.1节分析出的特征来判断进程对象,将所有搜索到的进程对象保存到数组中,提取流程如图7所示。
图7 镜像文件分析流程图
步骤3根据进程对象的域ActiveProcessLinks定位隐藏的进程。
嵌在进程对象数据结构中的域ActiveProcessLinks是一个双链表节点,在Windows系统中,所有活动进程都连在一起,构成一个循环双链表。当一个进程被创建时,域ActiveProcessLinks被作为一个节点加到此循环双链表中;当一个进程被删除时,此节点从双链表中移除。
利用此原理,Ring0级隐藏进程的主要方式有两种:一种是通过修改系统服务描述符表(System Services Descriptor Table,SSDT)对进程信息查询函数NtQuerySystemInfomation函数进行Hook,从而将隐藏进程的信息从函数返回中去掉;另一种是从内核维护下的系统当前进程链表中摘除自身以达到隐藏目的。因为第一种方式只能在用户级查询中做到隐藏进程,对内核而言并没有达到隐藏的目的,故在此只需考虑用第二种方式进行隐藏的进程。
由第二步查找得到的所有进程对象(可能包含隐藏进程对象),便可以根据其ActiveProcessLinks值重构进程链表,那些不在此链表中的进程对象即为隐藏进程,其流程如图8所示。
图8 隐藏进程检测流程图
步骤4根据进程对象数据结构定位进程拥有的所有线程。
进程块EPROCESS中内嵌子结构KPROCESS的域ThreadList是一个链表头,该链表包含一个进程的当前所有线程。内核通过调用PspCreateThread函数创建一个线程,并将其加到当前进程的线程链表中。通过遍历此链表,便可以定位当前进程的所有线程信息。
本文采用内核版本号分别为NT 6.2.8139.0、NT 6.2.8250.0和NT 6.2.8400.0的32位Windows 8系统,在PAE开启和关闭的情况下分别对提出的算法进行了实验。首先使用进程隐藏工具FUTo隐藏进程nc.exe,然后使用Mandiant公司开发的软件Memoryze[14]提取镜像物理内存。本文提出的算法在以上三个内核版本的Windows 8下,在PAE开启和关闭的情况下,均能够成功地提取出所有隐藏进程和非隐藏进程,以及每个进程所对应的线程信息。
如图9,是在PAE开启的状态下获取到的进程信息的截图,所对应的Windows 8内核版本为NT 6.2.8250.0。可以看到算法能够成功提取非隐藏进程和隐藏进程nc.exe,并得到进程ID、父进程ID和进程对象的物理地址。
图9 从内存镜像文件中提取出的进程列表
图10显示了检测到隐藏进程nc.exe后,进一步获得的关于此进程的所有线程信息。可以看出,算法能够成功获取各线程对象的物理地址、入口地址和所在模块等详细信息。
图10 进程nc.exe拥有的线程列表
主要研究了微软最新操作系统Windows 8下内存取证的原理和方法。通过逆向工程等分析手段,对Windows 8下内核对象的结构变化、进程和线程对象的特征,以及地址转换进行了分析,从而提出了一种基于Windows 8内存镜像文件的进程和线程提取算法,并且通过重构进程链表定位隐藏进程。实验结果表明,算法不仅能够成功提取系统隐藏进程和非隐藏进程,而且能够获得各进程相关的线程信息,具有较好的准确率和通用性,为内存取证人员的分析提供了坚实可靠的数据基础。
[1]Simson L,Garfinkel L S.Digital forensics research:the next 10 years[J].Digital Investigation,2010,7:S64-S73.
[2]DFRWS.DFRWS 2005 forensics challenge[EB/OL].(2005-08)[2012-05-01].http://www.dfrws.org/2005/challenge/index.shtml.
[3]Burdach M.Digitial forensics of the physical memory[EB/OL].(2005-07)[2012-05-01].http://forensic.seccure.net/pdf/mburdach_ digital_forensics_of_physical_memory.pdf.
[4]Betz C.Memparser[CP/OL].(2005-08)[2012-05-01].http://sourceforge.net/projects/mem-parser.
[5]Schuster A.Searching for processes and threads in Microsoft Windows memory dumps[C]//Proceedings of the 6th Annual Digital Forensic Research Workshop(DFRWS 2006),2006,3:10-16.
[6]Okolica J,Peterson G.Windows operating systems agnostic memory analysis[J].Digital Investigation,2010,7:S48-S56.
[7]Dolan-Gavitt B.Forensic analysis of the Windows registry in memory[J].Digital Investigation,2008,5:S26-S32.
[8]Stevens R,Casey E.Extracting Windows command line details from physical memory[J].Digital Investigation,2010,7:S57-S63.
[9]Okolica J,Peterson G.Extracting the windows clipboard from physical memory[J].Digital Investigation,2011,8:S118-S124.
[10]Russinovich M,Solomon D,Ionescu A.Windows internals[M]. 6th ed.Redmond,WA:Microsoft Press,2012.
[11]Intel.Intel 64 and IA-32 architectures software developer’s manual[M/OL].(2012-05)[2012-05-01].http://download.intel. com/products/processor/manual/325462.pdf.
[12]Zhang R,Wang L,Zhang S.Windows memory analysis based on KPCR[C]//Proceedings of the 15th International Conference on Information Assurance and Security,2009,2:677-680.
[13]郭牧,王连海.基于KPCR结构的Windows物理内存分析方法[J].计算机工程与应用,2009,45(18):74-77.
[14]Mandiant.Memoryze[CP/OL].(2011-09)[2012-05-01].http:// www.mandiant.com/resources/download/memoryze.
XIANG Tao,GOU Muli
College of Computer Science,Chongqing University,Chongqing 400044,China
Memory forensics is a branch of importance in computer forensics,and searching for processes and threads in physical memory dumps is crucial and challenging for memory forensics.This paper investigates the searching of processes and threads in physical memory dumps based on the latest Microsoft operation system Windows 8.By utilizing reverse engineering techniques, the kernel data structures regarding processes and threads on Windows 8 are explored,and their features are identified.Based on these features,an algorithm is proposed for searching processes and threads in Windows 8 physical memory dumps.Experimental results and their analysis indicate that it is capable of extracting information about hidden and non-hidden processes and their threads successfully,thereby providing reliable data foundation for further analysis in memory forensics.
memory forensics;Windows 8;process;thread;physical memory analysis
内存取证是计算机取证的一个重要分支,而获取内存镜像文件中进程和线程信息是内存取证技术的重点和难点。基于微软最新操作系统平台Windows 8,研究其进程和线程的获取方法。运用逆向工程分析技术对Windows 8下进程和线程相关内核数据结构进行分析,提取出相应特征;基于这些特征,提出了一种能够从物理内存镜像文件中得到系统当前进程和线程信息的算法。实验结果和分析表明,该算法能够成功提取隐藏进程和非隐藏进程,及其各进程相关的线程信息,为内存取证分析提供了可靠的数据基础。
内存取证;Windows 8;进程;线程;物理内存分析
A
TP309
10.3778/j.issn.1002-8331.1206-0397
XIANG Tao,GOU Muli.Memory forensics based on Windows 8 physical memory dumps.Computer Engineering and Applications,2013,49(19):63-67.
国家自然科学基金(No.61103211);中国博士后科学基金特别资助(No.201104302);中央高校基本科研业务经费面上项目(No.CDJZR10180020)。
向涛(1980—),男,博士,副教授,主要研究领域为信息安全;苟木理(1985—),男,硕士研究生,主要研究领域为内存取证。E-mail:txiang@cqu.edu.cn
2012-06-26
2012-10-15
1002-8331(2013)19-0063-05
CNKI出版日期:2012-11-12http://www.cnki.net/kcms/detail/11.2127.TP.20121112.1436.004.html