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