手动脱壳入门第四篇Aspack 2.11


     【脱文标题】 手动脱壳入门第四篇Aspack 2.11
     【脱文作者】 weiyi75[Dfcg]
     【作者邮箱】 weiyi75@sohu.com
     【作者主页】 Dfcg官方大本营
     【使用工具】 Peid,Ollydbg
     【脱壳平台】 Win2K/XP
     【软件名称】 NOTEPAD
     【软件简介】 Aspack 2.11加壳Win98的记事本
     【软件大小】 19.6K
     【加壳方式】 ASPack 2.11 -> Alexey Solodovnikov
     【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:
     好,我们这次脱Aspack2.11的壳看看它的特性。
     首先必须的工具要准备好,
     附件中壳为Peid测壳为Aspack2.11
     手动脱壳建议大家用Ollydbg,工作平台Win2000,WinXp,Win9x不推荐。
     手动脱壳时,用Olldbg载入程序,脱壳程序里面会有有好多循环。对付循环时,只能让程序往前运行,基本不能让它往回跳,要想法跳出循环圈。不要用Peid查入口,单步跟踪,提高手动找入口能力。
     用OD载入程序后。
     确定一个入口警告,Od提示程序加壳,选不继续分析。
     停在这里
     0040D001 60 pushad 我们先记住Aspack壳的加壳入口第一句是PUSHAD
     0040D002 E9 3D040000 jmp NOTEPAD.0040D444 语句结构和Aspack1.08大不相同,直接跳走。
     0040D444 81DD 719D255>sbb ebp, 55259D71 到这里。
     0040D44A E8 14000000 call NOTEPAD.0040D463 比较近的Call,F7过,F8就跑飞。应该是变形的Jmp
     0040D44F 47 inc edi
     0040D450 DA7C6B E1 fidivr dword ptr ds:[ebx ebp*2-1>
     0040D454 43 inc ebx
     0040D455 C547 33 lds eax, fword ptr ds:[edi 33]
     0040D458 EC in al, dx
     0040D459 46 inc esi
     0040D45A 2C D9 sub al, 0D9
     0040D45C 64:2C AF sub al, 0AF
     0040D45F 3F aas
     0040D460 53 push ebx
     0040D461 F8 clc
     0040D462 BF BA6755B6 mov edi, B65567BA
     0040D467 5A pop edx
     0040D463 BA 6755B65A mov edx, 5AB65567 到这里。
     0040D468 81D2 19620C9>adc edx, 9A0C6219
     0040D46E 59 pop ecx
     0040D46F 80CE E3 or dh, 0E3
     0040D472 81C2 A9B064F>add edx, F164B0A9
     0040D478 E9 14000000 jmp NOTEPAD.0040D491
     0040D491 51 push ecx ; NOTEPAD.0040D44F
     0040D492 BD 69806869 mov ebp, 69688069
     0040D497 0FBFEF movsx ebp, di
     0040D49A 5E pop esi
     0040D49B 66:8BFB mov di, bx
     0040D49E E9 14000000 jmp NOTEPAD.0040D4B7
     0040D4B7 81C6 3D82E11>add esi, 14E1823D
     0040D4BD 80CE 31 or dh, 31
     0040D4C0 0FBFF9 movsx edi, cx
     0040D4C3 BD 114E421D mov ebp, 1D424E11
     0040D4C8 BB C3802D0F mov ebx, 0F2D80C3
     0040D4CD 66:8BE8 mov bp, ax
     0040D4D0 E9 14000000 jmp NOTEPAD.0040D4E9
     0040D4E9 81F2 83CB7C9>xor edx, 9F7CCB83
     0040D4EF B2 D5 mov dl, 0D5
     0040D4F1 0FBFEA movsx ebp, dx
     0040D4F4 8186 AF7D1EE>add dword ptr ds:[esi EB1E7DAF],>
     0040D4FE 81D5 99DD7E1>adc ebp, 127EDD99
     0040D504 B2 C0 mov dl, 0C0
     0040D506 0FBFE9 movsx ebp, cx
     0040D509 43 inc ebx
     0040D50A 81D9 8F5710F>sbb ecx, F910578F
     0040D510 81EE 0200000>sub esi, 2
     0040D516 81EE 0200000>sub esi, 2
     0040D51C 0FBFFA movsx edi, dx
     0040D51F B2 9B mov dl, 9B
     0040D521 81FB D1812D0>cmp ebx, 0F2D81D1
     0040D527 ^ 0F85 C4FFFFF>jnz NOTEPAD.0040D4F1 往回跳
     0040D52D 66:8BD5 mov dx, bp F4到这里
     0040D530 81D9 4192AA9>sbb ecx, 90AA9241
     0040D536 ^ E9 00FFFFFF jmp NOTEPAD.0040D43B 又往回跳
     0040D53B A9 55C3500F test eax, 0F50C355 F4到这里不行,跑飞了。
     Ctrl F2从来。
     到不了下一句,没办法,让0040D536 ^ E9 00FFFFFF jmp NOTEPAD.0040D43B 往回跳
     0040D43B ^\E9 C7FBFFFF jmp NOTEPAD.0040D007 到这里,往回跳
     0040D440 0000 add byte ptr ds:[eax], al 不能F4到这里,只能让它回跳。
     0040D001 N> 60 pushad
     0040D002 E9 3D040000 jmp NOTEPAD.0040D444
     0040D007 E8 24040000 call NOTEPAD.0040D430 跳到这里,这不是入口处的第三条代码吗?
     0040D00C /EB 00 jmp short NOTEPAD.0040D00E 隔壁也跳。
     0040D00E \BB 30394400 mov ebx, 443930
     0040D013 03DD add ebx, ebp
     0040D015 2B9D D03F440>sub ebx, dword ptr ss:[ebp 443FD>
     0040D01B 83BD FC49440>cmp dword ptr ss:[ebp 4449FC], 0
     0040D022 899D FC49440>mov dword ptr ss:[ebp 4449FC], e>
     0040D028 0F85 6603000>jnz NOTEPAD.0040D394
     0040D02E C785 3339440>mov dword ptr ss:[ebp 443933], 0
     0040D038 8D85 044A440>lea eax, dword ptr ss:[ebp 444A0>
     0040D03E 50 push eax
     0040D03F FF95 004B440>call dword ptr ss:[ebp 444B00] ; 注意: kernel32.GetModuleHandleA
     0040D045 8985 004A440>mov dword ptr ss:[ebp 444A00], e>
     0040D04B 8BF8 mov edi, eax
     0040D04D 8D9D 114A440>lea ebx, dword ptr ss:[ebp 444A1>
     0040D053 53 push ebx
     0040D054 50 push eax
     0040D055 FF95 FC4A440>call dword ptr ss:[ebp 444AFC] ;注意: kernel32.GetProcAddress
     0040D05B 8985 FC3F440>mov dword ptr ss:[ebp 443FFC], e>
     0040D061 8D9D 1E4A440>lea ebx, dword ptr ss:[ebp 444A1>
     0040D067 53 push ebx
     0040D068 57 push edi
     0040D069 FF95 FC4A440>call dword ptr ss:[ebp 444AFC] 注意: kernel32.GetProcAddress
     0040D06F 8985 0040440>mov dword ptr ss:[ebp 444000], e>
     0040D075 8D85 B539440>lea eax, dword ptr ss:[ebp 4439B>
     0040D07B FFE0 jmp eax ; NOTEPAD.0040D085
     0040D085 8B9D D83F440>mov ebx, dword ptr ss:[ebp 443FD>
     0040D08B 0BDB or ebx, ebx
     0040D08D 74 0A je short NOTEPAD.0040D099 跳
     0040D08F 8B03 mov eax, dword ptr ds:[ebx]
     0040D091 8785 DC3F440>xchg dword ptr ss:[ebp 443FDC], >
     0040D097 8903 mov dword ptr ds:[ebx], eax
     0040D099 8DB5 1940440>lea esi, dword ptr ss:[ebp 44401>
     0040D09F 833E 00 cmp dword ptr ds:[esi], 0
     0040D0A2 0F84 1F01000>je NOTEPAD.0040D1C7
     ............................................
     0040D0F8 50 push eax
     0040D0F9 53 push ebx
     0040D0FA E8 DA060000 call NOTEPAD.0040D7D9 往回Call,F8放心过。
     0040D0FF 80BD 1040440>cmp byte ptr ss:[ebp 444010], 0
     0040D106 75 5E jnz short NOTEPAD.0040D166
     0040D108 FE85 1040440>inc byte ptr ss:[ebp 444010]
     0040D10E 8B3E mov edi, dword ptr ds:[esi]
     0040D110 03BD FC49440>add edi, dword ptr ss:[ebp 4449F>
     0040D116 FF37 push dword ptr ds:[edi]
     0040D118 C607 C3 mov byte ptr ds:[edi], 0C3
     0040D11B FFD7 call edi
     .................................................
     0040D141 43 inc ebx
     0040D142 49 dec ecx
     0040D143 ^ EB EB jmp short NOTEPAD.0040D130 往回跳。
     0040D145 8B06 mov eax, dword ptr ds:[esi] F4过。
     0040D147 EB 00 jmp short NOTEPAD.0040D149
     0040D149 803E 00 cmp byte ptr ds:[esi], 0
     0040D14C ^ 75 F3 jnz short NOTEPAD.0040D141 往回跳。
     0040D14E 24 00 and al, 0 F4过。
     0040D150 C1C0 18 rol eax, 18
     0040D153 2BC3 sub eax, ebx
     0040D15A 83C6 04 add esi, 4
     0040D15D 83E9 05 sub ecx, 5
     0040D160 ^ EB CE jmp short NOTEPAD.0040D130 往回跳。
     0040D162 5B pop ebx F4 ; NOTEPAD.00401000
     0040D163 5E pop esi
     0040D164 59 pop ecx
     0040D165 58 pop eax
     0040D166 8BC8 mov ecx, eax
     0040D168 8B3E mov edi, dword ptr ds:[esi]
     0040D196 83C6 08 add esi, 8
     0040D199 833E 00 cmp dword ptr ds:[esi], 0
     0040D19C ^ 0F85 26FFFFF>jnz NOTEPAD.0040D0C8 往回跳
     0040D1A2 68 00800000 push 8000 F4
     0040D1A7 6A 00 push 0
     0040D1A9 FFB5 F83F440>push dword ptr ss:[ebp 443FF8]
     0040D1AF FF95 0040440>call dword ptr ss:[ebp 444000]
     0040D25E /74 11 je short NOTEPAD.0040D271 跳。
     0040D260 |03F2 add esi, edx
     0040D271 8BB5 B139440>mov esi, dword ptr ss:[ebp 4439B>
     0040D277 8B95 FC49440>mov edx, dword ptr ss:[ebp 4449F>
     0040D27D 03F2 add esi, edx
     0040D27F 8B46 0C mov eax, dword ptr ds:[esi C]
     0040D282 85C0 test eax, eax
     0040D284 0F84 0A01000>je NOTEPAD.0040D394
     0040D28F FF95 004B440>call dword ptr ss:[ebp 444B00] ; kernel32.GetModuleHandleA
     0040D295 85C0 test eax, eax
     0040D297 75 07 jnz short NOTEPAD.0040D2A0
     0040D299 53 push ebx
     0040D29A FF95 044B440>call dword ptr ss:[ebp 444B04]
     .............................................................
     0040D370 8907 mov dword ptr ds:[edi], eax
     0040D372 8385 F03F440>add dword ptr ss:[ebp 443FF0], 4
     0040D379 ^ E9 32FFFFFF jmp NOTEPAD.0040D2B0 往回跳
     0040D37E 8906 mov dword ptr ds:[esi], eax F4 ; NOTEPAD.004061CC
     0040D380 8946 0C mov dword ptr ds:[esi C], eax
     0040D383 8946 10 mov dword ptr ds:[esi 10], eax
     0040D386 83C6 14 add esi, 14
     0040D389 8B95 FC49440>mov edx, dword ptr ss:[ebp 4449F>
     0040D38F ^ E9 EBFEFFFF jmp NOTEPAD.0040D27F 往回跳
     0040D394 8B85 AD39440>mov eax, dword ptr ss:[ebp 4439A>F4下来。
     0040D39A 50 push eax
     0040D39B 0385 FC49440>add eax, dword ptr ss:[ebp 4449F>
     0040D3A1 59 pop ecx
     0040D3A2 0BC9 or ecx, ecx
     0040D3A4 8985 E63C440>mov dword ptr ss:[ebp 443CE6], e>
     0040D3AA 61 popad 看到这个,入口就在附近。
     0040D3AB /75 08 jnz short NOTEPAD.0040D3B5
     0040D3AD |B8 01000000 mov eax, 1
     0040D3B2 |C2 0C00 retn 0C
     0040D3B5 \68 CC104000 push NOTEPAD.004010CC 放入入口值4010CC
     0040D3BA C3 retn 返回。
     004010CC 55 push ebp 004010CC 程序跨段,并且经过了PoPad关键字。我们再这里用Od的Dump插件直接脱壳。
     004010CD 8BEC mov ebp, esp
     004010CF 83EC 44 sub esp, 44
     004010D2 56 push esi
     004010D3 FF15 E463400>call dword ptr ds:[4063E4] ; kernel32.GetCommandLineA
     004010D9 8BF0 mov esi, eax
     004010DB 8A00 mov al, byte ptr ds:[eax]
     004010DD 3C 22 cmp al, 22
     重建输入表时,插件有两个选项。Method2重建输入表很快,脱壳后运行率高。Method1重建输入表慢,脱壳后运行率较低。不过本程序用Method2重建输入表无法运行,Method1重建输入表后程序可直接运行。