千里之外 发表于 2008-4-9 20:15:57

Armadillo4.4主程序脱壳

【文章标题】: Armadillo4.4主程序脱壳
【文章作者】: 千里之外
【作者QQ号】: 506398911
【软件名称】: Armadillo4.4
【下载地址】: http://pediy.com/tools/packers.htm
【使用工具】: OD Import REConstructor v1.6 FINAL LordPE Enjoy.exe ArmaDetach Armadillo Find Protected V1.8
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这个可以说是穿山甲的最高保护吧 不过没有代码拼接这个保护 我们用 Find Protected V1.8 看下他的保护
<------- 09-04-2008 18:56:47 ------->
C:\Armadillo\Armadillo.exe
!- Protected Armadillo
Protection system (Professional)
!- <Protection Options>
Debug-Blocker
CopyMem-II
Enable Import Table Elimination
Enable Nanomites Processing(这个就是传说中的 CC 我们最后用工具处理)
Enable Memory-Patching Protections
!- <Backup Key Options>
Main Key Only, No Backup Keys
!- <Compression Options>
Best/Slowest Compression
!- <Other Options>
!- Version 4.40 31October2005
!- Elapsed Time 00h 00m 06s 688ms

这里我们也是分步骤进行
1.手工得到未加密的IAT
2.用ArmaDetach 和ArmInline.0.96.final.chs 辅助修复后 DUMP
3.用Enjoy 修复CC
4.用PeRebuilder减肥
好了 我们开始
1.手工得到未加密的IAT
ArmaDetach 运行它 选择 COPYMEM-II 把原程序拖到里面
Filename: Armadillo.exe
Parent process iD:
Processing...

Professional Edition

Debug-Blocker protection detected
CopyMem-II protection detected
Memory-Patching Protections enabled
Import Table Elimination enabled
Nanomites Processing enabled

Crypto call found:
Child process iD:   这个是子进程的ID
Entry point:      这个是程序的OEP
Original bytes:   这个是程序开始的字节
Detached successfully :)      这个是成功提示了 ^_^

我们用OD附加458这个进程返回后来到这里
00448BB0- EB FE         jmp   short 00448BB0
00448BB2    90            nop
00448BB3    90            nop
00448BB4    FF68 D8         jmp   far fword ptr
00448BB7    5A            pop   edx
00448BB8    45            inc   ebp
00448BB9    0068 4C         add   byte ptr , ch
00448BBC    894400 64       mov   dword ptr , eax
00448BC0    A1 00000000   mov   eax, dword ptr
00448BC5    50            push    eax

这个时候呢 我们要修改开头的字节 这个就是工具里面的提示咯
Original bytes:   这个是程序开始的字节
这个时候IAT是加密的还有IAT 乱序没处理 不是我们DUMP下的时机这个时候我们要在开个OD找IAT 复制到这个里面
我们首先找下IAT的标志 一会好处理 CTRL+B FF 25 来到这里
0043D3EA- FF25 E0B20001   jmp   dword ptr             ; VERSION.VerQueryValueA

从数据窗口找个IAT
0100B2C87C809AE4kernel32.VirtualFree
0100B2CC77D18C2EUSER32.SetTimer




其实这个在我们修复后是要变化的 我们主要找的是IAT的标志 好在我们处理另一个进程的时候找IAT 我们记录下他的二进制

E4 9A 80 7C 2E 8C D1 77



其实是16进制的 呵呵 好了 这个才进入我们的主题 关闭OD 和刚刚那个ArmaDetach 这个主要是防止机器卡 还有些莫名其妙的
问题
这个时候 我们用ArmInline.0.96.final.chs 处理 原程序 得到子进程
记得选择 DETACH 这个选项
<------- 09-04-2008 19:19:18 ------->
C:\Armadillo\Armadillo.exe
!- Protected Armadillo
Protection system (Professional)
!- <Protection Options>
Debug-Blocker
CopyMem-II
Enable Import Table Elimination
Enable Nanomites Processing
Enable Memory-Patching Protections
!- <Backup Key Options>
Main Key Only, No Backup Keys
!- <Compression Options>
Best/Slowest Compression
!- <Other Options>
<- Start <Stop debug>

!- Child detach
Child process ID: 00000754我们附加这个进程
Entry point: 004D8000
Original bytes: 60E8         这里我们一会要修改入口 改成这个
!- Elapsed Time 00h 00m 06s 360ms

