标题:手动脱壳入门第五篇Aspack2.12

-------------------------------------------------------------------------------------------------------------------------------

时间:2006/8/28 17:10:34

-------------------------------------------------------------------------------------------------------------------------------

内容:

xTiNt
 手动脱壳入门第五篇Aspack2.12  
手动脱壳入门第五篇Aspack2.12
【脱文标题】 手动脱壳入门第五篇Aspack2.12
【脱文作者】 weiyi75[Dfcg] 
【作者邮箱】 weiyi75@sohu.com 
【作者主页】 Dfcg官方大本营 
【使用工具】 Peid,Ollydbg
【脱壳平台】 Win2K/XP
【软件名称】 Ascii 查询专家
【软件简介】 Aspack 2.12加壳的Ascii 查询专家
【软件大小】 5.35K
【加壳方式】 ASPack 2.12 -> Alexey Solodovnikov
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享: 
好,我们这次脱Aspack2.12的壳看看它的特性。
本地下载
首先必须的工具要准备好,
附件中壳为PEiD查壳为ASPack 2.12 -> Alexey Solodovnikov
手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不
能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。
用OD载入程序后。
确定一个入口警告,OD提示软件可能有自解压或自修改功能,当然,因为它加了壳。
停在这里
00406001 > 60 PUSHAD 我们先记住Aspack壳的加壳入口第一句是PUSHAD
00406002 E8 03000000 CALL ex2.0040600A 必须F7进入,不然跑飞。很近的Call用F7
0040600A 5D POP EBP ; ex2.00406007
0040600B 45 INC EBP
0040600C 55 PUSH EBP
0040600D C3 RETN
00406008 /EB 04 JMP SHORT ex2.0040600E 
0040600A |5D POP EBP
0040600B |45 INC EBP
0040600C |55 PUSH EBP
0040600D |C3 RETN
0040600E E8 01000000 CALL ex2.00406014 一看就应用F7过,变形的Jmp
00406013 EB 5D JMP SHORT ex2.00406072
00406014 5D POP EBP ; ex2.00406013
00406015 BB EDFFFFFF MOV EBX,-13
0040601A 03DD ADD EBX,EBP
0040601C 81EB 00600000 SUB EBX,6000
00406022 83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0
00406029 899D 22040000 MOV DWORD PTR SS:[EBP+422],EBX
0040602F 0F85 65030000 JNZ ex2.0040639A
0040603C FF95 4D0F0000 CALL DWORD PTR SS:[EBP+F4D] ; kernel32.GetModuleHandleA
00406042 8985 26040000 MOV DWORD PTR SS:[EBP+426],EAX
00406048 8BF8 MOV EDI,EAX
0040604A 8D5D 5E LEA EBX,DWORD PTR SS:[EBP+5E]
0040604D 53 PUSH EBX
0040604E 50 PUSH EAX
0040604F FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress
00406055 8985 4D050000 MOV DWORD PTR SS:[EBP+54D],EAX
0040605B 8D5D 6B LEA EBX,DWORD PTR SS:[EBP+6B]
0040605E 53 PUSH EBX
0040605F 57 PUSH EDI
00406060 FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress
00406066 8985 51050000 MOV DWORD PTR SS:[EBP+551],EAX
0040606C 8D45 77 LEA EAX,DWORD PTR SS:[EBP+77]
0040606F FFE0 JMP EAX 跳走。
0040608A 8B9D 31050000 MOV EBX,DWORD PTR SS:[EBP+531] 到这里。
00406090 0BDB OR EBX,EBX
00406092 74 0A JE SHORT ex2.0040609E 
00406094 8B03 MOV EAX,DWORD PTR DS:[EBX]
.....................................................
004060F9 E8 6E050000 CALL ex2.0040666C 我们手动跟踪时遇到Call一定要正确判断是用F7过
,还是F8过,F7决对安全,但容易重复跟踪,F8容易跑飞。这里是远处Call,F8过。
004060FE B3 00 MOV BL,0
00406100 80FB 00 CMP BL,0
00406103 75 5E JNZ SHORT ex2.00406163
....................................................
0040612F /74 2E JE SHORT ex2.0040615F
00406131 |78 2C JS SHORT ex2.0040615F
00406133 |AC LODS BYTE PTR DS:[ESI]
00406134 |3C E8 CMP AL,0E8
00406136 |74 0A JE SHORT ex2.00406142
00406138 |EB 00 JMP SHORT ex2.0040613A
0040613A |3C E9 CMP AL,0E9
0040613C |74 04 JE SHORT ex2.00406142
0040613E |43 INC EBX
0040613F |49 DEC ECX
00406140 ^|EB EB JMP SHORT ex2.0040612D 往回跳.
00406142 8B06 MOV EAX,DWORD PTR DS:[ESI] 直接F4到这里。
00406144 EB 00 JMP SHORT ex2.00406146 Bt,隔壁也跳。
00406146 803E 01 CMP BYTE PTR DS:[ESI],1
00406149 ^ 75 F3 JNZ SHORT ex2.0040613E
....................................................
00406152 8906 MOV DWORD PTR DS:[ESI],EAX
00406154 83C3 05 ADD EBX,5
00406157 83C6 04 ADD ESI,4
0040615A 83E9 05 SUB ECX,5
0040615D ^ EB CE JMP SHORT ex2.0040612D 往回跳.
0040615F 5B POP EBX 直接F4到这里。
00406160 5E POP ESI
00406161 59 POP ECX
00406162 58 POP EAX
00406163 EB 08 JMP SHORT ex2.0040616D 
0040616D 8BC8 MOV ECX,EAX
0040616F 8B3E MOV EDI,DWORD PTR DS:[ESI]
00406171 03BD 22040000 ADD EDI,DWORD PTR SS:[EBP+422]
00406177 8BB5 52010000 MOV ESI,DWORD PTR SS:[EBP+152]
0040617D C1F9 02 SAR ECX,2
00406180 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
........................................................
00406197 FF95 51050000 CALL DWORD PTR SS:[EBP+551]
0040619D 83C6 08 ADD ESI,8
004061A0 833E 00 CMP DWORD PTR DS:[ESI],0
004061A3 ^ 0F85 1EFFFFFF JNZ ex2.004060C7 回跳
004061A9 68 00800000 PUSH 8000 不能F4到这里,程序跑飞,我上篇Aspack2.11很像。
004061AE 6A 00 PUSH 0
004061B0 FFB5 56010000 PUSH DWORD PTR SS:[EBP+156]
004061B6 FF95 51050000 CALL DWORD PTR SS:[EBP+551]
004060C7 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4] 只能让它回到这里。
004060CA 05 0E010000 ADD EAX,10E
004060CF 6A 04 PUSH 4
004060D1 68 00100000 PUSH 1000
004060D6 50 PUSH EAX
........................................
004060F9 E8 6E050000 CALL ex2.0040666C F8
004060FE B3 01 MOV BL,1
00406100 80FB 00 CMP BL,0
00406103 75 5E JNZ SHORT ex2.00406163 这个跳转跳好远。
00406163 /EB 08 JMP SHORT ex2.0040616D 
00406165 |0000 ADD BYTE PTR DS:[EAX],AL
00406167 |0E PUSH CS
0040616D 8BC8 MOV ECX,EAX
0040616F 8B3E MOV EDI,DWORD PTR DS:[ESI]
00406171 03BD 22040000 ADD EDI,DWORD PTR SS:[EBP+422]
.............................................
00406265 /74 11 JE SHORT ex2.00406278
00406267 |03F2 ADD ESI,EDX
00406269 |AD LODS DWORD PTR DS:[ESI]
00406278 BE 34200000 MOV ESI,2034
0040627D 8B95 22040000 MOV EDX,DWORD PTR SS:[EBP+422]
00406283 03F2 ADD ESI,EDX
00406285 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C]
00406295 FF95 4D0F0000 CALL DWORD PTR SS:[EBP+F4D]
0040629B 85C0 TEST EAX,EAX
0040629D 75 07 JNZ SHORT ex2.004062A6
..............................................
004062FC FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress
00406302 85C0 TEST EAX,EAX
00406304 5B POP EBX
00406305 75 6F JNZ SHORT ex2.00406376 大跳转。
00406376 8907 MOV DWORD PTR DS:[EDI],EAX ; msvbvm60.MethCallEngine
00406378 8385 49050000 0>ADD DWORD PTR SS:[EBP+549],4
0040637F ^ E9 32FFFFFF JMP ex2.004062B6 往回跳。
00406384 8906 MOV DWORD PTR DS:[ESI],EAX F4
00406386 8946 0C MOV DWORD PTR DS:[ESI+C],EAX
00406389 8946 10 MOV DWORD PTR DS:[ESI+10],EAX
0040638C 83C6 14 ADD ESI,14
0040638F 8B95 22040000 MOV EDX,DWORD PTR SS:[EBP+422]
00406395 ^ E9 EBFEFFFF JMP ex2.00406285 往回跳
0040639A B8 6C100000 MOV EAX,106C F4
0040639F 50 PUSH EAX
004063A0 0385 22040000 ADD EAX,DWORD PTR SS:[EBP+422]
004063A6 59 POP ECX
004063A7 0BC9 OR ECX,ECX
004063A9 8985 A8030000 MOV DWORD PTR SS:[EBP+3A8],EAX
004063AF 61 POPAD 看到这个标志,入口就不远了。
004063B0 /75 08 JNZ SHORT ex2.004063BA 
004063B2 |B8 01000000 MOV EAX,1
004063B7 |C2 0C00 RETN 0C
004063BA \68 6C104000 PUSH ex2.0040106C 放入入口值40106C
004063BF C3 RETN 返回。
0040106C 68 DB 68 程序跨段,并且经过了PoPad关键字。我们再这里用Od的 Dump插件直接脱壳。
0040106D D8 DB D8
0040106E 11 DB 11
0040106F 40 DB 40 ; CHAR '@'
00401070 00 DB 00
00401071 E8 DB E8
00401072 F0 DB F0
重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳
后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。
一点提示,用Od手动跟综循环,为了看清程序跳转方向,需要对Od进行设置,你设置了没有。
在Od-选项-调试设置-Cpu,填如图中设置,这样后程序跳转时会有一道红线提示方向,我们好更容易控制程序。
看截图
 
