
WinPmem 长期以来一直是 Windows 上默认的开源内存采集驱动程序。它原本属于 Rekall 项目,但最近已被分离到自己的仓库中。
这是 Windows 版本。Linux 版本 Linpmem 位于:https://github.com/Velocidex/Linpmem
此代码最初由 Google 内部开发,但已根据 Apache 许可证发布。
WinPmem 是一款具有以下特性的物理内存采集工具:
开源
支持 Win7 - Win 10,x86 + x64。可使用 WDK7600 来包含对 WinXP 的支持。 默认情况下,提供的 WinPmem 可执行文件将使用 WDK10 编译,支持 Win7 - Win10,并具有更现代的代码。
三种独立的读取方法,其中两种方法可创建完整的内存转储。 即使面对内核模式 Rootkit,也应始终有一种方法能够正常工作。
支持原始内存转储映像。
使用读取设备接口,而不是像其他一些 imager 那样在内核中写入映像。这使我们能够拥有复杂的用户空间 imager(例如通过网络复制、哈希等),并在实时系统上运行分析(例如可以直接在设备上运行)。
此目录中的文件(包括 WinPmem 源代码和已签名的二进制文件)均可根据以下许可证使用:Apache License, Version 2.0
有两个 WinPmem 可执行文件:winpmem_mini_x86.exe 和 winpmem_mini_x64.exe。 两个版本都包含两个驱动程序(32 位和 64 位版本)。
二进制文件名中的 "mini" 表示此 imager 是一个简单纯粹的 imager——它只能生成 RAW 格式的映像。过去我们发布过基于 AFF4 的 WinPmem imager,但尚未更新到新驱动程序。如果您需要基于 AFF4 的 imager,请告知我们。
该 Python 程序目前正在建设中,但可作为如何从 Python 使用 imager 的演示。
该程序最适合用于事件响应,因为它除了可执行文件本身外不需要其他依赖。程序会自动加载正确的驱动程序(32 位或 64 位),并且是自包含的。
winpmem_mini_x64.exe physmem.raw
使用默认采集方法将原始映像写入 physmem.raw。
winpmem_mini_x64.exe
调用用法打印/简短手册。
要专门使用 MmMapIoSpace 方法采集原始映像:
winpmem.exe -1 myimage.raw
映像采集完成后,驱动程序将自动卸载!
由于微软设计 MJ READ 函数的方式,如果指定的物理地址大于 UINT64 最大值的一半,Winpmem 中的物理内存读取将失败并返回 STATUS_INVALID_PARAMETER。例如,如果有人想要读取物理内存的较高部分并且拥有巨大的物理内存(大于 9,223,372,036,854,775,807),就会发生这种情况。这听起来非常不可能,但如今的内存容量仍在不断增长。
WinPmem 源代码支持对内存进行读写。这一功能是一个极好的学习工具,因为许多 Rootkit 隐藏技术可以通过直接写入内存来模拟。
此功能应极其谨慎使用!
注意:由于这是一个相当危险的功能,已签名的二进制驱动程序已禁用写入支持。如果您想使用此功能,可以重新构建驱动程序以生成测试签名的二进制文件。未签名的二进制文件(实际上是用测试证书自签名的)无法在常规系统上加载,因为它们是测试自签名的,但您可以通过以下命令允许未签名的驱动程序在测试系统上加载(参见 https://docs.microsoft.com/en-us/windows-hardware/drivers/install/the-testsigning-boot-configuration-option):
Bcdedit.exe -set TESTSIGNING ON
然后重启。您将在桌面上看到一行 "Test Mode" 文本,提醒您此计算机已配置为允许测试签名的驱动程序。
此外,写入支持还必须在加载时启用:
winpmem.exe -w -l
这将加载驱动程序并启用写入支持。
Winpmem 以及 Linpmem 的存在离不开我们前辈在(现已退役的)REKALL 项目中的工作:https://github.com/google/rekall.
这个项目也离不开广大 DFIR 社区的支持:
我们的开源贡献者: