http://hi.baidu.com/ximo2006/blog/item/ee78110342cf621f1c9583a0.html
以前也写过处理VMP antidump方法的文章,当时用强制修改vm_jmp的方法来解决的,需要对VM有一定的了解,并且还要手动patch,可能比较麻烦,而且还有副作用,就是VM的内存随机效验,当然内存效验可能通过vm_rdtsc来解决。现在就介绍个用补区段的方法来解决,不需要再patch代码,从而省去了patch代码,效验等诸多麻烦。
本文只讲述对付heap antidump,其他的,比如寻找OEP,IAT跨平台,CPUID antidump等就不再赘述。
1.bp LocalAlloc+2
断下后,ATL+F9,记下当前的EIP
//返回到这里
00554D85 55 push ebp
00554D86 59 pop ecx
00554D87 8B4D FC mov ecx,dword ptr ss:[ebp-4]
00554D8A E8 A9D4FFFF call UnpackME.00552238
00554D8F 9C pushfd
00554D90 8F4424 28 pop dword ptr ss:[esp+28]
00554D94 9C pushfd
此时,eax中保存的值,即为保存antidump数据的地方。由于地址小于文件的基址,因为不好补区段,所以,我们得申请个新的空间,为了方便我们补区段。
用插件申请段新空间,或者找个空白区,新建EIP,patch如下代码:
00B70000 60 pushad
00B70001 6A 40 push 40
00B70003 68 00300000 push 3000
00B70008 68 00100000 push 1000
00B7000D 6A 00 push 0
00B7000F E8 4D9AC97B call kernel32.VirtualAlloc
00B70014 3D 00004000 cmp eax,400000
00B70019 ^ 72 E6 jb short 00B70001
00B7001B 61 popad
00B7001C 90 nop
00B7001D 90 nop
bp 00B7001B,F9运行后,记下eax的值 = 00B80000,走过popad后,修改eax的值为00b80000
然后,定位到原来的EIP处
00554D85 55 push ebp
新建EIP。
然后,就用以前的方法,到达OEP。
接下来做的,就是dump,然后,自定义dump,dump出00b80000,大小为1000的区段。
在dump出的文件中,补上这段区段,最后重建PE,完工。
做个简单的视频演示,画质不大好,凑合着看吧。