xxFURYWOLFxx/veh-dumper
GitHub: xxFURYWOLFxx/veh-dumper
一个可注入的 x64 DLL 工具,用于枚举目标进程中的向量化异常处理程序并将每个处理程序精准转储为可在 IDA 中直接分析的独立 PE64 文件。
Stars: 13 | Forks: 3
# veh-dumper
可注入的 x64 DLL,用于枚举目标进程中所有已注册的 `VectoredExceptionHandler`
(以及 `VectoredContinueHandler`),并将每一个处理程序作为独立的
合成 PE 转储出来,可直接用 IDA 打开。
这不是一个“转储整个模块”的工具。对于每个处理程序,它会精准提取:
- 处理程序函数自身的字节,在可用时通过 `RtlLookupFunctionEntry` unwind 信息提取,
否则使用 `C3`+ 填充的启发式扫描
- 代码执行的每一个 RIP 相对引用,均解析为该指令实际加载的精确字节数
(对于 `mov r64` 是 8,对于 XMM 是 16,对于 `mov r32` 是 4,对于被
视为指针采样的 `lea` 是 64)
- 每一个直接被调用者的函数字节(深度受限的 BFS)
- 每一个间接调用的 IAT 槽以及该槽指向的代码
系统模块的被调用者(`C:\Windows\` 下的任何内容)不会被转储。它们的
导出名称将被解析并作为导出目录条目发送到
合成 PE 上,因此 IDA 会渲染为 `call cs:kernel32_dll_IsDebuggerPresent` 而不是
`call cs:qword_XXX`。
## 输出
写入到磁盘上被注入 DLL 的同级目录下:
```
\vehdump\veh_dump.log master log
\vehdump\VEH_00\dump.dll handler #0 as a PE64 IDA can open
\vehdump\VEH_00\info.txt region list + resolved imports
\vehdump\VEH_01\dump.dll handler #1
...
\vehdump\VCH_00\dump.dll continue handlers, same shape
```
在 IDA 中通过 `File > Open` 打开 `dump.dll`。IDA 会自动检测 PE64,将其
每个节加载到其实时的 VA,并通过
`AddressOfEntryPoint` 跳转到处理程序函数。处理程序内部的每个 RIP 相对加载都会解析为
存在于 PE 中正确地址处的字节。
## 构建
在 Visual Studio 2022 中打开 `veh-dumper.sln` 并构建 `Release|x64`。输出
文件位于 `veh-dumper\bin\veh-dumper.dll`。需要 C++23(带有
`/std:c++latest` 的 v143 工具集)。
## 注入
任何 DLL 注入器都可以。Manual-map、LoadLibrary、SetWindowsHookExA
(该 DLL 为经典的 hook 注入约定导出了 `NextHook`)。没有
参数解析,也没有配置文件。该 DLL 会在
`DLL_PROCESS_ATTACH` 时启动一个工作线程,等待 500 毫秒让宿主完成加载,然后进行转储。
## 它如何遍历 VEH 列表
`RtlAddVectoredExceptionHandler` 会注册一个落脚点处理程序,然后 Windows 返回的
入口将作为内部双向链表的头节点被跟踪。
每个节点的编码处理程序指针都会通过 `RtlDecodePointer` 传递,以
恢复真实的函数 VA。节点内部的处理程序偏移量
(在 Win10/11 上为 0x10..0x28)是通过往返测试
落脚点动态发现的:无论哪个偏移量解码后是落脚点本身的地址,它就是
此 Windows 版本的处理程序槽。
## 兼容性
已在 Windows 11 25H2 上测试。VEH 列表节点内部的处理程序偏移量是
动态发现的(非硬编码),因此它应该适用于其他 x64
Windows 版本,但目前仅验证了 25H2。
## 限制
进行了限制,以免失控的处理程序导致崩溃:
- 最大函数大小:32 KB (`k_max_func_size`)
- 每个处理程序的最大块数:128 (`k_max_chunks`)
- 每个处理程序的最大总字节数:1 MB (`k_max_total_bytes`)
- 最大 BFS 深度:2 (`k_max_call_depth`),足以遍历 IAT thunk
- 最大排队工作项:512 (`k_max_queue`)
如果需要更深度的覆盖,请在 `dumper.hpp` 中调大这些常量。
## 许可证
MIT。
标签:DLL注入, PE解析, VEH异常处理, x64, 云资产清单, 内存Dump, 流量审计, 端点可见性, 逆向工程