这里我们才开始我们找IAT的真正之旅
同样要修改入口 原入口是这样
004D8000 >- EB FE         jmp   short <模块入口点>
004D8002    0000            add   byte ptr , al
004D8004    0000            add   byte ptr , al
004D8006    5D            pop   ebp
004D8007    50            push    eax
004D8008    51            push    ecx
004D8009    0FCA            bswap   edx
004D800B    F7D2            not   edx
004D800D    9C            pushfd
004D800E    F7D2            not   edx
004D8010    0FCA            bswap   edx
修改后

004D8000 >60            pushad
004D8001    E8 00000000   call    004D8006
004D8006    5D            pop   ebp
004D8007    50            push    eax
004D8008    51            push    ecx
004D8009    0FCA            bswap   edx

这个时候要寻找魔幻跳转咯
k:WaitForDebugEvent(patch)
k:WriteProcessMemory(非OEP)
k:DebugActiveProcess(找子程)
k:OpenMutexA(双进程转单进程)
k:GetSystemTime(补丁KEY)
K:VirtualProtect(用于5.x)
K:CreateFileMappingA(用于5.x)
K:GetModuleHandleA(魔幻跳转)
K:CreateThread(寻找OEP)
我们下这个
K:GetModuleHandleA(魔幻跳转)
SHIT+F9后有异常 我们添加这个异常
后面还有几个异常 我们都加上
7C80B6A1 >8BFF            mov   edi, edi
7C80B6A3    55            push    ebp
7C80B6A4    8BEC            mov   ebp, esp
7C80B6A6    837D 08 00      cmp   dword ptr , 0
7C80B6AA    74 18         je      short 7C80B6C4
7C80B6AC    FF75 08         push    dword ptr
7C80B6AF    E8 C0290000   call    7C80E074
7C80B6B4    85C0            test    eax, eax
7C80B6B6    74 08         je      short 7C80B6C0
7C80B6B8    FF70 04         push    dword ptr
7C80B6BB    E8 7D2D0000   call    GetModuleHandleW
7C80B6C0    5D            pop   ebp
7C80B6C1    C2 0400         retn    4

找准返回时机 来到下面(这里发现这个断点一运行就退出了 这里我们用下辅助断点K:VirtualProtect(用于5.x)
K:CreateFileMappingA(用于5.x) 这两个分别断下后返回 再下最后那个断点)

00F06095    8B0D AC40F300   mov   ecx, dword ptr
00F0609B    89040E          mov   dword ptr , eax
00F0609E    A1 AC40F300   mov   eax, dword ptr
00F060A3    391C06          cmp   dword ptr , ebx
00F060A6    75 16         jnz   short 00F060BE
00F060A8    8D85 B4FEFFFF   lea   eax, dword ptr
00F060AE    50            push    eax
00F060AF    FF15 BC62F200   call    dword ptr                ; kernel32.LoadLibraryA
00F060B5    8B0D AC40F300   mov   ecx, dword ptr
00F060BB    89040E          mov   dword ptr , eax
00F060BE    A1 AC40F300   mov   eax, dword ptr
00F060C3    391C06          cmp   dword ptr , ebx
00F060C6    0F84 2F010000   je      00F061FB                           JMP 掉 躲避IAT加密
00F060CC    33C9            xor   ecx, ecx