"手动脱壳入门第五篇"脱壳动画! 

  
 

  

xTiNt
 手动脱壳入门第五篇Aspack2.12  
手动脱壳入门第五篇Aspack2.12
【脱文标题】 手动脱壳入门第五篇Aspack2.12
【脱文作者】 weiyi75[Dfcg] 
【作者邮箱】 weiyi75@sohu.com 
【作者主页】 Dfcg官方大本营 
【使用工具】 Peid,Ollydbg
【脱壳平台】 Win2K/XP
【软件名称】 Ascii 查询专家
【软件简介】 Aspack 2.12加壳的Ascii 查询专家
【软件大小】 5.35K
【加壳方式】 ASPack 2.12 -> Alexey Solodovnikov
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享: 
好,我们这次脱Aspack2.12的壳看看它的特性。
本地下载
首先必须的工具要准备好,
附件中壳为PEiD查壳为ASPack 2.12 -> Alexey Solodovnikov
手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不
能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。
用OD载入程序后。
确定一个入口警告,OD提示软件可能有自解压或自修改功能,当然,因为它加了壳。
停在这里
00406001 > 60 PUSHAD 我们先记住Aspack壳的加壳入口第一句是PUSHAD
00406002 E8 03000000 CALL ex2.0040600A 必须F7进入,不然跑飞。很近的Call用F7
0040600A 5D POP EBP ; ex2.00406007
0040600B 45 INC EBP
0040600C 55 PUSH EBP
0040600D C3 RETN
00406008 /EB 04 JMP SHORT ex2.0040600E 
0040600A |5D POP EBP
0040600B |45 INC EBP
0040600C |55 PUSH EBP
0040600D |C3 RETN
0040600E E8 01000000 CALL ex2.00406014 一看就应用F7过,变形的Jmp
00406013 EB 5D JMP SHORT ex2.00406072
00406014 5D POP EBP ; ex2.00406013
00406015 BB EDFFFFFF MOV EBX,-13
0040601A 03DD ADD EBX,EBP
0040601C 81EB 00600000 SUB EBX,6000
00406022 83BD 22040000 0>CMP DWORD PTR SS:[EBP+422],0
00406029 899D 22040000 MOV DWORD PTR SS:[EBP+422],EBX
0040602F 0F85 65030000 JNZ ex2.0040639A
0040603C FF95 4D0F0000 CALL DWORD PTR SS:[EBP+F4D] ; kernel32.GetModuleHandleA
00406042 8985 26040000 MOV DWORD PTR SS:[EBP+426],EAX
00406048 8BF8 MOV EDI,EAX
0040604A 8D5D 5E LEA EBX,DWORD PTR SS:[EBP+5E]
0040604D 53 PUSH EBX
0040604E 50 PUSH EAX
0040604F FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress
00406055 8985 4D050000 MOV DWORD PTR SS:[EBP+54D],EAX
0040605B 8D5D 6B LEA EBX,DWORD PTR SS:[EBP+6B]
0040605E 53 PUSH EBX
0040605F 57 PUSH EDI
00406060 FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress
00406066 8985 51050000 MOV DWORD PTR SS:[EBP+551],EAX
0040606C 8D45 77 LEA EAX,DWORD PTR SS:[EBP+77]
0040606F FFE0 JMP EAX 跳走。
0040608A 8B9D 31050000 MOV EBX,DWORD PTR SS:[EBP+531] 到这里。
00406090 0BDB OR EBX,EBX
00406092 74 0A JE SHORT ex2.0040609E 
00406094 8B03 MOV EAX,DWORD PTR DS:[EBX]
.....................................................
004060F9 E8 6E050000 CALL ex2.0040666C 我们手动跟踪时遇到Call一定要正确判断是用F7过
,还是F8过,F7决对安全,但容易重复跟踪,F8容易跑飞。这里是远处Call,F8过。
004060FE B3 00 MOV BL,0
00406100 80FB 00 CMP BL,0
00406103 75 5E JNZ SHORT ex2.00406163
....................................................
0040612F /74 2E JE SHORT ex2.0040615F
00406131 |78 2C JS SHORT ex2.0040615F
00406133 |AC LODS BYTE PTR DS:[ESI]
00406134 |3C E8 CMP AL,0E8
00406136 |74 0A JE SHORT ex2.00406142
00406138 |EB 00 JMP SHORT ex2.0040613A
0040613A |3C E9 CMP AL,0E9
0040613C |74 04 JE SHORT ex2.00406142
0040613E |43 INC EBX
0040613F |49 DEC ECX
00406140 ^|EB EB JMP SHORT ex2.0040612D 往回跳.
00406142 8B06 MOV EAX,DWORD PTR DS:[ESI] 直接F4到这里。
00406144 EB 00 JMP SHORT ex2.00406146 Bt,隔壁也跳。
00406146 803E 01 CMP BYTE PTR DS:[ESI],1
00406149 ^ 75 F3 JNZ SHORT ex2.0040613E
....................................................
00406152 8906 MOV DWORD PTR DS:[ESI],EAX
00406154 83C3 05 ADD EBX,5
00406157 83C6 04 ADD ESI,4
0040615A 83E9 05 SUB ECX,5
0040615D ^ EB CE JMP SHORT ex2.0040612D 往回跳.
0040615F 5B POP EBX 直接F4到这里。
00406160 5E POP ESI
00406161 59 POP ECX
00406162 58 POP EAX
00406163 EB 08 JMP SHORT ex2.0040616D 
0040616D 8BC8 MOV ECX,EAX
0040616F 8B3E MOV EDI,DWORD PTR DS:[ESI]
00406171 03BD 22040000 ADD EDI,DWORD PTR SS:[EBP+422]
00406177 8BB5 52010000 MOV ESI,DWORD PTR SS:[EBP+152]
0040617D C1F9 02 SAR ECX,2
00406180 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS>
........................................................
00406197 FF95 51050000 CALL DWORD PTR SS:[EBP+551]
0040619D 83C6 08 ADD ESI,8
004061A0 833E 00 CMP DWORD PTR DS:[ESI],0
004061A3 ^ 0F85 1EFFFFFF JNZ ex2.004060C7 回跳
004061A9 68 00800000 PUSH 8000 不能F4到这里,程序跑飞,我上篇Aspack2.11很像。
004061AE 6A 00 PUSH 0
004061B0 FFB5 56010000 PUSH DWORD PTR SS:[EBP+156]
004061B6 FF95 51050000 CALL DWORD PTR SS:[EBP+551]
004060C7 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4] 只能让它回到这里。
004060CA 05 0E010000 ADD EAX,10E
004060CF 6A 04 PUSH 4
004060D1 68 00100000 PUSH 1000
004060D6 50 PUSH EAX
........................................
004060F9 E8 6E050000 CALL ex2.0040666C F8
004060FE B3 01 MOV BL,1
00406100 80FB 00 CMP BL,0
00406103 75 5E JNZ SHORT ex2.00406163 这个跳转跳好远。
00406163 /EB 08 JMP SHORT ex2.0040616D 
00406165 |0000 ADD BYTE PTR DS:[EAX],AL
00406167 |0E PUSH CS
0040616D 8BC8 MOV ECX,EAX
0040616F 8B3E MOV EDI,DWORD PTR DS:[ESI]
00406171 03BD 22040000 ADD EDI,DWORD PTR SS:[EBP+422]
.............................................
00406265 /74 11 JE SHORT ex2.00406278
00406267 |03F2 ADD ESI,EDX
00406269 |AD LODS DWORD PTR DS:[ESI]
00406278 BE 34200000 MOV ESI,2034
0040627D 8B95 22040000 MOV EDX,DWORD PTR SS:[EBP+422]
00406283 03F2 ADD ESI,EDX
00406285 8B46 0C MOV EAX,DWORD PTR DS:[ESI+C]
00406295 FF95 4D0F0000 CALL DWORD PTR SS:[EBP+F4D]
0040629B 85C0 TEST EAX,EAX
0040629D 75 07 JNZ SHORT ex2.004062A6
..............................................
004062FC FF95 490F0000 CALL DWORD PTR SS:[EBP+F49] ; kernel32.GetProcAddress
00406302 85C0 TEST EAX,EAX
00406304 5B POP EBX
00406305 75 6F JNZ SHORT ex2.00406376 大跳转。
00406376 8907 MOV DWORD PTR DS:[EDI],EAX ; msvbvm60.MethCallEngine
00406378 8385 49050000 0>ADD DWORD PTR SS:[EBP+549],4
0040637F ^ E9 32FFFFFF JMP ex2.004062B6 往回跳。
00406384 8906 MOV DWORD PTR DS:[ESI],EAX F4
00406386 8946 0C MOV DWORD PTR DS:[ESI+C],EAX
00406389 8946 10 MOV DWORD PTR DS:[ESI+10],EAX
0040638C 83C6 14 ADD ESI,14
0040638F 8B95 22040000 MOV EDX,DWORD PTR SS:[EBP+422]
00406395 ^ E9 EBFEFFFF JMP ex2.00406285 往回跳
0040639A B8 6C100000 MOV EAX,106C F4
0040639F 50 PUSH EAX
004063A0 0385 22040000 ADD EAX,DWORD PTR SS:[EBP+422]
004063A6 59 POP ECX
004063A7 0BC9 OR ECX,ECX
004063A9 8985 A8030000 MOV DWORD PTR SS:[EBP+3A8],EAX
004063AF 61 POPAD 看到这个标志,入口就不远了。
004063B0 /75 08 JNZ SHORT ex2.004063BA 
004063B2 |B8 01000000 MOV EAX,1
004063B7 |C2 0C00 RETN 0C
004063BA \68 6C104000 PUSH ex2.0040106C 放入入口值40106C
004063BF C3 RETN 返回。
0040106C 68 DB 68 程序跨段,并且经过了PoPad关键字。我们再这里用Od的 Dump插件直接脱壳。
0040106D D8 DB D8
0040106E 11 DB 11
0040106F 40 DB 40 ; CHAR '@'
00401070 00 DB 00
00401071 E8 DB E8
00401072 F0 DB F0
重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳
后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。
一点提示,用Od手动跟综循环,为了看清程序跳转方向,需要对Od进行设置,你设置了没有。
在Od-选项-调试设置-Cpu,填如图中设置,这样后程序跳转时会有一道红线提示方向,我们好更容易控制程序。
看截图
 
"手动脱壳入门第五篇"脱壳动画!