VMP2.0版本带壳调试教程

样本MD5:297DE74CB20A975EFAF20CD88FDDF270

在逆向分析时遇到VMP壳总是令人头疼,因为要源文件完美地从VMP壳中脱出来非常的困难。相比于VMP完美脱壳,带壳调试要简单许多,而且已经能满足调试分析的需求了,VMP分1.0、2.0、3.0,2.0,现在市面上较多见的是2.0,调试方法也较简单,下面我们就来讲解下如何带壳调试VMP2.0。

使用查壳工具可以得知样本加的是VMP2.0.7版本的壳,小本版之间的脱壳方法都一样,以下方法v2.0.X都适用。
VMP2.0版本带壳调试教程_第1张图片
OD打开样本后,按下Ctrl+G跳转到VirtualProtect函数的位置。
VMP2.0版本带壳调试教程_第2张图片

在VirtualProtect的起始处(0x7C801AD4)下断点,然后开始按F9,程序会多次停在断点处,在此期间要注意观察右下方红框中的NewProtect的值。
VMP2.0版本带壳调试教程_第3张图片

当NewProtect的值变为PAG_READONLY时,样本的代码已经全部解密出来了,我们停止按F9。
VMP2.0版本带壳调试教程_第4张图片

解密出代码后,就要开始寻找OEP了,首先我们来到程序的代码起始处0x401000(每个程序的代码起始处不一样),右键->分析->从模块中删除分析,让代码更直观。
VMP2.0版本带壳调试教程_第5张图片

做完以上操作后,代码已经显示出来了,接下来我们就要通过搜索入口点字节码来找OEP,每种编译器的初始字节码是不一样的,具体可以百度。我这个样本用查壳工具可以得知是VC编译的。
VMP2.0版本带壳调试教程_第6张图片

VC编译出来的程序入口点的字节码为:push ebp move ebp,esp,所以我按下Ctrl+S搜索该汇编码以寻找入口点。搜到的第一个地址为0x401560,虽然这个入口点字节码匹配,但我们看图中两个箭头,这两个地方都是代码结束点,我们想程序主函数不应该那么短吧,所以这应该是个函数,还不是OEP,所以我们继续往下找。
VMP2.0版本带壳调试教程_第7张图片

搜到了0x401610,也是没多久又retn了,估计又是个函数,不是OEP,接着找。
VMP2.0版本带壳调试教程_第8张图片

终于来到了一个没那么短的代码段,而且箭头中有许多敏感的字符串,这个应该就是我们要找的OEP,在0x4016C0处右键->断点->硬件执行,就能给OEP下硬件断点了。
VMP2.0版本带壳调试教程_第9张图片

重新加载程序,取消掉之前VirutalProtect的断点,按下F9,就来到了OEP的位置,接下来可以开始调试了。
VMP2.0版本带壳调试教程_第10张图片

你可能感兴趣的:(恶意软件分析,VMP,脱壳)