下这个K:CreateThread(寻找OEP)
寻找OEP
00448BB0    58            pop   eax                              ; 00F1FB2B
00448BB1    0AAD CCF2E999   or      ch, byte ptr
00448BB7    FC            cld
00448BB8    48            dec   eax
00448BB9    8129 EA84C541   sub   dword ptr , 41C584EA
00448BBF    C2 AC81         retn    81AC
00448BC2    41            inc   ecx
00448BC3    A6            cmps    byte ptr , byte ptr es:[edi>
00448BC4    0D D1252F28   or      eax, 282F25D1
00448BC9    8141 A6 0D02ADF>add   dword ptr , FEAD020D
00448BD0    5E            pop   esi
00448BD1    D7            xlat    byte ptr

看下 OEP都这个样子了 但是这个不是我们想要的 我们要找的是IAT所以再内存里面找我们开始的 IAT标志

找到IAT的开始
011049587C802442kernel32.Sleep
0110495C00F075F2
011049607C81DC03kernel32.SetStdHandle
0110496477EFADC3GDI32.MoveToEx

我们把这些未加密的IAT复制下来 第一步 我们就完成了

42 24 80 7C F2 75 F0 00 03 DC 81 7C C3 AD EF 77 3D 04 93 7C AB 1E 83 7C 10 CC DC 77 5B CF 81 7C
08 C1 80 7C F2 4A 81 7C AE B6 D1 77 2A 74 F0 00 C8 BD D1 77 0A 6C EF 77 78 75 F0 00 63 75 F0 00
BF 74 F0 00 24 74 F0 00 C0 74 F0 00 55 FA D1 77 21 B2 EF 77 54 74 F0 00 39 5E EF 77 65 C4 D1 77
F4 74 F0 00 76 75 F0 00 33 B9 D1 77 15 99 80 7C A3 74 F0 00 DE 2A 81 7C 73 75 F0 00 79 75 F0 00
42 F6 D1 77 C3 CA DC 77 BE 74 F0 00 F0 BE D1 77 2D 75 F0 00 F0 74 F0 00 AD 74 F0 00 2B 74 F0 00
F8 75 F0 00 E1 75 F0 00 79 75 F0 00 B0 5B 83 7C E8 8D 83 7C 7D 74 F0 00 A7 27 81 7C E7 EB DA 77
1F 76 F0 00 6C BF D1 77 EB 5E EF 77 A4 D8 D1 77 6F 6E EF 77 D0 75 F0 00 D2 75 F0 00 E4 74 F0 00
F0 74 F0 00 2B 21 D3 77 FF 19 BD 77 29 75 F0 00 FE 4F 83 7C 51 9A 80 7C F7 75 F0 00 EB 74 F0 00
FF 08 86 7C ED 10 92 7C 1F 75 F0 00 77 1D 80 7C 05 02 18 5D AB 74 F0 00 7C 74 F0 00 BF D9 EF 77
90 A4 80 7C EE D4 D1 77 51 0E 81 7C D4 A0 80 7C C7 F2 D2 77 13 15 D3 77 61 75 F0 00 6E 75 F0 00
1B 76 DA 77 29 74 F0 00 6B 17 80 7C FB 74 F0 00 9C 92 80 7C CE 3D D2 77 A3 C7 D3 77 BD 74 F0 00
D4 B6 D1 77 E5 75 F0 00 35 14 82 7C 03 CE 81 7C 62 07 D2 77 56 2B 83 7C 37 06 81 7C 6F 75 F0 00
84 FA D2 77 2E 74 F0 00 B3 F3 D1 77 87 0D 81 7C 0E 18 80 7C 5C 94 80 7C F9 74 F0 00 77 75 F0 00
59 74 F0 00 60 DA D1 77 2F B7 D1 77 7A 75 F0 00 9C 8F D1 77 DA CD 81 7C 5D 94 D1 77 D4 75 F0 00
73 74 F0 00 54 5D 83 7C CF 65 17 5D 85 CB D1 77 D8 7C 33 76 A0 AD 80 7C EF 74 F0 00 77 D0 80 7C
31 03 93 7C D1 61 EF 77 4C 74 F0 00 44 20 83 7C 1F DC EF 77 28 97 80 7C 73 75 F0 00 FC 74 F0 00
78 8E D1 77 40 7A 95 7C 39 2F 81 7C 60 75 F0 00 51 C6 D3 77 27 F1 D2 77 3B 1F D3 77 2A 2E 86 7C
C7 74 F0 00 F7 28 83 7C F8 0E 81 7C EE 74 F0 00 1D B6 D1 77 2F BB D1 77 28 75 F0 00 D7 74 F0 00
D8 74 F0 00 C9 59 D2 77 EC DB D1 77 ED 09 93 7C 3F E9 80 7C EA DA D1 77 CE 1A D3 77 A8 CC 80 7C
D7 74 F0 00 69 BC 80 7C CA 5D 83 7C AF 74 F0 00 50 1A BD 77 D7 ED 80 7C C9 74 F0 00 CF B4 80 7C
F7 74 F0 00 0E 97 D1 77 1D 2F 81 7C B6 2B 81 7C F5 74 F0 00 0C B1 D3 77 57 C2 D1 77 9E C5 D1 77
85 0B 61 7D F3 74 F0 00 65 75 F0 00 78 34 83 7C F4 C7 17 5D 7E 74 F0 00 E4 9A 80 7C 2E 8C D1 77
F7 74 F0 00 E7 4A 81 7C 16 1E 80 7C D4 74 F0 00 BA 18 BD 77 C8 75 F0 00 F0 54 D2 77 C9 74 F0 00
77 75 F0 00 ED 75 F0 00 71 BE D1 77 E6 E6 EF 77 AD 75 F0 00 41 26 81 7C 6E 75 F0 00 D8 74 F0 00
F6 75 F0 00 B8 96 D1 77 77 0A 81 7C F0 75 F0 00 37 02 D3 77 76 2E 81 7C FC 74 F0 00 19 FF 80 7C
2A 83 EF 77 F0 6B DA 77 05 10 92 7C FD 74 F0 00 75 74 F0 00 23 C1 DC 77 5E A3 80 7C DB 75 F0 00
D4 A7 80 7C F2 75 F0 00 76 BD D1 77 27 74 F0 00 4B BE D1 77 57 74 F0 00 F5 DD 80 7C 80 5B EF 77
2D 75 F0 00 D6 74 F0 00 E7 74 F0 00 CA 75 F0 00 D4 4F A2 71 F1 75 F0 00 E3 E2 EF 77 05 A9 EF 77
59 22 83 7C 7C 75 F0 00 74 B9 80 7C F8 75 F0 00 87 5D EF 77 EC 75 F0 00 6F 2D D2 77 F9 74 F0 00
82 FE 80 7C F4 74 F0 00 14 E7 EF 77 D9 74 F0 00 AA 74 F0 00 42 8C D1 77 25 02 D3 77 2B F5 D2 77
02 E0 D2 77 28 74 F0 00 C7 74 F0 00 FD 74 F0 00 0D D6 D1 77 6F 75 F0 00 B2 C2 D1 77 32 75 F0 00
2F 75 F0 00 8C 0C D2 77 89 BE 80 7C 94 74 F0 00 88 C1 D1 77 5C 74 F0 00 F1 9E 80 7C 2A 74 F0 00
47 9B 80 7C E5 ED DA 77 97 CC 80 7C 27 74 F0 00 F6 8B D1 77 1A 75 F0 00 87 03 D3 77 33 FF D1 77
2E 75 F0 00 1E 31 32 76 28 74 F0 00 D4 05 93 7C FE AC EF 77 79 75 F0 00 05 B9 80 7C DA 11 81 7C
C7 86 D1 77 91 4A 1B 5D 09 B6 D1 77 77 DF 81 7C 6D 13 86 7C F1 B1 EF 77 C0 FF D2 77 B5 9F 80 7C
18 76 F0 00 58 74 F0 00 F9 D7 D1 77 EA 17 82 7C F8 9B 80 7C CA C6 D3 77 A1 B6 80 7C 02 00 D3 77
2C 74 F0 00 83 78 DA 77 E8 74 F0 00 05 C5 D1 77 B5 61 EF 77 D9 37 81 7C FC 38 81 7C 16 74 F0 00
7A 0D D3 77 D6 74 F0 00 DB 74 F0 00 D1 E1 D2 77 0C 8A 83 7C D5 74 F0 00 F0 74 F0 00 F4 EA DA 77
EE 86 82 7C E3 74 F0 00 6E 75 F0 00 73 75 F0 00 B0 0E 61 7D D9 74 F0 00 8A 18 93 7C 4C 74 F0 00
6F 75 F0 00 6C C9 D1 77 8F 5E 83 7C A2 BD D1 77 01 9E 80 7C D0 74 F0 00 EE 1E 80 7C 36 0A D2 77
24 1A 80 7C DA 75 F0 00 67 23 80 7C 79 75 F0 00 99 74 F0 00 BF 50 83 7C 1B C0 D1 77 FD 79 93 7C
8E 0B 81 7C CE 08 D2 77 83 F3 D2 77 69 EF D1 77 97 CC 80 7C 7D BC D1 77 8E BD D1 77 08 2F 81 7C
A9 74 F0 00 F3 74 F0 00 A4 74 F0 00 8A 05 D5 77 7D 74 F0 00 89 6F EF 77 59 74 F0 00 58 C0 80 7C
F0 5F EF 77 E7 74 F0 00 2D 74 F0 00 9D 86 D1 77 74 75 F0 00 00 00 00 00 04 00 B0 00 F5 01 0C 01
58 49 10 01 74 05 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 09 00 04 00 F1 01 08 01
00 00 BD 77 00 00 A4 71 00 00 17 5D 00 00 80 7C 00 00 D1 77 00 00 EF 77 00 00 32 76 00 00 DA 77
00 00 59 7D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
02 00 09 00 C8 01 0F 01 40 02 37 00 40 02 37 00 04 00 02 00 C6 01 0C 01 BC 06 00 00 14 01 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 00 04 00 00 10 00 01 10 02 37 00 10 02 37 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

好了 我们开始第二步

2.用ArmaDetach 和ArmInline.0.96.final.chs 辅助修复后 DUMP (开始和第一步是一样的 )
ArmaDetach 运行它 选择 COPYMEM-II 把原程序拖到里面
Filename: Armadillo.exe
Parent process iD:
Processing...

Professional Edition

Debug-Blocker protection detected
CopyMem-II protection detected
Memory-Patching Protections enabled
Import Table Elimination enabled
Nanomites Processing enabled

Crypto call found:
Child process iD:   这个是子进程的ID
Entry point:      这个是程序的OEP
Original bytes:   这个是程序开始的字节
Detached successfully :)      这个是成功提示了 ^_^

