目录>>第8章

第8章 压缩与脱壳

第一节 PE文件格式
第二节 认识脱壳
第三节 自动脱壳
第四节 手动脱壳
第五节 脱壳高级篇

第五节 脱壳高级篇

 5、ASProtect保护

 1、ASProtect v0.95保护
 2、ASProtect v0.94b保护
 3、ASProtect v0.9x
 4、ASProtect 1.1x
 5、ASProtect 1.2x
 6、ASProtect 1.3x

3、ASProtect v0.9x保护

Advanced Zip Password Recovery 3.0的脱壳

教程写作: 冰毒
作者信箱: break_ice@hotmail.com
写作日期: 2000年3月25日
版权声明: 本文没有版权,允许任意转贴和修改. 但如果只引用文中部分内容时,请最好注明原文出处,以表示对一位Cracker同行的劳动的尊重.

使用工具:
TRW2000 1.03
ProcDump 1.6.2
Hexworkshop 3.02

下载:Advanced Zip Password Recovery 3.0

比起其Beta版来,AZPR 3.0正式版的保护更为加强. 1. 对Softice的多处Check,用FrogsICE不能完全骗过; 2. CRC的校验; 3. 动态地址(好象是这个名吧?); 4.对Loader的防范,这回用Process Patch不行了.

用Softice跟踪它会是一种痛苦 (当然完全可以用Softice,只是你要了解程序的Anti-debugger技巧,在关键的Check后改变跳转方向). 这次祭出我们中国人的骄傲TRW2000来对付它.

先用Procdump的PE Editor查看一下程序的.idata section记下数值. Virtual size=2000, Virtual offset=21000. 另外,记下程序的Image Base: 400000.

1. 运行TRW, Load程序. 程序中断在入口处. 但接下来无论是否BPX设断只要G继续运行程序,便会出错. 下Faults off, G, OK程序退出.
2. 试BPM 421000 (.idata的offset), 再Load程序. G, 程序可以被正常中断, COOL!
3. G,当程序第三次(? 记不清了. 原则是d 421000显示的data区见到XXXX0200 000000字样)中断时,BD*,F10直到下面的语句

