好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 yangand 于 2011-9-23 20:32 编辑
Asprotect的壳可以用脚本秒脱,本文旨在讨论一下脱壳的方法。
之前看过天草老师讲的ACPROTECT的另类脱壳,之前是看学破解,脱壳的知识基本上看不懂,最近两天又学了一下ACPROTECT的脱壳,有一个也是壳王徐超大牛讲的ACPROTECT的另类脱壳教程,论坛里可以下到,就是那个《脱壳教程27课》。讲的是如何用巧妙的方法如果不用寻找STOLEN CODE,就能完美脱壳。估计大多数人都看过,没看过的,可以在动画发布区搜一下。估计他还有比这27课多的教程,没有被发出来。希望能得到超哥更多的教程。
本人脱壳方面,也是菜鸟,这个方法也是试出来的,我也不知道为什么这样,大体估计也就是那个最佳脱壳时机的理论吧。
依据就是想像,ACPROTEC和ASPROTECT都能用最后一次异常脱壳,另类的方法,估计也能行,结果是真能行。
先大至说一下ACPROTECT另类脱壳的方法。
第一步,通过最后一次异常法找到假的OEP,并记下来。
第二步,通过ESP定律找到最佳脱壳时机,然后DUMP再修复就可以了。
如果不理解上面的方法,请看一下超哥的教程。
下面详细说一下。
OD载入程序,入口处为:
00401000 > 68 01C06D00 push SoWorker.006DC001
00401005 E8 01000000 call SoWorker.0040100B
0040100A C3 retn
0040100B C3 retn
0040100C 74 23 je short SoWorker.00401031
0040100E C039 74 sar byte ptr ds:[ecx],74
00401011 0FD19CA4 0599E0>psrlw mm3,qword ptr ss:[esp+CFE09905]
00401019 AA stos byte ptr es:[edi]
0040101A B5 CC mov ch,0CC
F7单步几步,找到PUSHAD(ESP是最简单的,能用ESP就最好了)
006DC001 60 pushad
006DC002 E8 03000000 call SoWorker.006DC00A
006DC007 - E9 EB045D45 jmp 45CAC4F7
006DC00C 55 push ebp
006DC00D C3 retn
006DC00E E8 01000000 call SoWorker.006DC014
006DC013 EB 5D jmp short SoWorker.006DC072
在006DC002 处下ESP硬件断点
下面找最后一次异常处和OEP的地方。
最后一次异常,可以用OD的异常记数器插件,这样既快又准。
最后一次异常停在
014239EC 3100 xor dword ptr ds:[eax],eax
014239EE 64:8F05 0000000>pop dword ptr fs:[0]
014239F5 58 pop eax
014239F6 833D B07E4201 0>cmp dword ptr ds:[1427EB0],0
014239FD 74 14 je short 01423A13
014239FF 6A 0C push 0C
01423A01 B9 B07E4201 mov ecx,1427EB0
01423A06 8D45 F8 lea eax,dword ptr ss:[ebp-8]
01423A09 BA 04000000 mov edx,4
01423A0E E8 2DD1FFFF call 01420B40
01423A13 FF75 FC push dword ptr ss:[ebp-4]
01423A16 FF75 F8 push dword ptr ss:[ebp-8]
01423A19 8B45 F4 mov eax,dword ptr ss:[ebp-C]
01423A1C 8338 00 cmp dword ptr ds:[eax],0
01423A1F 74 02 je short 01423A23
01423A21 FF30 push dword ptr ds:[eax]
01423A23 FF75 F0 push dword ptr ss:[ebp-10]
01423A26 FF75 EC push dword ptr ss:[ebp-14]
01423A29 C3 retn
打开内存镜像窗口,
在00401000代码代下内在断点,SHIFT+F9,程序停在了假的OEP处。
004F27CF FF15 9CC25200 call dword ptr ds:[52C29C]
004F27D5 33D2 xor edx,edx
004F27D7 8AD4 mov dl,ah
004F27D9 8915 34306900 mov dword ptr ds:[693034],edx
004F27DF 8BC8 mov ecx,eax
004F27E1 81E1 FF000000 and ecx,0FF
004F27E7 890D 30306900 mov dword ptr ds:[693030],ecx
004F27ED C1E1 08 shl ecx,8
004F27F0 03CA add ecx,edx
004F27F2 890D 2C306900 mov dword ptr ds:[69302C],ecx
004F27F8 C1E8 10 shr eax,10
004F27FB A3 28306900 mov dword ptr ds:[693028],eax
004F2800 6A 01 push 1
004F2802 E8 933B0000 call SoWorker.004F639A
004F2807 59 pop ecx
004F2808 85C0 test eax,eax
004F280A 75 08 jnz short SoWorker.004F2814
004F280C 6A 1C push 1C
记下假的OEP的位置,呆会用得到。(OEP: 004F27CF)
重新运行程序,最后一次异常法来到最后一次异常的地方。
上面有代码,就不在帖了,在01423A29处F2下好断点, SHIFT+F9,停在01423A29,
再次下SHIFT+F9,停在下面的代码处。为什么会停在这里?如果你还记得当时下了ESP的断点,就应该知道为什么了。
016E5827 /26:EB 01 jmp short 016E582B
016E582A |C7 ??? ; 未知命令
016E582B \EB 02 jmp short 016E582F
016E582D CD20 83EC372E vxdjump 2E37EC83
016E5833 EB 01 jmp short 016E5836
016E5835 - E9 8D642479 jmp 7A92BCC7
016E583A 64:EB 01 jmp short 016E583E
016E583D 9A 8D640CBA 2BE>call far E12B:BA0C648D
016E5844 EB 01 jmp short 016E5847
这里就是最佳脱壳时机,在这里有LOADPE 把他DUMP出来,然后再请出IMPORTREC,选上进程,开始修得IAT。这里要注意一下。 IMPORTREC的OEP,要填上前面记下来的假的OEP。然后点自动查找IAT,这时个会有些无效的指针,先用等级一修复,之后再用插件修复一下,再转存一下就OK了。
unpack me.rar
(1.74 MB, 下载次数: 694)
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|