
一个动态VMP转储和导入修复工具,基于VTIL。适用于VMProtect 3.X x64。

VMPDump.exe <Target PID> "<Target Module>" [-ep=<Entry Point RVA>] [-disable-reloc]
参数:
<Target PID>:目标进程的ID,十进制或十六进制形式。<Target Module>:要转储和修复的模块名称。如果希望使用进程映像模块,可以传入空字符串("")。[-ep=<Entry Point RVA>]:可选提供的入口点RVA,十六进制形式。VMPDump将用此值覆盖可选头中的入口点。[-disable-reloc]:可选设置,指示VMPDump在输出映像中标记重定位已被剥离,强制映像加载到转储的ImageBase。如果需要可运行的转储,这很有用。在运行VMPDump之前,目标进程中的VMProtect初始化和解包必须完成。这意味着它必须达到或超过OEP(原始入口点)。
转储并修复后的映像将出现在进程映像模块目录中,名称为 <Target Module Name>.VMPDump.<Target Module Extension>。
VMProtect为每个导入调用或跳转注入存根。这些存根解析 .vmpX 节中的'混淆'thunk,并添加一个固定常量来'去混淆'它。然后调用或跳转本身通过ret指令分发。
VMPDump扫描所有可执行节以查找这些存根,并使用VTIL x64提升器将它们提升到VTIL。然后对这些存根进行分析,以确定必须替换哪种调用以及必须覆盖哪些字节。
一旦检索到所有调用,VMPDump就会创建一个新的导入表,并将thunk附加到现有的IAT中。对VMP导入存根的调用将被替换为对这些thunk的直接调用。
请注意,在变异例程中,有时没有足够的字节来用直接thunk调用替换VMP导入存根调用,因为后者大1个字节。在这种情况下,节被扩展,并注入一个跳转到导入thunk的存根。然后,VMP导入存根调用被替换为一个5字节的相对调用或跳转到该注入存根。
mkdir build && cd build
cmake -G "Visual Studio 16 2019" ..
cmake --build . --config Release
在VS中构建只需在vcxproj中将包含/库目录替换为VTIL-NativeLifers/VTIL-Core/Keystone/Capstone即可。 该项目需要C++20。
由于代码节是线性扫描的,特别是在高度变异和混淆的代码中,一些导入存根调用可能会被跳过而无法解析。不过,VMPDump包含了对大多数VMProtect变异不一致性的解决方法,因此即使在高度变异的代码中也能产生不错的结果。 如果遇到此问题,请提交包含相关信息的issue,我会查看。
根据GPL-3.0许可证授权。不提供任何形式的保证。