手动分析VMP加密的x64驱动导入表
VMProtect是当前最强大的虚拟机保护软件之一,它适用于Windows平台本地编译的目标程序,支持EXE、DLL、SYS。
VMProtect是由俄罗斯人PolyTech开发的,是一个利用伪指令虚拟机的保护软件。经过VMProtect处理的软件,分析难度大大增加。越来越多的软件优先考虑使用VMProtect来保护自己的产品。另外,经过虚拟机的处理,代码执行效率将会降低,因此,一些对效率要求比较高的代码不适合用VMProtect来处理。
VMP保护的导入表会把FF 25 offset (call qword ptr[rip+offset])修改为E8 call。
跟进去可以看到先保存了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_t RtlGetVersion_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 = " << std::hex << RtlGetVersion_import << "name: " << RtlGetVersion_importapi->ProcedureName << "\n";
最后一步retn直接飞向[rsp]也就是刚才计算出的API地址并让最开始push rdi 减少的rsp恢复。
按照这个思路稍加修改甚至可以实现一键脱vmp壳,只要用脚本定位所有api call的地址,修复导入表。
- End -
看雪ID: hzqst
https://bbs.pediy.com/user-619065.htm
本文由看雪论坛 hzqst 原创
转载请注明来自看雪社区
长按识别下方图中的二维码,为Ta投票!
热门图书推荐:
热门技术文章:
公众号ID:ikanxue
官方微博:看雪安全
商务合作:wsc@kanxue.com