手动脱ASPack 2.12

来源:互联网 发布:相册源码 无数据库 编辑:程序博客网 时间:2024/06/07 23:33

【文章标题】:手动脱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                          ;这里脱壳
脱壳时重点注意转跳语句附近的代码

--------------------------------------------------
本来想把那程序上传来给菜鸟们更好地练习,但又没有空间,希望大家原谅!
虽然本人不是第一次写这些文章,但仍然写不好,望大家留言指出