您的位置:首页 > 编程语言 > ASP

手动脱ASPack 2.12

2010-02-02 19:26 295 查看
【文章标题】:手动脱ASPack 2.12
【文章作者】:OH.C
【作者 Q Q】:569742950
【作者主页】:http://blog.csdn.net/bllqbz | http://569742950.qzone.qq.com
【使用工具】:OllyDBG | DiE
【操作平台】:Microsoft Windows XP Professional + Service Pack 3
【作者声明】:只是感兴趣,没有其他目的。
【准备工作】:先找一个ASPack 2.12壳的程序(也可以自己用ASPack 2.12对某个程序加壳,效果是一样的)
--------------------------------------------------
【详细过程】
1.程序是Delphi写的,ASPack壳的,就不多说了。用OllyDBG载入程序,OD会提示代码可能被压缩、加密,是否继续分析,我们点“否” (接下来脱壳的过程用到的按键是F4 , F7 , F8 三个,大家注意,在没有特别说明下,一律按F8前进)
004BA001 > 60 PUSHAD ; 光标一开始停在这里,pushad关键字,按F8步过
004BA002 E8 03000000 CALL StHe.004BA00A ;光标停在这里,按F7步入
004BA007 - E9 EB045D45 JMP 45A8A4F7

=====来到地址004BA00A============================
004BA00A 5D POP EBP ; StHe.004BA007
004BA00B 45 INC EBP
004BA00C 55 PUSH EBP
004BA00D C3 RETN ;执行到这里再按F8

=====来到地址004BA008============================
004BA008 /EB 04 JMP SHORT StHe.004BA00E
004BA00A |5D POP EBP
004BA00B |45 INC EBP
004BA00C |55 PUSH EBP
004BA00D |C3 RETN
004BA00E /E8 01000000 CALL StHe.004BA014 ;执行到这里按F7进入

=====来到地址004BA014,一直按F8===================
004BA13C /74 04 JE SHORT StHe.004BA142
004BA13E |43 INC EBX
004BA13F |49 DEC ECX
004BA140 ^|EB EB JMP SHORT StHe.004BA12D ;执行到这里,不要让它跳到004BA12D
004BA142 /8B06 MOV EAX,DWORD PTR DS:[ESI] ;鼠标选择这行,按F4,然后继续F8
004BA144 EB 00 JMP SHORT StHe.004BA146
004BA146 803E 19 CMP BYTE PTR DS:[ESI],19
004BA149 ^ 75 F3 JNZ SHORT StHe.004BA13E ;别让它跳到004BA13E
004BA14B 24 00 AND AL,0 ;选择这行按F4
004BA14D C1C0 18 ROL EAX,18
004BA150 2BC3 SUB EAX,EBX
004BA152 8906 MOV DWORD PTR DS:[ESI],EAX
004BA154 83C3 05 ADD EBX,5
004BA157 83C6 04 ADD ESI,4
004BA15A 83E9 05 SUB ECX,5
004BA15D ^ EB CE JMP SHORT StHe.004BA12D ;别让它跳到004BA12D
004BA15F 5B POP EBX ;选择这行按F4
004BA160 5E POP ESI
004BA161 59 POP ECX
004BA162 58 POP EAX
004BA163 EB 08 JMP SHORT StHe.004BA16D ;这里跳到004BA16D

=====来到地址004BA16D,按F8继续===========
004BA191 FFB5 52010000 PUSH DWORD PTR SS:[EBP+152]
004BA197 FF95 51050000 CALL DWORD PTR SS:[EBP+551] ; kernel32.VirtualFree
004BA19D 83C6 08 ADD ESI,8
004BA1A0 833E 00 CMP DWORD PTR DS:[ESI],0
004BA1A3 ^ 0F85 1EFFFFFF JNZ StHe.004BA0C7 ;别让它跳到004BA0C7
004BA1A9 68 00800000 PUSH 8000 ;按F4,接着继续F8
004BA1AE 6A 00 PUSH 0