我们用OD附加458这个进程返回后来到这里
00448BB0- EB FE         jmp   short 00448BB0
00448BB2    90            nop
00448BB3    90            nop
00448BB4    FF68 D8         jmp   far fword ptr
00448BB7    5A            pop   edx
00448BB8    45            inc   ebp
00448BB9    0068 4C         add   byte ptr , ch
00448BBC    894400 64       mov   dword ptr , eax
00448BC0    A1 00000000   mov   eax, dword ptr
00448BC5    50            push    eax

这个时候呢 我们要修改开头的字节 这个就是工具里面的提示咯
Original bytes:   这个是程序开始的字节


到这里和第一步开始是一样的 好了 我们把这里的IAT替换成我们未加密的IAT 吧
CTRL+B FF25
0100B0107C802442kernel32.Sleep

这个就是IAT的开始 我们从这里替换掉他就可以了
好了 我们启用另外的工具
ArmInline.0.96.final.chs
IAT的基址100B010
大小添 1000就可以
处理好后 就可以用 LordPE 处理   DUMP
我们再找下IAT的头 就是488000了
Import 修复他 OEP48BB0 RAV 88000 大小1000 CUT掉无效的指针
到这里第二步结束

3.用Enjoy 修复CC
   分别选择原程序和修复好的程序 软件自动处理CC 呵呵 一会我把工具发来
