Process Dump 是一款 Windows 逆向工程命令行工具,用于将恶意软件的内存组件转储回磁盘以供分析。恶意软件文件在执行前通常会被打包和混淆,以躲避 AV 扫描器;然而当这些文件被执行时,它们往往会在内存中解包或注入一份干净的恶意软件代码。恶意软件研究人员在分析恶意软件时的一项常见任务,就是将这份解包后的代码从内存转储回磁盘,以便用 AV 产品扫描,或用 IDA 等静态分析工具进行分析。
Process Dump 适用于 Windows 32 位和 64 位操作系统,可以从特定进程或当前正在运行的所有进程中转储内存组件。Process Dump 支持创建和使用干净哈希数据库,从而可以跳过对 kernel32.dll 等已知文件的转储。其主要功能包括:
-closemon),此时被挂钩的进程会在终止前被暂停并转储。我在我的网站上维护着一个官方编译版本: https://split-code.com/processdump.html
你可以在此处下载 Process Dump 的最新编译版本:
在 64 位 Windows 上使用 pd64.exe(推荐),或在 32 位 Windows 上使用 pd32.exe。两个二进制文件均为独立文件;无需 Microsoft Visual C++ Redistributable。
Process Dump 可以从内存中转储所有未知代码(-system)、转储特定进程,或监控进程并在其终止前进行转储。
在干净的工作站上,使用以下任一命令生成基线数据库:
pd64.exe -db genquickpd64.exe -db gen将数据库生成和转储作为单独的命令运行。为获得最佳访问权限,请以管理员身份运行。默认工作线程数为 16。
示例用法:
pd64.exe -systempd64.exe -pid 419pd64.exe -pid 0x1a3pd64.exe -pid 0x1a3 -a 0x401000 -o C:\dumpspd64.exe -p "chrome[.]exe"pd64.exe -p ".*chrome.*"pd64.exe -closemon通用转储选项
| 选项 | 描述 |
|---|---|
-system | 从所有可访问的进程中转储不匹配干净哈希数据库的模块和零散代码。 |
-pid <pid> | 转储特定进程。使用十进制或带 0x 前缀的十六进制 PID。 |
-closemon | 挂钩进程终止并在退出前转储。请在受控环境中使用;按 Ctrl+C 停止。 |
-p <regex> | 转储其完整名称匹配区分大小写的正则表达式的进程。多个匹配项会提示确认。 |
-a <address> | 在指定的基地址处转储。需要 -pid;接受十进制或带 0x 前缀的十六进制。 |
-o <path> | 设置输出文件夹(默认:当前工作目录)。请先创建该文件夹;现有文件绝不会被覆盖。 |
干净哈希数据库选项
数据库文件默认位于应用程序目录:clean.hashes、entrypoints.hashes 和 shortentrypoints.hashes。
| 选项 | 描述 |
|---|---|
-db gen | 从正在运行的进程以及 %WINDIR%、%USERPROFILE%、C:\Program Files 和 C:\Program Files (x86) 中递归的 PE 文件添加哈希。 |
-db genquick | 仅从正在运行的进程添加哈希。比 gen 更快,但不够完整。 |
-db add <dir> | 从指定目录递归添加 PE 文件哈希,包括入口点签名。 |
-db remove <dir>, -db rem <dir> | 从目录中递归移除匹配的干净模块哈希。入口点签名会保留。 |
-nr | 禁用数据库添加/移除命令的递归。不影响 -db gen。 |
-db clean | 清除所有三个数据库,包括入口点签名。 |
-db ignore | 在本次转储中忽略所有三个已加载的数据库,而不更改文件。重复的模块在运行期间仍可能被跳过。 |
-cdb <filepath>, -c <filepath> | 设置干净哈希数据库路径。 |
-edb <filepath> | 设置入口点哈希数据库路径。 |
-esdb <filepath> | 设置短入口点哈希数据库路径。 |
输出选项
| 选项 | 描述 |
|---|---|
-v | 打印详细诊断信息。 |
-nh | 抑制版本/版权横幅。 |
--help, -help, -h, --h | 打印帮助并退出。不带参数运行也会打印帮助。 |
高级选项
| 选项 | 描述 |
|---|---|
-g | 强制生成 32 位和 64 位 PE 头,忽略现有头。 |
-eprec | 即使存在有效入口点也强制进行入口点恢复。恢复是启发式的;搜索不成功则保留旧值不变。 |
-ni | 禁用激进的导入重建(默认启用)。 |
-nc | 禁用松散代码转储和哈希(默认启用)。 |
-nep | 禁用入口点恢复和实时入口点哈希,覆盖 -eprec。文件数据库生成仍会收集入口点签名。 |
-reexec | 用于重新运行转储的实验性准备。丢弃部分捕获的状态并假定原始节布局;不会运行转储,也不保证其能正常工作。默认关闭。 |
-nt | 使用一个工作线程,等同于 -t 1。关闭监控仍有单独的监控线程。 |
-t <count> | 设置用于系统转储、数据库生成和关闭监控的工作线程数(默认 16,最小 1)。直接 PID/名称转储保持同步。最后一个 -t/-nt 生效。 |
| 命令 | 描述 |
|---|---|
pd64.exe -db genquick | 从当前正在运行的进程快速构建基线。 |
pd64.exe -system -t 4 -o C:\dumps | 使用四个工作线程将未知模块和松散代码转储到现有输出文件夹。 |
pd64.exe -closemon | 以终止监控模式运行。 |
pd64.exe -pid 0x18A | 从特定进程转储模块和松散代码。 |
pd64.exe -p ".*chrome.*" | 转储名称包含 chrome 的进程。 |
pd64.exe -db gen | 从正在运行的进程和常见文件夹构建更完整的基线。 |
pd64.exe -db add C:\baseline -nr | 从目录添加 PE 文件而不搜索子目录。 |
pd64.exe -pid 0x1a3 -a 0x401000 | 在特定地址转储。如果不存在 PE 头,则生成 32 位和 64 位头。 |
对于恶意软件分析,请使用隔离的实验环境并以管理员身份运行 Process Dump:
pd64.exe -db gen 或 pd64.exe -db genquick 构建干净哈希数据库。pd64.exe -closemon 运行,以便在被挂钩进程终止时捕获它们。pd64.exe -system 转储仍在运行的进程。除非设置了 -o,否则转储会写入工作目录。请妥善保管。转储用于分析,不保证能运行;大于 256 MiB 的映像会被拒绝。
hiddenmodule 而非模块名,表示该模块未在进程中正确注册。codechunk 表示从没有 PE 头的松散可执行区域转储的内容。这些内容会被转储两次,分别重建 x86 和 x64 头。示例文件名:
在 Visual Studio 2019 或 2022(社区版即可)中打开 pd.sln,需安装“使用 C++ 的桌面开发”工作负载和 Windows SDK。为 Win32 或 x64 构建 Release 版本;Release 构建会静态链接运行时。
要从 Visual Studio Developer PowerShell 构建并运行测试:
msbuild pd.sln /m /p:Configuration=Release /p:Platform=x64
.\x64\Release\pd_tests.exe
32 位构建请使用 Platform=Win32。Python 测试可通过 python -m unittest discover -s tests -p "test_*.py" 运行。