=====一直到地址004BA376===================
004BA376 8907 MOV DWORD PTR DS:[EDI],EAX ; ntdll.RtlDeleteCriticalSection
004BA378 8385 49050000 0>ADD DWORD PTR SS:[EBP+549],4
004BA37F ^ E9 32FFFFFF JMP StHe.004BA2B6 ;别让它跳到004BA2B6
004BA384 8906 MOV DWORD PTR DS:[ESI],EAX ;按F4
004BA386 8946 0C MOV DWORD PTR DS:[ESI+C],EAX
004BA389 8946 10 MOV DWORD PTR DS:[ESI+10],EAX
004BA38C 83C6 14 ADD ESI,14
004BA38F 8B95 22040000 MOV EDX,DWORD PTR SS:[EBP+422]
004BA395 ^ E9 EBFEFFFF JMP StHe.004BA285 ;别让它跳到004BA285
004BA39A B8 64DF0900 MOV EAX,9DF64 ;F4
004BA39F 50 PUSH EAX
......中间省略......
004BA3A9 8985 A8030000 MOV DWORD PTR SS:[EBP+3A8],EAX
004BA3AF 61 POPAD
004BA3B0 75 08 JNZ SHORT StHe.004BA3BA
004BA3B2 B8 01000000 MOV EAX,1
004BA3B7 C2 0C00 RETN 0C
004BA3BA 68 64DF4900 PUSH StHe.0049DF64 ; 关键字请注意
004BA3BF C3 RETN ;按F8后到地址0049DF64
=====到地址0049DF64========================
0049DF64 55 PUSH EBP ;停在这里可以脱壳了(在OllyDBG中鼠标右键 --> DUMP_Debugger_process脱壳调试进程 ,点脱壳,然后选择保存位置就可以了)
0049DF65 8BEC MOV EBP,ESP
0049DF67 83C4 F0 ADD ESP,-10
0049DF6A B8 04DD4900 MOV EAX,StHe.0049DD04
0049DF6F E8 5488F6FF CALL StHe.004067C8

用DiE查壳,显示无壳,运行一下看看,能正常运行,说明脱壳成功了

--------------------------------------------------
【经验总结】
1.网上有许多ASPack的脱壳机,可以更快地脱壳。当然如果你喜欢可以尝试用OllyDBG脱壳,锻炼一下自己。
2.在脱壳的过程中,不可走错一步,否则后面无法正常脱壳甚至无法脱壳!
3.不同的程序地址也可能不同,但代码是基本相同的,下面是我分析得到的重点,调试是要注意一下

首先一开始
004BA001 > 60 PUSHAD ; 按F8步过
004BA002 E8 03000000 CALL StHe.004BA00A ;按F7步入
......
004BA00B 45 INC EBP
004BA00C 55 PUSH EBP
004BA00D C3 RETN ;F8
......
004BA00B |45 INC EBP
004BA00C |55 PUSH EBP
004BA00D |C3 RETN
004BA00E /E8 01000000 CALL StHe.004BA014 ;按F7进入
......
004BA13E |43 INC EBX
004BA13F |49 DEC ECX
004BA140 ^|EB EB JMP SHORT StHe.004BA12D
004BA142 /8B06 MOV EAX,DWORD PTR DS:[ESI] ;按F4
004BA144 EB 00 JMP SHORT StHe.004BA146
004BA146 803E 19 CMP BYTE PTR DS:[ESI],19
004BA149 ^ 75 F3 JNZ SHORT StHe.004BA13E
004BA14B 24 00 AND AL,0 ;按F4
......
004BA154 83C3 05 ADD EBX,5
004BA157 83C6 04 ADD ESI,4
004BA15A 83E9 05 SUB ECX,5
004BA15D ^ EB CE JMP SHORT StHe.004BA12D
004BA15F 5B POP EBX ;按F4
......
004BA1A0 833E 00 CMP DWORD PTR DS:[ESI],0
004BA1A3 ^ 0F85 1EFFFFFF JNZ StHe.004BA0C7
004BA1A9 68 00800000 PUSH 8000 ;按F4
......
004BA378 8385 49050000 0>ADD DWORD PTR SS:[EBP+549],4
004BA37F ^ E9 32FFFFFF JMP StHe.004BA2B6
004BA384 8906 MOV DWORD PTR DS:[ESI],EAX ;按F4
......
004BA38C 83C6 14 ADD ESI,14
004BA38F 8B95 22040000 MOV EDX,DWORD PTR SS:[EBP+422]
004BA395 ^ E9 EBFEFFFF JMP StHe.004BA285
004BA39A B8 64DF0900 MOV EAX,9DF64 ;F4
......
004BA3BA 68 64DF4900 PUSH StHe.0049DF64 ; 关键字请注意
004BA3BF C3 RETN ;按F8后到地址0049DF64
......
0049DF64 55 PUSH EBP ;这里脱壳
脱壳时重点注意转跳语句附近的代码

--------------------------------------------------
本来想把那程序上传来给菜鸟们更好地练习,但又没有空间,希望大家原谅!
虽然本人不是第一次写这些文章,但仍然写不好,望大家留言指出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: