手动分析VMP加密的x64驱动导入表

手动分析VMP加密的x64驱动导入表_第1张图片

VMProtect是当前最强大的虚拟机保护软件之一,它适用于Windows平台本地编译的目标程序,支持EXE、DLL、SYS。

VMProtect是由俄罗斯人PolyTech开发的,是一个利用伪指令虚拟机的保护软件。经过VMProtect处理的软件,分析难度大大增加。越来越多的软件优先考虑使用VMProtect来保护自己的产品。另外,经过虚拟机的处理,代码执行效率将会降低,因此,一些对效率要求比较高的代码不适合用VMProtect来处理。

手动分析VMP加密的x64驱动导入表_第2张图片

VMP保护的导入表会把FF 25 offset (call qword ptr[rip+offset])修改为E8call。

手动分析VMP加密的x64驱动导入表_第3张图片

跟进去可以看到先保存了rdi,后面rdi会用于堆栈平衡以及修正返回地址。

然后返回地址也就是+BE081  int  3那一行的地址被保存到rdi。

手动分析VMP加密的x64驱动导入表_第4张图片

rdi被加一之后又填充回返回地址,也就是让返回地址跳过int 3指向正确的BE082 test eax,  eax那一行。

这几步相当于解密导入函数地址,从[imagebase+37DF6+14B606] + 3DDC1A68处取出函数地址放入[rsp]中。

我们用模拟器验证一下。

[imagebase+37DF6+14B606] +3DDC1A68 确实= fffff800007165c8=RtlGetVersion

uint64_tRtlGetVersion_import =0;

uc_mem_read(ctx.m_uc, ctx.m_ImageBase +0x37DF6+0x14B606, &RtlGetVersion_import,8);

RtlGetVersion_import +=0x3DDC1A68;

std::wstring RtlGetVersion_importfrom;

FakeAPI_t *RtlGetVersion_importapi =NULL;

if(ctx.FindAPIByAddress(RtlGetVersion_import, RtlGetVersion_importfrom, &RtlGetVersion_importapi))

*outs <<"[ ctx.m_ImageBase + 0x37DF6 + 0x14B606]+0x3DDC1A68 = "

手动分析VMP加密的x64驱动导入表_第5张图片

最后一步retn直接飞向[rsp]也就是刚才计算出的API地址并让最开始push rdi 减少的rsp恢复。

按照这个思路稍加修改甚至可以实现一键脱vmp壳,只要用脚本定位所有api call的地址,修复导入表。


原文作者:看雪论坛 - hzqst

原文链接:https://bbs.pediy.com/thread-248812.htm

转载请注明:转自看雪学院



更多阅读:

在 VS2017 使用所有旧版本的平台工具集

支持Windows7 x64的kdusb3

手写fuzzer实现anti-debugging趣味实验 XD

编译libc.so过time函数反调试

你可能感兴趣的:(手动分析VMP加密的x64驱动导入表)