【破文标题】手脱Armadillo5.0双进程标准壳
【破文作者】zk8891111(其实也就是我,呵呵)
【作者邮箱】178911980@163.com
【破解工具】OD,LordPE ImportREC
【破解平台】XP SP2
【原版下载】见附件
【破解声明】菜鸟练习笔记,无技术含量,有纪念意义
------------------------------------------------------------------------
【破解过程】最近一直在学习脱穿山甲的壳,今天抽空写个破文,当是学习笔记。高手就飘过了~
1、查壳:用PEID查壳结果为:Armadillo V5.00 -> Silicon Realms Toolworks *
运行程序,打开资源管理器,很明显是双进程的
2、设置OD:忽略所有异常,用插件隐藏OD
3、开始脱壳,用OD载入 004A2DC2 A> E8 E3400000 call Armadill.004A6EAA //停在这 004A2DC7 ^ E9 16FEFFFF jmp Armadill.004A2BE2 004A2DCC 6A 0C push 0C 004A2DCE 68 B0104D00 push Armadill.004D10B0 004A2DD3 E8 44150000 call Armadill.004A431C 004A2DD8 8B4D 08 mov ecx,dword ptr ss:[ebp+8] 004A2DDB 33FF xor edi,edi 004A2DDD 3BCF cmp ecx,edi 004A2DDF 76 2E jbe short Armadill.004A2E0F 004A2DE1 6A E0 push -20
(1) 把双进程变单进程:
下断点:BP OpenMutexA,SHIFT+F9
7C80EA3B k> 8BFF mov edi,edi //停在这 7C80EA3D 55 push ebp 7C80EA3E 8BEC mov ebp,esp 7C80EA40 51 push ecx 7C80EA41 51 push ecx 7C80EA42 837D 10 00 cmp dword ptr ss:[ebp+10],0 7C80EA46 56 push esi 7C80EA47 0F84 D7540300 je kernel32.7C843F24
然后观察队栈窗口: 0012F720 0048EDAA /CALL 到 OpenMutexA 来自 Armadill.0048EDA4 0012F724 001F0001 |Access = 1F0001 0012F728 00000000 |Inheritable = FALSE 0012F72C 0012FD7C \MutexName = "1220::DA8B2CFD8D" 0012F730 6452266E
记录数据为:0012FD7C,一会就会用到。[/code]
打开ALT+M内存镜像,找.code段的起始地址为00401000
于是,在反汇编窗口CTRL+G,来到00401000
然后输入下面代码:(大家做的时候其他的代码都不变,只改变第三句中的地址) 00401000 60 pushad 00401001 9C pushfd 00401002 68 7CFD1200 push 12FD7C //这里的地址就是刚才所记录的地址 00401007 33C0 xor eax,eax 00401009 50 push eax 0040100A 50 push eax 0040100B 50 push eax 0040100C E8 4ED9407C call kernel32.CreateMutexA 00401011 9D popfd 00401012 61 popad 00401013 - E9 23DA407C jmp kernel32.OpenMutexA
接着在首句新建EIP,取消断点。
(2)处理IAT
这里有两种方法:
方法一:
下断点he GetModuleHandleA+9,SHIFT+F9多次,观察队栈,适当时机返回。 00129474 /0012EB88 00129478 |00EA5325 返回到 00EA5325 来自 kernel32.GetModuleHandleA 0012947C |00ED0C04 ASCII "kernel32.dll" 00129480 |00ED1AD0 ASCII "VirtualAlloc"
00129474 /0012EB88 00129478 |00EA5343 返回到 00EA5343 来自 kernel32.GetModuleHandleA 0012947C |00ED0C04 ASCII "kernel32.dll" 00129480 |00ED1AC4 ASCII "VirtualFree"
001291C0 /00129478 001291C4 |00E87F54 返回到 00E87F54 来自 kernel32.GetModuleHandleA 001291C8 |00129340 ASCII "kernel32.dll"
这时候就是返回时机了。
取消断点,ALT+F9,返回程序代码段,然后修改magic jump(不知道这里还可不可以叫magic jump) 00E87F54 8B55 F4 mov edx,dword ptr ss:[ebp-C] 00E87F57 8B0D 7CDFED00 mov ecx,dword ptr ds:[EDDF7C] 00E87F5D 890491 mov dword ptr ds:[ecx+edx*4],eax 00E87F60 8B55 F4 mov edx,dword ptr ss:[ebp-C] 00E87F63 A1 7CDFED00 mov eax,dword ptr ds:[EDDF7C] 00E87F68 833C90 00 cmp dword ptr ds:[eax+edx*4],0 00E87F6C 75 5C jnz short 00E87FCA 00E87F6E 8B4D F8 mov ecx,dword ptr ss:[ebp-8] 00E87F71 8B51 08 mov edx,dword ptr ds:[ecx+8] 00E87F74 83E2 02 and edx,2 00E87F77 74 38 je short 00E87FB1 00E87F79 B8 0B000000 mov eax,0B 00E87F7E C1E0 02 shl eax,2 00E87F81 8B0D 04BBED00 mov ecx,dword ptr ds:[EDBB04] ; Armadill.004CB378 00E87F87 8B15 04BBED00 mov edx,dword ptr ds:[EDBB04] ; Armadill.004CB378 00E87F8D 8B35 04BBED00 mov esi,dword ptr ds:[EDBB04] ; Armadill.004CB378 00E87F93 8B5E 78 mov ebx,dword ptr ds:[esi+78] 00E87F96 335A 34 xor ebx,dword ptr ds:[edx+34] 00E87F99 331C01 xor ebx,dword ptr ds:[ecx+eax] 00E87F9C 83E3 10 and ebx,10 00E87F9F F7DB neg ebx 00E87FA1 1BDB sbb ebx,ebx 00E87FA3 F7DB neg ebx 00E87FA5 0FB6C3 movzx eax,bl 00E87FA8 85C0 test eax,eax 00E87FAA 75 05 jnz short 00E87FB1 00E87FAC ^ E9 1BFFFFFF jmp 00E87ECC 00E87FB1 8D8D C8FEFFFF lea ecx,dword ptr ss:[ebp-138] 00E87FB7 51 push ecx 00E87FB8 FF15 D4E1EC00 call dword ptr ds:[ECE1D4] ; kernel32.LoadLibraryA 00E87FBE 8B55 F4 mov edx,dword ptr ss:[ebp-C] 00E87FC1 8B0D 7CDFED00 mov ecx,dword ptr ds:[EDDF7C] 00E87FC7 890491 mov dword ptr ds:[ecx+edx*4],eax 00E87FCA 8B55 F4 mov edx,dword ptr ss:[ebp-C] 00E87FCD A1 7CDFED00 mov eax,dword ptr ds:[EDDF7C] 00E87FD2 833C90 00 cmp dword ptr ds:[eax+edx*4],0 00E87FD6 75 05 jnz short 00E87FDD //把他NOP掉吧! 00E87FD8 ^ E9 EFFEFFFF jmp 00E87ECC 00E87FDD C785 BCFEFFFF 000000>mov dword ptr ss:[ebp-144],0
处理完后,直接拉到下面: 00E88246 33348A xor esi,dword ptr ds:[edx+ecx*4] 00E88249 8B45 F4 mov eax,dword ptr ss:[ebp-C] 00E8824C 8B0D 7CDFED00 mov ecx,dword ptr ds:[EDDF7C] 00E88252 893481 mov dword ptr ds:[ecx+eax*4],esi 00E88255 ^ E9 72FCFFFF jmp 00E87ECC 00E8825A EB 03 jmp short 00E8825F //在这F2,SHIFT+F9,取消断点
接着返回到刚才修改的地方,撤消修改,IAT处理到此结束!
方法二:下断点:bp VirtualProtect,SHIFT+F9,观察队栈,找适当时机返回
返回的时机就是:当Size的值小于1000,且NewProtect为PAGE_READWRITE时 00129470 00EAA814 /CALL 到 VirtualProtect 来自 00EAA80E 00129474 0045F118 |Address = Armadill.0045F118 00129478 0000008C |Size = 8C (140.) 0012947C 00000004 |NewProtect = PAGE_READWRITE 00129480 0012C028 \pOldProtect = 0012C028
这个时候就可以返回了!
取消断点,ALT+F9 00EAA814 6A 14 push 14 //返回到这 00EAA816 E8 FBCA0000 call 00EB7316 00EAA81B 83C4 04 add esp,4 00EAA81E 8985 84ABFFFF mov dword ptr ss:[ebp+FFFFAB84],eax 00EAA824 83BD 84ABFFFF 00 cmp dword ptr ss:[ebp+FFFFAB84],0 00EAA82B 74 59 je short 00EAA886 00EAA82D 8B0D EC53EE00 mov ecx,dword ptr ds:[EE53EC] 00EAA833 898D 10AAFFFF mov dword ptr ss:[ebp+FFFFAA10],ecx 00EAA839 8B95 74D8FFFF mov edx,dword ptr ss:[ebp-278C] 00EAA83F 0395 78D3FFFF add edx,dword ptr ss:[ebp-2C88]
接着CTRL+F,查找命令push 100(把整个短块前面的勾去掉) 00EAAA87 68 00010000 push 100 //来到这 00EAAA8C 8D8D 40C1FFFF lea ecx,dword ptr ss:[ebp-3EC0] 00EAAA92 51 push ecx 00EAAA93 8B95 40C2FFFF mov edx,dword ptr ss:[ebp-3DC0] 00EAAA99 8B02 mov eax,dword ptr ds:[edx] 00EAAA9B 50 push eax 00EAAA9C E8 2F7CFBFF call 00E626D0 //跟随 00EAAAA1 83C4 0C add esp,0C 00EAAAA4 8D8D 40C1FFFF lea ecx,dword ptr ss:[ebp-3EC0]
然后跟随进入下面的一个CALL,然后把段首改为RETN
这样,同样可以阻止对IAT进行修改,达到目的!
(3)寻找OEP
同样有2种方法:
方法一:下断点bp CreateThread,SHIFT+F9 7C810657 k> 8BFF mov edi,edi //停在这里 7C810659 55 push ebp 7C81065A 8BEC mov ebp,esp 7C81065C FF75 1C push dword ptr ss:[ebp+1C] 7C81065F FF75 18 push dword ptr ss:[ebp+18] 7C810662 FF75 14 push dword ptr ss:[ebp+14] 7C810665 FF75 10 push dword ptr ss:[ebp+10] 7C810668 FF75 0C push dword ptr ss:[ebp+C] 7C81066B FF75 08 push dword ptr ss:[ebp+8] 7C81066E 6A FF push -1 7C810670 E8 D7FDFFFF call kernel32.CreateRemoteThread 7C810675 5D pop ebp 7C810676 C2 1800 retn 18
取消断点,ALT+F9返回
下面就单步跟吧!
00EAF2B1 /EB 46 jmp short 00EAF2F9 00EAF2B3 |8B55 08 mov edx,dword ptr ss:[ebp+8] 00EAF2B6 |833A 01 cmp dword ptr ds:[edx],1 00EAF2B9 |75 3E jnz short 00EAF2F9 00EAF2BB |A1 04BBED00 mov eax,dword ptr ds:[EDBB04] 00EAF2C0 |8B0D 04BBED00 mov ecx,dword ptr ds:[EDBB04] ; Armadill.004CB378 00EAF2C6 |8B50 68 mov edx,dword ptr ds:[eax+68] 00EAF2C9 |3351 34 xor edx,dword ptr ds:[ecx+34] 00EAF2CC |A1 04BBED00 mov eax,dword ptr ds:[EDBB04] 00EAF2D1 |3350 60 xor edx,dword ptr ds:[eax+60] 00EAF2D4 |8955 DC mov dword ptr ss:[ebp-24],edx 00EAF2D7 |8B4D 08 mov ecx,dword ptr ss:[ebp+8] 00EAF2DA |8B51 04 mov edx,dword ptr ds:[ecx+4] 00EAF2DD |52 push edx 00EAF2DE |8B45 08 mov eax,dword ptr ss:[ebp+8] 00EAF2E1 |8B48 08 mov ecx,dword ptr ds:[eax+8] 00EAF2E4 |51 push ecx 00EAF2E5 |6A 00 push 0 00EAF2E7 |8B55 08 mov edx,dword ptr ss:[ebp+8] 00EAF2EA |8B42 0C mov eax,dword ptr ds:[edx+C] 00EAF2ED |50 push eax 00EAF2EE |8B4D F4 mov ecx,dword ptr ss:[ebp-C] 00EAF2F1 |2B4D DC sub ecx,dword ptr ss:[ebp-24] 00EAF2F4 |FFD1 call ecx //这里就跳向OEP了!F7跟进即可! 00EAF2F6 |8945 FC mov dword ptr ss:[ebp-4],eax 00EAF2F9 \8B45 FC mov eax,dword ptr ss:[ebp-4]
0045B52C 55 push ebp //这里就是OEP了! 0045B52D 8BEC mov ebp,esp 0045B52F 83C4 F0 add esp,-10 0045B532 B8 8CB24500 mov eax,Armadill.0045B28C 0045B537 E8 C0ABFAFF call Armadill.004060FC 0045B53C A1 C8D44500 mov eax,dword ptr ds:[45D4C8] 0045B541 8B00 mov eax,dword ptr ds:[eax] 0045B543 E8 F893FFFF call Armadill.00454940 0045B548 8B0D B0D54500 mov ecx,dword ptr ds:[45D5B0] ; Armadill.0045EC88 0045B54E A1 C8D44500 mov eax,dword ptr ds:[45D4C8] 0045B553 8B00 mov eax,dword ptr ds:[eax] 0045B555 8B15 B4AF4500 mov edx,dword ptr ds:[45AFB4] ; Armadill.0045B000 0045B55B E8 F893FFFF call Armadill.00454958 0045B560 A1 C8D44500 mov eax,dword ptr ds:[45D4C8] 0045B565 8B00 mov eax,dword ptr ds:[eax] 0045B567 E8 6C94FFFF call Armadill.004549D8 0045B56C E8 B38BFAFF call Armadill.00404124 0045B571 8D40 00 lea eax,dword ptr ds:[eax]
方法二:ALT+M,在00401000处F2,SHIFT+F9,然后单步走,
同样可以找到下面地址:
00EAF2F4 |FFD1 call ecx //这里就跳向OEP了!F7跟进即可!
4、用LordPE脱壳,然后用Import REC修复,剪掉无效的指针即可!
OK,脱壳文件能正常运行!
脱壳到此结束!
------------------------------------------------------------------------
【破解总结】早就听到穿山甲的大名,所以反复看教程,然后自己动手实践!
HOHO~~终于成功!说实话,真有点小兴奋!
不过这只是简单的保护方式,以后路还有很长要走!
菜鸟还要继续努力啊!不过,我会继续加油!
------------------------------------------------------------------------
【版权声明】转载请注明作者并保持文章的完整, 谢谢! |