VMProtect是当前最强大的虚拟机保护软件之一,它适用于Windows平台本地编译的目标程序,支持EXE、DLL、SYS。
VMProtect是由俄罗斯人PolyTech开发的,是一个利用伪指令虚拟机的保护软件。经过VMProtect处理的软件,分析难度大大增加。越来越多的软件优先考虑使用VMProtect来保护自己的产品。另外,经过虚拟机的处理,代码执行效率将会降低,因此,一些对效率要求比较高的代码不适合用VMProtect来处理。
VMP保护的导入表会把FF 25 offset (call qword ptr[rip+offset])修改为E8call。
跟进去可以看到先保存了rdi,后面rdi会用于堆栈平衡以及修正返回地址。
然后返回地址也就是+BE081 int 3那一行的地址被保存到rdi。
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 = "<ProcedureName <<"\n";
最后一步retn直接飞向[rsp]也就是刚才计算出的API地址并让最开始push rdi 减少的rsp恢复。
按照这个思路稍加修改甚至可以实现一键脱vmp壳,只要用脚本定位所有api call的地址,修复导入表。
原文作者:看雪论坛 - hzqst
原文链接:https://bbs.pediy.com/thread-248812.htm
转载请注明:转自看雪学院
更多阅读:
网友评论