手动脱壳入门第三篇ASPACK 1.08
【脱文作者】 weiyi75[Dfcg]
【作者邮箱】 weiyi75@sohu.com
【作者主页】 Dfcg官方大本营
【使用工具】 Fi,Peid,Ollydbg
【脱壳平台】 Win2K/XP
【软件名称】 chap703.exe
【软件简介】 Aspack 1.03加壳的一个Win98的记事本
【软件大小】 21.2KB
【加壳方式】 ASPack 1.08.03 -> Alexey Solodovnikov
【保护方式】 Aspack 1.03
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:
脱壳内容
好,我们这次脱Aspack的壳看看它的特性。
首先必须的工具要准备好,
附件中壳为Fi测壳为Aspack1.0803
手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。
用OD载入程序后。
Od提示程序加壳,选不继续分析。
0040D000 > 60 PUSHAD 停在这里,我们先记住Aspack壳的加壳入口第一句是PUSHAD
和UPX几乎一样的,但第二句以后完全不同.
0040D001 E8 00000000 CALL chap703.0040D006 这里看清,直接Call下一句,F8走有些系统会跑飞,程序直接运行.我们一般遇到Call,很近的Call用F7走.较远的Call用F8步过,我们以后会体会更深.
0040D006 5D POP EBP Call这里.
0040D007 81ED 0A4A4400 SUB EBP,444A0A
0040D00D BB 044A4400 MOV EBX,444A04
0040D012 03DD ADD EBX,EBP
0040D014 2B9D B1504400 SUB EBX,DWORD PTR SS:[EBP+4450B1]
0040D01A 83BD AC504400 0>CMP DWORD PTR SS:[EBP+4450AC],0
0040D021 899D BB4E4400 MOV DWORD PTR SS:[EBP+444EBB],EBX
0040D027 0F85 17050000 JNZ chap703.0040D544
0040D02D 8D85 D1504400 LEA EAX,DWORD PTR SS:[EBP+4450D1]
0040D033 50 PUSH EAX
0040D034 FF95 94514400 CALL DWORD PTR SS:[EBP+445194]
到这里我们看到信息框中写有GetModuleHandleA
0040D034 FF95 94514400 CALL DWORD PTR SS:[EBP+445194] ; kernel32.GetModuleHandleA
0040D03A 8985 CD504400 MOV DWORD PTR SS:[EBP+4450CD],EAX
0040D040 8BF8 MOV EDI,EAX
0040D042 8D9D DE504400 LEA EBX,DWORD PTR SS:[EBP+4450DE]
0040D048 53 PUSH EBX
0040D049 50 PUSH EAX
0040D04A FF95 90514400 CALL DWORD PTR SS:[EBP+445190]
到这里我们看到信息框中写有GetProcAddress
0040D04A FF95 90514400 CALL DWORD PTR SS:[EBP+445190] ; kernel32.GetProcAddress
0040D050 8985 B9504400 MOV DWORD PTR SS:[EBP+4450B9],EAX
0040D056 8D9D EB504400 LEA EBX,DWORD PTR SS:[EBP+4450EB]
0040D05C 53 PUSH EBX
0040D05D 57 PUSH EDI
0040D05E FF95 90514400 CALL DWORD PTR SS:[EBP+445190]
0040D064 8985 BD504400 MOV DWORD PTR SS:[EBP+4450BD],EAX
0040D06A 8B85 BB4E4400 MOV EAX,DWORD PTR SS:[EBP+444EBB]
0040D070 8985 AC504400 MOV DWORD PTR SS:[EBP+4450AC],EAX
0040D076 6A 04 PUSH 4
0040D078 68 00100000 PUSH 1000
0040D07D 68 9A040000 PUSH 49A
0040D082 6A 00 PUSH 0
0040D084 FF95 B9504400 CALL DWORD PTR SS:[EBP+4450B9]
到这里我们看到信息框中写有VirtualAlloc
0040D084 FF95 B9504400 CALL DWORD PTR SS:[EBP+4450B9] ; kernel32.VirtualAlloc
0040D08A 8985 B5504400 MOV DWORD PTR SS:[EBP+4450B5],EAX
0040D090 8D9D CF4A4400 LEA EBX,DWORD PTR SS:[EBP+444ACF]
...............................................................
0040D0B7 8B85 B5504400 MOV EAX,DWORD PTR SS:[EBP+4450B5]
0040D0BD 68 00800000 PUSH 8000
0040D0C2 6A 00 PUSH 0
0040D0C4 50 PUSH EAX
0040D0C5 FF95 BD504400 CALL DWORD PTR SS:[EBP+4450BD]
到这里我们看到信息框中写有 VirtualFree
0040D0C5 FF95 BD504400 CALL DWORD PTR SS:[EBP+4450BD] ; kernel32.VirtualFree
0040D0CB 8D85 374C4400 LEA EAX,DWORD PTR SS:[EBP+444C37]
0040D0D1 50 PUSH EAX ; chap703.0040D233
0040D0D2 C3 RETN 返回
0040D233 8B9D DF4A4400 MOV EBX,DWORD PTR SS:[EBP+444ADF] 这里的跨段太小,也无Popad对应出口,肯定不是Oep
0040D239 0BDB OR EBX,EBX
0040D23B 74 0A JE SHORT chap703.0040D247 跳
0040D23D 8B03 MOV EAX,DWORD PTR DS:[EBX]
0040D23F 8785 E34A4400 XCHG DWORD PTR SS:[EBP+444AE3],EAX
0040D245 8903 MOV DWORD PTR DS:[EBX],EAX
0040D247 8DB5 F74A4400 LEA ESI,DWORD PTR SS:[EBP+444AF7]
0040D24D 833E 00 CMP DWORD PTR DS:[ESI],0
0040D250 0F84 0F010000 JE chap703.0040D365
0040D256 8D85 D1504400 LEA EAX,DWORD PTR SS:[EBP+4450D1]
0040D25C 50 PUSH EAX
0040D25D FF95 94514400 CALL DWORD PTR SS:[EBP+445194]
到这里我们看到信息框中写有 GetModuleHandleA
0040D25D FF95 94514400 CALL DWORD PTR SS:[EBP+445194] ; kernel32.GetModuleHandleA
0040D263 8985 CD504400 MOV DWORD PTR SS:[EBP+4450CD],EAX
0040D269 8BF8 MOV EDI,EAX
0040D26B 8D9D DE504400 LEA EBX,DWORD PTR SS:[EBP+4450DE]
0040D271 53 PUSH EBX
0040D272 50 PUSH EAX
0040D273 FF95 90514400 CALL DWORD PTR SS:[EBP+445190]
到这里我们看到信息框中写有 GetProcAddress
0040D273 FF95 90514400 CALL DWORD PTR SS:[EBP+445190] ; kernel32.GetProcAddress
0040D279 8985 B9504400 MOV DWORD PTR SS:[EBP+4450B9],EAX
0040D27F 8D9D EB504400 LEA EBX,DWORD PTR SS:[EBP+4450EB]
0040D285 53 PUSH EBX
0040D286 57 PUSH EDI
0040D287 FF95 90514400 CALL DWORD PTR SS:[EBP+445190] ; kernel32.GetProcAddress
0040D28D 8985 BD504400 MOV DWORD PTR SS:[EBP+4450BD],EAX
0040D293 8DB5 F74A4400 LEA ESI,DWORD PTR SS:[EBP+444AF7]
0040D299 8B46 04 MOV EAX,DWORD PTR DS:[ESI+4]
0040D29C 6A 04 PUSH 4
0040D29E 68 00100000 PUSH 1000
0040D2A3 50 PUSH EAX
0040D2A4 6A 00 PUSH 0
0040D2A6 FF95 B9504400 CALL DWORD PTR SS:[EBP+4450B9]
到这里我们看到信息框中写有 VirtualAllo
0040D2A6 FF95 B9504400 CALL DWORD PTR SS:[EBP+4450B9] ; kernel32.VirtualAlloc
0040D2AC 8985 B5504400 MOV DWORD PTR SS:[EBP+4450B5],EAX
0040D2B2 56 PUSH ESI
0040D