*********************************
注意: 程序每次Load时Offset都不一样,你的机器中的XXXX:YYYYYYYY肯定和下面的不同. 下Code on指令,这样才好参照下面的代码. 另外,下面所摘的几段代码是引用高手tiamath的.因为我不清楚在TRW下如何dump屏幕 (谁能指教一下:);而用ICEDump的pagein n命令来Dump Softice的屏幕,我的机器会死机. :(
*********************************

0167:004F34CD 50         PUSH EAX
0167:004F34CE B890274F00     MOV EAX,004F2790
0167:004F34D3 50         PUSH EAX
0167:004F34D4 B8A4274F00     MOV EAX,004F27A4
0167:004F34D9 50         PUSH EAX
0167:004F34DA B8A0284F00     MOV EAX,004F28A0
0167:004F34DF 50         PUSH EAX
0167:004F34E0 B8AC274F00     MOV EAX,004F27AC
0167:004F34E5 50         PUSH EAX
0167:004F34E6 B8646C4E00     MOV EAX,004E6C64
0167:004F34EB 50         PUSH EAX
0167:004F34EC 8B4508         MOV EAX,[EBP+08]
0167:004F34EF 8D4824         LEA ECX,[EAX+24]
0167:004F34F2 8B4508         MOV EAX,[EBP+08]
0167:004F34F5 8B500C         MOV EDX,[EAX+0C]
0167:004F34F8 8B4508         MOV EAX,[EBP+08]
0167:004F34FB 8B4008         MOV EAX,[EAX+08]
0167:004F34FE E899F4FFFF     CALL 004F299C
0167:004F3503 33C0         XOR EAX,EAX <--在这里Dump .idata

下指令 W 421000 L 2000 azprdata.bin

OK. 再往下,直到

0167:004F3637 8D4818         LEA ECX,[EAX+18]
0167:004F363A 8B4508         MOV EAX,[EBP+08]
0167:004F363D 8B10         MOV EDX,[EAX]
0167:004F363F 8B4508         MOV EAX,[EBP+08]
0167:004F3642 8B401C         MOV EAX,[EAX+1C]
0167:004F3645 E8EAF6FFFF     CALL 004F2D34 <--F8进入
0167:004F364A 5F         POP EDI
0167:004F364B 5E         POP ESI

到了

0167:004F2D72 E9148B1DA8     JMP A86CB88B
0167:004F2D77 8E4F00         MOV CS,[EDI+00]
0167:004F2D7A EB01         JMP 004F2D7D
0167:004F2D7C EB89         JMP 004F2D07
0167:004F2D7E 041C         ADD AL,1C
0167:004F2D80 EB02         JMP 004F2D84
0167:004F2D82 EBE8         JMP 004F2D6C
0167:004F2D84 61         POPAD
0167:004F2D85 EB01         JMP 004F2D88
0167:004F2D87 E850EB02E9     CALL E95218DC
0167:004F2D8C 17         POP SS
0167:004F2D8D E802000000     CALL 004F2D94
0167:004F2D92 E91758C35E     JMP 5F1285AE
0167:004F2D97 5B         POP EBX
0167:004F2D98 59         POP ECX

此时小心地跟踪,碰到JMP时按F8而不要按F10

直到显示变成

0167:004F2D72 E9148B1DA8     JMP A86CB88B
0167:004F2D77 8E4F00         MOV CS,[EDI+00]
0167:004F2D7A EB01         JMP 004F2D7D
0167:004F2D7C EB89         JMP 004F2D07
0167:004F2D7E 041C         ADD AL,1C
0167:004F2D80 EB02         JMP 004F2D84
0167:004F2D82 EBE8         JMP 004F2D6C
0167:004F2D84 61         POPAD
0167:004F2D85 EB01         JMP 004F2D88
0167:004F2D87 E850EB02E9     CALL E95218DC
0167:004F2D8C 17         POP SS
0167:004F2D8D E802000000     CALL 004F2D94
0167:004F2D92 E91758C35E     JMP 5F1285AE
0167:004F2D94 58         POP EAX <-- 光标位于此行时, EAX=401000
0167:004F2D95 C3         RET <--这里

下Suspend指令. 回到Windows. 用ProcDump来Dump(full)脱壳的程序,得到azprdump.exe. 你也可以用TRW的PEDUMP命令来得到脱壳程序,但我个人的经验很容易死机,所以我宁愿用ProcDump来做.

4. 用PE Editor修改程序的Entry Point为1000. 并查看脱壳后程序的.idata section. 此时Raw size=1670, Raw offset=1FC00. 修改Directory中Import Table的RVA=21000,SIZE=1670.
5. 用Hexworkshop打开azprdump.exe和azprdata.bin. Goto到exe文件的1FC00偏移处,Select Block大小为1670. 拷贝.bin文件的同样大小(1670)的Block,粘贴到exe文件中以替换掉不正确的.idata section.

现在,再试着运行程序,应该可以正常运行了. 如果程序出错,再做一件事: 把 .bss section的raw size值改为00000000 (高手tiamath的建议).

有了脱壳的程序,大家应该会Patch它成为注册版了吧. 只需改一个字节.

结语: 用本文所描述的方法,可以对绝大多数Asprotect+Aspack保护的程序进行成功的脱壳. 大家读完这篇教程,不妨找几个程序开刀. 比方说,The Bat! 1.39现在不应该再难住大家了.

好了,这次就到这儿了,下回见.

致谢:

感谢SV, Hobgoblin, tiamath. 没有他们的帮助,我不可能做到这一步.


Copyright © 2000-2001 KanXue Studio All Rights Reserved.