内存取证原理与实践
上QQ阅读APP看书,第一时间看更新

3.4 内存获取的其他方式

除了使用软硬件工具镜像计算机的物理内存,还可以通过其他途径访问内存数据,下面分别进行介绍。

(1)虚拟化环境下获取内存

虚拟机技术用软件模拟计算机硬件,可以实现一台机器运行多个操作系统。现在的大部分虚拟机都具有快照功能,该功能将虚拟机操作系统的当前内存以文件的形式保存在相应的主机系统中。例如,VMware Workstation虚拟机的快照会在本地磁盘产生一个“vmem”后缀的文件,以保存当前虚拟机系统的全部内存数据,该文件格式与DD工具得到的内存格式类似,都保留了原始的系统内存内容。采用这种方式可以方便地得到某一时刻的系统内存数据。

虽然实际的目标计算机很少运行在虚拟机中,但是基于其跨平台、易于操作并可以多次获取运行中系统内存的特性,可以把虚拟机的内存文件作为内存分析研究阶段的内存数据来源直接使用。

(2)内存转储(Memory Dump)方式

现代操作系统为了调试和报告错误,通常提供了系统出错时的内存转存功能,可以利用系统自带的或者根据此功能开发的取证工具获取物理内存。

(3)Cold-Boot攻击方式

Halderman[23]发现,芯片在切断电源后,其电容在极短的一段时间内还会保留信息。根据这一原理,通过使用液氮对刚刚关机的内存芯片进行迅速冷冻保存,将该芯片安装到新的系统后可以获取到原来系统残留的内存信息。这是一种极端的方式,理论上非常有趣,实用价值不大。

(4)休眠文件保存的内存信息

很多操作系统提供了休眠功能,休眠时内存信息往往以文件的形式保存在磁盘中,如Windows系统中的hyberfile.sys文件、Mac OS的/var/vm/.sleepimage.swp文件等。

(5)页面交换文件中的内存信息

物理内存在整个计算机体系中是相当宝贵的,为了解决内存不足的问题,引入了虚拟内存的概念。系统在运行过程中,只对真正需要内存的进程分配所需的内存,这样才能保证每个进程都有内存可以使用。但是当系统中同时执行很多个程序,或者某个程序需要使用的内存数据超出了物理内存的容量时,内存还是会被占用完,这样便无法继续执行其他的应用程序。为了解决这个问题,操作系统在磁盘空间中专门创建了文件对内存数据进行缓存,可以将这部分磁盘空间当作真正的物理内存来使用,操作系统通过一些换入换出操作完成该文件和真正物理内存的数据交换。对于上层的应用程序来说,这个过程是透明的。这些文件中或多或少地保存有内存数据。在内存取证分析过程中,为了尽可能多地利用这部分数据,也需要对该文件进行获取和分析。

操作系统一般会限制用户对这类文件的访问,在系统运行时,无法直接使用操作系统的文件管理功能获取。下面以Windows操作系统的页面交换文件pagefile.sys为例,说明如何直接根据磁盘的文件系统,从底层获取到这些文件的内容。

Windows系统创建的内存交换文件pagefile.sys,通常存储在%SystemRoot%目录下。默认情况下,其大小与物理内存大小相同,也可以在系统设置中调整其占用的磁盘空间。在Windows操作系统运行过程中,该文件是被内核锁定的,无法使用Windows系统提供的文件复制功能来提取该文件。

目前,Windows系统中最常用的文件系统为NTFS(New Technology File System)。NTFS是微软为其旗下的Windows NT操作系统和Windows NT高级服务器网络操作系统开发的文件系统。它对FAT和HPFS(高性能文件系统)做了若干改进。例如,支持元数据,使用了高级数据结构,以便于改善性能、可靠性和磁盘空间利用率,并提供了若干附加扩展功能,如访问控制列表(ACL)和文件系统日志。NTFS文件系统中一个非常重要的概念是文件相关的元数据文件,简称“元文件”。主文件表(MFT,Master File Table)是NTFS的核心,它包含了所有文件和目录的信息。只要找到了页交换文件的MFT记录就可以知道页交换文件在硬盘上的起始位置和大小,接着就可以通过直接读取磁盘扇区的方法来复制这个页交换文件。

软件实现通过NTFS文件系统,获取pagefile.sys文件的主要步骤如下[24]

①主文件表(MFT)定位

分析操作系统所在分区的BPB(BIOS Parameter Block)数据区,该数据区位于NTFS分区中的第一个区域。通过查找MFT(Master File Table)的起始逻辑簇号、每簇扇区数和每扇区字节数可以计算出根目录的位置。具体实现是选中磁盘,获取磁盘句柄,然后读取该磁盘引导扇区中的BPB参数,获得MFT逻辑簇号MFT_Logic_Address。如此就可以找到$MFT的偏移位置。

②页面文件的文件记录定位

MFT为NTFS文件系统的第一条文件记录。磁盘中的每个文件都有自己的文件记录(File Record),每条文件记录是固定的1 kB,而且在磁盘中连续存放。从$MFT的文件记录开始的16条记录是系统文件的文件记录。每条文件记录由若干文件属性组成,每个属性有相同的格式,开始是一个标准属性记录头,然后是属性的数据段。

搜索文件名需要用到文件的FILE_NAME属性,该属性值存放的内容是文件名,在NTFS中用0x30作为属性标识符。从$MFT的文件记录开始,挨个搜索系统分区的文件记录,提取文件记录中文件名属性,与字符串“pagefile.sys”进行匹配,即可找到页面文件的文件记录。

③获取页面文件的物理地址

找到pagefile.sys的文件记录之后,需要用到文件记录中的另外一个属性DATA,在NTFS中以0x80作为标识符。NTFS中文件记录的属性头有两种格式:驻留属性和非驻留属性。驻留属性中文件的数据直接存储在文件记录中,大小不能超过700 KB。pagefile.sys文件的大小默认和物理内存的大小相同,远大于700 KB,因此文件记录的DATA属性头采用的是非驻留属性格式。通过分析DATA属性便可得到pagefile.sys文件的物理偏移地址和文件大小。

利用得到的文件偏移地址和文件大小,直接读取磁盘的数据,并将数据写到目标文件中,即可完成pagefile.sys文件的提取。