VMP脱壳后antidump的处理及再谈简单的爆破(带视频)
本帖最后由 ximo 于 2010-10-15 22:10 编辑VMP脱壳后,有个antidump,也就是说,加了VMP外壳后,又VM掉了某关键代码后,脱壳后,就得处理antidump部分,不然程序会出错。
下面就简单的说下我个人的处理方法,当然,方法很多,我能力有限,只会这种垃圾的方法。当然比补区段要看点,补区段实在是不得已而为止的方法。
脱壳部分就不说了,可以直接看视频,就直接去看antidump部分。
关键是寻找2条handler,来看下这2条handler吧。
VM_Add32:
0040DD86 Main rol ax,cl
0040DD89 Main mov eax,dword ptr ss: ; EAX=35881B1A
0040DD8C Main cmp dx,ax
0040DD8F Main add dword ptr ss:,eax
0040DD92 Main jmp dumped.0040B070
0040B070 Main call dumped.0040C730
0040C730 Main pushad
0040C731 Main pushfd
0040C732 Main pop dword ptr ss:
0040C736 Main pushfd
0040C737 Main jmp dumped.0040DCBA
0040DCBA Main jmp dumped.0040C71C
0040C71C Main push dword ptr ss:
0040C720 Main pop dword ptr ss:
0040C723 Main mov byte ptr ss:,bl
0040C727 Main lea esp,dword ptr ss:
0040C72B Main jmp dumped.0040CD43
0040CD43 Main setge dh ; EDX=00400186
0040CD46 Main jmp dumped.0040DC1E
0040DC1E Main pushad
VM_SetEip:
0040BC90 Main movsx si,cl ; ESI=00410004
0040BC94 Main jmp dumped.0040DA71
0040DA71 Main mov esi,dword ptr ss: ; ESI=0040E5DE
0040DA74 Main call dumped.0040DC69
0040DC69 Main test bl,0AE
0040DC6C Main bt sp,9
0040DC71 Main mov byte ptr ss:,ch
0040DC74 Main add ebp,4 ; EBP=0012FA38
0040DC77 Main pushad
0040DC78 Main pushfd
0040DC79 Main push 8116F71
0040DC7E Main pushfd
0040DC7F Main lea esp,dword ptr ss:
0040DC83 Main jmp dumped.0040CD27
0040CD27 Main bsr dx,ax ; EDX=00400000
0040CD2B Main rcr bl,4 ; EBX=8D43C6EB
0040CD2E Main inc bl ; EBX=8D43C6EC
0040CD30 Main sal bl,4 ; EBX=8D43C6C0
0040CD33 Main mov ebx,esi ; EBX=0040E5DE
0040CD35 Main push edx
0040CD36 Main rcl dx,cl
0040CD39 Main cmp cl,3D
0040CD3C Main add esi,dword ptr ss:
0040CD3F Main lea esp,dword ptr ss:
0040CD43 Main setge dh ; EDX=00400100
0040CD46 Main jmp dumped.0040DC1E
0040DC1E Main pushad
......后半段了,省略
0040DC1F Main mov al,byte ptr ds: ; EAX=00000016
然后,在2句关键的代码处下好断点:
1.0040DD8F Main add dword ptr ss:,eax
2.0040DA71 Main mov esi,dword ptr ss: ; ESI=0040E5DE
下好断点后,跑下面的脚本,主要是为了记录eax和esi的值:
var teax
var tesi
var logfile
var info
mov logfile,"log.txt"
loop:
run
cmp eip,0040da71
je Exit
mov teax,eax
mov tesi,esi
eval "eax:{teax} esi:{tesi}"
mov info,$RESULT
wrta logfile,info
jmp loop
Exit:
ret
跑完脚本后,看日志,一般就是最后的2,3行,如:
eax:CC59F905 esi:410EBE
eax:0 esi:410EB8
eax:154F78 esi:410E89
其中eax:0 esi:410EB8就是关键了。
所以,修改的方法呼之欲出,
在0040DD8F Main add dword ptr ss:,eax
下好断点,当esi==410EB8,修改eax的值为4即可。
可以修改的方法时,原来eax==4,则修改为0,原来eax==0,则修改为4
下面就是如何patch了,怎么patch,自由发挥。
其实这就是修改VM的跳转流程的一种方法,爆破VM的程序时,也可以如此修改,如拿上个爆破的程序为例:
看下日志:
vm.eip:4107C4 handle:40D74B VM_Add32 vm.stack:0 //关键
vm.eip:4107C5 handle:40C1EE VM_SetR32_Reg_0 vm.stack:206
vm.eip:4107C6 handle:40D37F VM_RmSs32 vm.stack:12FF78
vm.eip:4107C7 handle:40C1EE VM_SetR32_Reg_30 vm.stack:5C059AFD
vm.eip:4107C8 handle:40C1EE VM_SetR32_Reg_2C vm.stack:5C059AFD
vm.eip:4107C9 handle:40C1EE VM_SetR32_Reg_28 vm.stack:5C05BA25
vm.eip:4107CA handle:40D672 VM_GetR32 vm.stack:1E240
vm.eip:4107CB handle:40DA5A VM_GetEsp vm.stack:5C059AFD
vm.eip:4107CC handle:40D37F VM_RmSs32 vm.stack:12FF7C
vm.eip:4107CD handle:40C1EE VM_SetR32_Reg_14 vm.stack:5C059AFD
vm.eip:4107CE handle:40DA5A VM_GetEsp vm.stack:5C059AFD
vm.eip:4107CF handle:40D37F VM_RmSs32 vm.stack:12FF7C
vm.eip:4107D0 handle:40D125 VM_Nor32 vm.stack:5C059AFD
vm.eip:4107D1 handle:40C1EE VM_SetR32_Reg_30 vm.stack:282
vm.eip:4107D2 handle:40CCF8 VM_GetI32 vm.stack:A3FA6502
vm.eip:4107D7 handle:40D125 VM_Nor32 vm.stack:A3BA9816
vm.eip:4107D8 handle:40C1EE VM_SetR32_Reg_28 vm.stack:202
vm.eip:4107D9 handle:40D672 VM_GetR32 vm.stack:5C0502E9
vm.eip:4107DA handle:40CCF8 VM_GetI32 vm.stack:5C059AFD
vm.eip:4107DF handle:40D125 VM_Nor32 vm.stack:5C4567E9
vm.eip:4107E0 handle:40C1EE VM_SetR32_Reg_28 vm.stack:282
vm.eip:4107E1 handle:40D125 VM_Nor32 vm.stack:A3BA0002
vm.eip:4107E2 handle:40C1EE VM_SetR32_Reg_2C vm.stack:206
vm.eip:4107E3 handle:40C1EE VM_SetR32_Reg_30 vm.stack:40FD14
vm.eip:4107E4 handle:40D672 VM_GetR32 vm.stack:1E240
vm.eip:4107E5 handle:40D672 VM_GetR32 vm.stack:7FFD7000
vm.eip:4107E6 handle:40D672 VM_GetR32 vm.stack:206
vm.eip:4107E7 handle:40D672 VM_GetR32 vm.stack:1E240
vm.eip:4107E8 handle:40D672 VM_GetR32 vm.stack:12B948
vm.eip:4107E9 handle:40D672 VM_GetR32 vm.stack:216
vm.eip:4107EA handle:40D672 VM_GetR32 vm.stack:408050
vm.eip:4107EB handle:40D672 VM_GetR32 vm.stack:12BA34
vm.eip:4107EC handle:40D672 VM_GetR32 vm.stack:12FFC0
vm.eip:4107ED handle:40D672 VM_GetR32 vm.stack:7FFD7000
vm.eip:4107EE handle:40D672 VM_GetR32 vm.stack:12BA34
vm.eip:4107EF handle:40CCF8 VM_GetI32 vm.stack:408050
vm.eip:4107F4 handle:40D672 VM_GetR32 vm.stack:1DEBB337
vm.eip:4107F5 handle:40D74B VM_Add32 vm.stack:E2144CC9
vm.eip:4107F6 handle:40C1EE VM_SetR32_Reg_34 vm.stack:257
vm.eip:4107F7 handle:40D672 VM_GetR32 vm.stack:0
vm.eip:4107F8 handle:40D672 VM_GetR32 vm.stack:0
vm.eip:4107F9 handle:40CE19 VM_SetEip vm.stack:40FD14 //跳转
于是,在vm.eip:4107C4 handle:40D74B VM_Add32 vm.stack:0 //关键
这关键的地方下好断点,当esi==4107C4时,修改eax的值即可,方法跟刚才一样,就是0跟4的互换。
做了个简单的视频演示,大家大致看看吧。
http://u.115.com/file/t094e926cd
技术比较菜,可能错误很多,请高手多多指出,谢谢。
ximo
LCG:http://www.52pojie.net
DFJG:http://www.80dfj.org 第一时间来学习 我来啦~很好很强大~ 特来膜拜军师大人! 加精置顶下. 很好很强大............. 恩 这个要看下 貌似 挺强大 学习了,这年头愿意分享的人少了! 十分好,十分强大~!