理解内存映像文件的数据关键在于内核调试器数据块(KDBG),可以根据其指针最终找到系统的进程列表。
1.理解内存映像文件
至少有两种不同的方法找到内核调试器数据块(KDBG)。
一种是首先找到内核处理器控制区域(KPCR),它有一个指向内核调试器数据块(KDBG) 的指针。在某些 Windows 版本(如 XP)中,内核处理器控制区域(KPCR)在内存中保持固定偏移量。因此,使用任何工具都可以直接指向该偏移量,并根据指针指向我们真正关心的对象。
另一种是使用签名来搜索内核调试器数据块(KDBG),找到特定对象。注,内核处理器控制区域(KPCR) 的固定偏移量从 Vista 开始发生了变化。
一旦找到内核调试器数据块(KDBG),它就会通过识别 PsActiveProcessHead 指针指向执行进程块(EPROCESS) 或执行进程块列表(这是内存中当前正在运行的所有进程的列表)与文件系统中的文件类似,几乎一切都围绕着内存中的进程进行。每个进程都有自己的进程环境块(PEB),其中包含大量定义进程的数据结构,包括进程可执行文件的完整路径、生成进程的命令行以及所有已加载库的链接列表(DLL)的进程。
虚拟地址描述符(VAD) 树对于内存映像分析特别重要,每个执行进程块都指向一个虚拟地址描述符(VAD) 树,该树负责跟踪分配给该进程的每个内存部分(也称为内存页)。因为它允许检查进程的各个内存部分中存在的内容与各种列表所列的内容。如果发现任何差异,则可能是发生代码注入等恶意行为。
内核模块是用于扩展系统功能的代码。设备驱动程序可能是这些模块中最常见的,扩展了系统与新硬件通信的能力。内存分析工具需要确定这些模块在内存中的位置,因为它们经常被恶意软件用来隐藏其他恶意行为。
内存取证分析的一般性步骤:
识别上下文
查找内核处理器控制区域(KPCR)
内核调试器数据块(KDBG) 和/或目录表库(DTB)
解析内存结构
执行进程块(EPROCESS)
进程环境块(PEB)
加载的 DLL
虚拟地址描述符树(VAD)
属于进程的内存段列表
内核模块/驱动程序
扫描异常值
未链接的进程 DLL 套接字和线程
未映射的进程内存、具有执行权限的页面和权限
挂钩检测
已知的启发式方法和签名
分析异常情况
reference
Windows Internals Book: https://learn.microsoft.com/en-us/sysinternals/resources/windows-internals
Finding Kernel Global Variables in Windows: https://moyix.blogspot.com/2008/04/finding-kernel-global-variables-in.html
内存取证类型 | 内存转储工具/分析工具 |
Live System | WinPMEM |
Dead System | 休眠文件 %SystemDrive%\hiberfil.sys页内存和交换文件 %SystemDrive%\pagefile.sys %SystemDrive%\swapfile.sys(Win8+\2012+) 内存转储文件 %WINDIR%\MEMORY DMP |
reference
https://github.com/Velocidex/c-aff4/releases
http://www.comae.io
https://www.f-response.com
https://belkasoft.com/ram-capturer
https://magnetforensics.com/free-tool-magnet-ram-capture
可通过有许多不同的内存采集应用程序获取内存,但它们的操作都相似。
在 Windows 2003 SP1 之前,可以使用名为 YDeviceYPhysicalMemory 的句柄来寻址和复制内存。由于允许从用户模式访问内存,存在安全问题,该句柄已被弃用,现在必须使用驱动程序通过 Windows 内核访问内存。
现在大多数获取内存工具,都会加载系统驱动程序以获取对内存的访问权限,然后将内存的全部内容转储到映像文件中。
注意,使用加载的驱动程序访问原始内存与某些恶意软件采取的步骤非常相似。因此,可能会被主机保护应用程序拦截。在 64 位 Windows 操作系统中,所有加载的设备驱动程序都必须经过数字签名。
RAM 被认为是易失性数据,会在系统关闭时消失。但操作系统有时自动创建的一些 RAM 副本。例如,笔记本电脑的休眠功能,当系统从睡眠模式转换到省电模式或休眠模式时创建hiberfil.sys文件。当笔记本关闭时,hiberfil.sys是 RAM 中所有内容的完整副本。只需从系统驱动器的根目录复制此文件,即可为我们提供现成的内存映像文件。
崩溃转储文件也是 RAM 分析的重要来源。在%WINDIR% 文件夹中查找memory.dmp文件。如果进行了完整的故障转储,它将是 RAM 的完整副本。
pagefile.sys和swapfile.sys文件不是 RAM 的完整副本,但仍包含部分内存被分页到磁盘。在 Windows 8 和 Server 2012 中,swapfile.sys用于为已交换到磁盘的挂起的应用程序保留工作内存信息。
在 Windows 2016 要加载驱动程序到服务器上,驱动程序必须接受由微软评估并通过 Windows 硬件质量实验室(WHQL) 认证。虽然这对安全性和稳定性来说是一件好事,但它也让当前的获取内存的工具失效(目前所有工具都使用驱动程序来访问 RAM)。不知道是否以及何时安全工具将找到一种方法来满足这些要求。
reference
DeviceYPhysicalMemory Object: https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc787565(v=ws.10)?redirectedfrom=MSDN
PMEM Memory acquisition suite: https://github.com/Velocidex/c-aff4/releases
Windows 8 / Windows Server 2012 The New Swap File: https://learn.microsoft.com/en-us/archive/blogs/supportingwindows/windows-8-windows-server-2012-the-new-swap-file
hiberfil. sys 是Windows 休眠文件是在系统处于休眠或省电模式时创建的。这最常发生在笔记本计算机上,位于系统驱动器的根目录(通常为C:\)。
hiberfil. sys:休眠时 RAM 的压缩副本文件
一些工具可以解压为原始RAM文件:
Volatility imagecopy
hibr2bin.exe
Hibernation Recon
许多工具可以本地分析:
BulkExtractor
Internet Evidence Finder
Volatility
Passware
可以通过 powercfg.exe工具启用、禁用和修改休眠文件压缩。
在获取虚拟机内存映像时,一个有用的方式是挂起虚拟机,强制复制内存到宿主机。
在 VMware、Microsoft Server 2008 Hyper V 和 Parallels 中,内存映像文件是内存的原始副本,可以使用我们的内存分析工具直接进行分析。但是,不同的配置或平台可能会导致必须转换更复杂的格式(例如,VMware ESX 和 Hyper-V)。
VirtualBox 是一个例外。它的内存文件只保存正在使用中的内存,而不是分配给虚拟机的全部内存。因此,它不会被许多内存分析工具识别。
获取虚拟机内存映像的备用计划是在虚拟机中运行直接内存转储工具,采集原始内存映像。
在某些情况下,虚拟机存储的每个快照都将拥有自己的完整内存副本。VMware 虚拟机的每个快照都有一个单独的vmem可以分析。
在VMware ESX 服务器利用 .vmss(VMware 保存状态)和 .vmsn(VMware 快照)文件来存储内存。尽管这些文件不是内存的原始转储,但它们通常包含完整的内存映像。
不同虚拟机产品查找内存文件类型:
VMware(Fusion/Workstation/Server/Player)
O .vmem = 原始内存
.vmss and .vmsn = 包含内存映像
Microsoft Hyper-V
.bin = 内存映像
.vsv = 保存状态
Parallels
.mem = 原始内存映像
VirtualBox
% .sav = 部分内存映像
不同虚拟机产品查找内存文件的一些常见位置:
Windows Server 2008 Hyper-V: <Drive Letter>\XXX\<VM name>\Virtual Machines\GUID\
VMware Workstation: <Drive Letter>\XXX\My Virtual Machines\<VM name>\
VMware Fusion:/Users/<username>/Documents/VirtualMachines.localized/
VMware ESX:<DatacenterName>\<DatastoreName>\<DirectoryName>\<VirtualMachineName>
VirtualBox: .VirtualBox/Machines/<VM name>/Snapshots/
Parallels: /Users/<username>/Documents/Parallels/<VM name>/Snapshots/
Volatility 是一个框架,用于在 Windows、Linux 和 Mac 内存映像上进行数字调查。
Volatility 支持的系统:
Windows XP Service Pack1-3 (x86 and x64)
Windows 2003 Service Pack 0-2 (x86 and x64)
Windows Vista Service Pack 0-2 (x86 and x64)
Windows 2008 Service Pack 1-2 (x86 and x64)
Windows 2008R2 Service Pack 0-1 (x64)
Windows 7 Service Pack 0-1 (x86 and x64)
Windows 8 Service Pack 0-1 (x86 and x64)
Windows 2012 (x64)
Windows 2012R2 (x64)
Windows 10 (x86 and x64)
Windows 2016 (x64)
Volatility分为2.3和3。
Volatility 3特点:
Python3 中重新编写以提高性能和并行性
自动检测配置文件
改进了 WoW64(32 位代码)分析
更容易分析代码注入/rootkit
API 和插件开发的重大更新
2021 年 8 月将停产 Volatility 2
与现有第 2 版非常相似的第 3 版插件
vol.py -f [image] [plugin] --profile=[PROFILE]
可以设置环境变量代替 -f [image]选项
export VOLATILITY_LOCATION=file:/ /<file path>
Volatility 需要使用 --profile= [PROFILE] 参数指定内存映像的系统类型:
可以设置环境变量代替 --profile选项
export VOLATILITY_PROFILE=Win10x64_16299
随着 Windows 10 版本发布,微软开始以更快的速度发布操作系统的重大更新。通过 Microsoft内部版本号跟踪这些新版本(以及它们在内存结构中所做的更改)。如果不知道具体的内部版本号,可以使用 kdbgscan 插件来获取更具体的信息。此插件扫描内核调试器数据块(KDBG)结构并解析出特定的build字符串。例如,build字符串可能如下所示,提示使用 Win10x64_16299 配置文件:
16299.15.amd64fre.rs3 release.17
kdbgscan插件查找和解密内核调试器数据块(KDBG)结构以帮助识别系统配置文件
对于 Win8/10系统,比 imageinfo 插件更好的选择
使用-g <KdCopyDataBlock>加速后续插件
该插件通常是在检查新内存映像文件使用的第一个插件,因为需要确定必须使用哪一个配置文件进行进一步分析。
配置文件是通过 profile-' 选项设置,或者通过VOLATILITY_PROFILE 环境变量隐式设置。
Kdbgscan 在内存映像中搜索各种不同操作系统配置文件的已知 KDBGHeader 签名的匹配项。一旦找到潜在对应的结构,它就会对数据进行一系列完整性检查,用于消除误报(KDBG 的签名检测特别容易出现误报和无效结构)。从 Windows 8 x64 开始,KDBG 结构被加密(这是为了阻止一些攻击)。
因此,对于最新版本的 Windows,此插件还需要搜索名为 KdCopyDataBlock 的函数来导出解密密钥。所有这些都需要时间,这使得 kdbgscan 成为最慢的 Volatility 插件之一。
vol.py -f memory.img kdbgscan
kdbgscan 提供的信息可用于加速分析。Volatility 插件支持“-g”或 kdbg=“选项,允许将这个重要起点地址提供给任何可能尝试自行搜索的插件(pslist 插件就是一个很好的例子)。此选项应提供 Windows 7 或之前系统的 KDBG 的虚拟 (V) 偏移量和 Windows 8+ 系统的 KdCopyDataBlock 的虚拟 (V) 偏移量。在某些内存映像文件分析中,它可能会缩短某些插件运行时间的分钟数。例子:
vol.py -g 0xf801252197a4 --profile=Winl0x64_16299 -f memory.img pslist
imageinfo 的插件也可用于识别配置文件信息。它提供了 kdbgscan 不提供的一些信息,比如:内存里的系统时间和目录表基数 (DTB) 偏移量。
kdbgscan输出要注意的事项:
PsActiveProcessHead 中是否标识了任何进程
PsLoadedModuleList 中是否标识了任何模块
KernelBase 是否包含说明“Matches MZ: True”的注释
是否提供了系统内部版本号
配置文件建议是否与系统内部版本号匹配
是否提供了内核处理器控制区域(KPCR)地址
在内存映像中可以找到多个合法的内核调试器数据块(KDBG)结构,并且 KDBG 结构可以成功映射到多个不同的配置文件。通过输出所有结果,kdbgscan 允许更全面地搜索用于 Volatility 的最佳配置文件。
imagecopy:将故障转储和休眠文件转换为原始内存映像
输出文件名 (-O)
确保 (--profile=) 提供正确的操作系统配置文件
解压缩 Windows 休眠文件 hiberfil. sys
将故障转储文件转换为原始内存映像
现在支持 VMware 快照和 VirtualBox 内存
还可以转换实时会话数据
imagecopy 需插件还需要休眠文件的配置文件,因为 hiberfil.sys 在不同版本的 Windows 之间使用不同的格式进行压缩。可能需要不断尝试不同的配置文件,直到找到要正确的配置文件才能成功解压缩休眠文件。(或者确保记录系统的内部版本号)