本文应该算作个人学习VMP保护的笔记,所以内容较为空泛。详细的VMP虚拟保护壳的学习可以参考文末的参考资料。

0x01 外层壳保护

使用VMProtect保护后的程序添加了两个新节区

壳代码也是虚拟化过的

image-20211230185633948

寻找OEP的方法

  1. 通过对ZwProtectVirtualMemory下断,观察栈顶
  2. 对代码节下硬件执行断点(感觉略鸡肋,得知道原始函数在大致哪个范围
  3. 对mainCRTstartup内使用的一些API下断点(IsProcessorFeaturePresent, GetSystemTimeAsFileTime),然后回溯找到OEP

修复IAT表

虽然能看到程序使用了哪些API,却不能通过交叉引用来静态分析,因为VMP保护后的程序导入地址是运行时动态计算的

image-20211230211131287

参考源哥用Unicorn还原IAT表的文章

image-20211230213959428

mov     ebx, offset byte_407DD1
mov     ebx, [ebx+198694h]
lea     ebx, [ebx+44C25846h]
xchg    ebx, [esp+0]
retn
[407DD1 + 198694] + 44C25846 = IAT(MessageBoxW)

image-20211231104400935

0x02 代码混淆引擎

代码混淆引起所使用的指令都是不常见的指令,我们可以一眼就识别出来比如 rcr,bt,btc,sbb,lahf等。

image-20220102150822685

code2

block

0x03 虚拟化引擎

这一部分比较复杂,我主要参考的是这篇文章

0x04 参考资料

关于unicorn去搞VMP的iat那点事

Quick look around VMP 3.x

VMP导入表修复

(VMProtect 分析)跟着ida和WinDbg逛VirtualMachine

VM保护攻防

标签: VMP

添加新评论