好了 第三步结束 ^_^
4.用PeRebuilder减肥 这个直接把软件脱里面就OK了 ^_^

到这里脱壳结束 谢谢大家

--------------------------------------------------------------------------------
【经验总结】
1.PE的保护貌似最强就是这个样子了 DLL的还有待研究
2.我站在了巨人的肩膀上 ^_^

--------------------------------------------------------------------------------
【版权声明】: ^_^

                                                       2008年04月09日 下午 08:14:14

幻影¤雾之戀 发表于 2008-4-9 21:01:18

千里爱上了穿山甲.

py22 发表于 2008-4-10 02:14:23

厉害~收藏了仔细看

glassfox 发表于 2008-4-10 05:36:44

感谢楼主 菜鸟我最近也在研究这个壳... 真是好文.!

angelfish 发表于 2008-4-10 12:56:41

果然是好文……支持……:loveliness:

yunfeng 发表于 2008-4-15 19:15:35

有些地方没看明白,再好好消化消化

roking 发表于 2008-4-15 19:44:57

原帖由 千里之外 于 2008-4-9 20:15 发表 https://www.chinapyg.com/images/common/back.gif
用Enjoy 修复CC...

Enjoy这是个好工具/:good 用ArmInline修复有时不完全,用这个就好了。

ssss168 发表于 2008-4-18 18:01:49

想学习,能否来个动画教程

leafstone 发表于 2008-5-2 19:12:39

动画教程和试验用的程序~~谢谢~!
页: [1]
查看完整版本: Armadillo4.4主程序脱壳