首页
社区
课程
招聘
[分享]菜鸟也学Armadillo 脱壳全保护加壳的记事本.doc
发表于: 2010-4-12 11:01 6159

[分享]菜鸟也学Armadillo 脱壳全保护加壳的记事本.doc

2010-4-12 11:01
6159
菜鸟也学Armadillo 加壳的记事本(KuNGBim大侠的测试版本)
【软件名称】Armadillo V4.40
【应用平台】WinXP SP2
【作者邮箱】chubing6143@sina.com
【使用工具】OllyDbg1.10,FLY大侠的Get.eXe.PE.Information.osc、DebugActiveProcess.osc、Armadillo.fiXed.IT.osc,ArmInline v0.96,WINHEX,ArmaDetach
【参考】FLY大侠的破文:http://bbs.pediy.com/showthread.php?threadid=18215
【脱壳过程】下载了ha[1].armadillo.findprotected.v1.3,其中有KuNGBim大侠测试使用的Armadillo 加壳的记事本,正好作为练手了。但是从看雪精华中学习了很多篇文章,没有一个方法是可以完全复制下来对付该壳的,例如http://bbs.pediy.com/showthread.php?threadid=23090原文中提到补丁之前的都没有问题,但是“建议用fly大侠的Armadillo V4.0-V4.4.Standard.Protection脚本完成”这个步骤对付该壳就不好使了,http://bbs.pediy.com/showthread.php?threadid=22134文中提到的IAT修改的方法对于该程序也不好使了,不知道是我天资愚笨,还是其它,后来仔细研究FLY大侠的“http://bbs.pediy.com/showthread.php?threadid=18215”,结合自己摸索,以及前后的一些贯通,终于完成脱壳了,为此,记录下来仅供我等菜鸟节约点时间,高手飘过。首先感谢上述大侠的无私奉献,为此,我决定为菜鸟们无私,让大侠们笑笑(水平太洼!呵呵!)。

利用Armadillo Find Protected察看该记事本
<------- 12-04-2010 09:46:36 ------->
D:\ test.EXE
!- Protected Armadillo
Protection system (Professional)
!- <Protection Options>
Debug-Blocker
CopyMem-II
Enable Import Table Elimination
Enable Strategic Code Splicing
Enable Nanomites Processing
Enable Memory-Patching Protections
!- <Backup Key Options>
Variable Backup Keys
!- <Compression Options>
Best/Slowest Compression
!- <Other Options>
Store Environment Vars Externally
Allow Only One Copy
Disable Monitoring Thread
?- Signature 447E2E00 01-06-2006
一、OEP
将目标程序拖到ArmaDetach中
Filename: test.EXE
……
Entry point:        [01006420]
可以轻松知道OEP为01006420,当然也可以在完成第三步之后,利用BP CreateThread+5下断,然后跟踪到call ecx时,F7进去也能发现OEP(参见我写的“菜鸟也学Armadillo V4.40主程序脱壳”),但是经过我个人总结发现对付该软件没有多大意义,而这样最省事了。
二、DebugActiveProcess
设置OllyDBD忽略所有异常选项。

载入test.exe,用IsDebug插件去掉OllyDBD的调试器标志。
0105A000 test.>  60                    pushad
0105A001         E8 00000000           call test.0105A006
0105A006         5D                    pop ebp
0105A007         50                    push eax
0105A008         51                    push ecx
0105A009         0FCA                  bswap edx
0105A00B         F7D2                  not edx
0105A00D         9C                    pushfd
0105A00E         F7D2                  not edx
0105A010         0FCA                  bswap edx
0105A012         EB 0F                 jmp short test.0105A023
每次运行脚本前必须清除以前的所有断点!  
现在运行DebugActiveProcess.osc

子进程ID=0000004B4,开始4个字节EP Code=00000E860
“确定”后,此脚本完成任务,保留此OllyDBG不动。
三、Armadillo.fiXed.IT
新运行一个OllyDBG,Attach上ID=0000004B4的子进程test.exe
7C921231         C3                    retn
此时,什么都不要做,请直接运行Armadillo.fiXed.IT.osc,脚本提示:

“确定”后F12,OllyDBG暂停在EP死循环处
0105A000 test.>- EB FE                 jmp short test.<ModuleEntryPoint>
0105A002         0000                  add byte ptr ds:[eax],al
0105A004         0000                  add byte ptr ds:[eax],al
还原EP Code的EBFE为60E8,还原后为:
0105A000 test.>  60                    pushad
0105A001         E8 00000000           call test.0105A006
0105A006         5D                    pop ebp
Resume脚本,等待一段时间后,出现提示对话框,确定之
00A3E083         FF15 2871A400         call dword ptr ds:[A47128]            ; kernel32.VirtualProtect
00A3E089         A0 6C13A500           mov al,byte ptr ds:[A5136C]           ; 脚本运行完毕暂停在这里
在目标程序test.exe目录下脚本自动dump出一个文件:SaveIat000497FA8.bin
此文件保存的就是所有乱序前的正确函数地址
00A3E08E         8885 14A9FFFF         mov byte ptr ss:[ebp+FFFFA914],al
00A3E094         0FB685 14A9FFFF       movzx eax,byte ptr ss:[ebp+FFFFA914]
00A3E09B         85C0                  test eax,eax
00A3E09D         74 1D                 je short 00A3E0BC
00A3E09F         6A 00                 push 0
00A3E0A1         FFB5 CCB0FFFF         push dword ptr ss:[ebp+FFFFB0CC]
00A3E0A7         8B85 0CD8FFFF         mov eax,dword ptr ss:[ebp-27F4]
00A3E0AD         0385 BCB0FFFF         add eax,dword ptr ss:[ebp+FFFFB0BC]
00A3E0B3         50                    push eax
00A3E0B4         E8 5E120000           call 00A3F317                         ; 单步运行到此处,解密CALL,修改堆栈值,此时察看堆栈为:
――――――――――――――――――――――――――
000694FC    01001000    test.01001000
00069500    00006601
――――――――――――――――――――――――――
其实就是解密PE header下面区段的代码,修改为6600
在数据窗口里定位01001000,F8步过上面CALL时会发现01001000段的代码已经全部解密出来了!
00A3E0B9         83C4 0C               add esp,0C
00A3E0BC         8B85 FCD7FFFF         mov eax,dword ptr ss:[ebp-2804]
00A3E0C2         8BB5 0CD8FFFF         mov esi,dword ptr ss:[ebp-27F4]
00A3E0C8         2B70 34               sub esi,dword ptr ds:[eax+34]
00A3E0CB         E8 6D2F0000           call 00A4103D
00A3E0D0         F7D8                  neg eax
00A3E0D2         1BC0                  sbb eax,eax
00A3E0D4         25 00100000           and eax,1000
00A3E0D9         03F0                  add esi,eax
00A3E0DB         89B5 C4B0FFFF         mov dword ptr ss:[ebp+FFFFB0C4],esi
00A3E0E1         83A5 C8B0FFFF 00      and dword ptr ss:[ebp+FFFFB0C8],0
00A3E0E8         EB 0D                 jmp short 00A3E0F7
00A3E0EA         8B85 C8B0FFFF         mov eax,dword ptr ss:[ebp+FFFFB0C8]
00A3E0F0         40                    inc eax
00A3E0F1         8985 C8B0FFFF         mov dword ptr ss:[ebp+FFFFB0C8],eax
00A3E0F7         8B85 C8B0FFFF         mov eax,dword ptr ss:[ebp+FFFFB0C8]
00A3E0FD         8B8D 24D9FFFF         mov ecx,dword ptr ss:[ebp-26DC]
00A3E103         833C81 00             cmp dword ptr ds:[ecx+eax*4],0
00A3E107         0F84 90000000         je 00A3E19D
00A3E10D         8B85 C8B0FFFF         mov eax,dword ptr ss:[ebp+FFFFB0C8]
00A3E113         8B8D 24D9FFFF         mov ecx,dword ptr ss:[ebp-26DC]
00A3E119         8B95 0CD8FFFF         mov edx,dword ptr ss:[ebp-27F4]
00A3E11F         031481                add edx,dword ptr ds:[ecx+eax*4]
00A3E122         8995 B8B0FFFF         mov dword ptr ss:[ebp+FFFFB0B8],edx
00A3E128         8B85 B8B0FFFF         mov eax,dword ptr ss:[ebp+FFFFB0B8]
00A3E12E         8B00                  mov eax,dword ptr ds:[eax]
00A3E130         8985 B4B0FFFF         mov dword ptr ss:[ebp+FFFFB0B4],eax
00A3E136         81BD B4B0FFFF 9090909>cmp dword ptr ss:[ebp+FFFFB0B4],90909>
00A3E140         74 56                 je short 00A3E198
00A3E142         8B85 B4B0FFFF         mov eax,dword ptr ss:[ebp+FFFFB0B4]
00A3E148         2B85 C4B0FFFF         sub eax,dword ptr ss:[ebp+FFFFB0C4]
00A3E14E         8985 B4B0FFFF         mov dword ptr ss:[ebp+FFFFB0B4],eax
00A3E154         FFB5 B4B0FFFF         push dword ptr ss:[ebp+FFFFB0B4]
00A3E15A         8B85 C8B0FFFF         mov eax,dword ptr ss:[ebp+FFFFB0C8]
00A3E160         33D2                  xor edx,edx
00A3E162         6A 17                 push 17
00A3E164         59                    pop ecx
00A3E165         F7F1                  div ecx
00A3E167         FF1495 A877A400       call dword ptr ds:[edx*4+A477A8]
00A3E16E         59                    pop ecx
00A3E16F         8985 B4B0FFFF         mov dword ptr ss:[ebp+FFFFB0B4],eax
00A3E175         8B85 B4B0FFFF         mov eax,dword ptr ss:[ebp+FFFFB0B4]
00A3E17B         8B8D E4D7FFFF         mov ecx,dword ptr ss:[ebp-281C]
00A3E181         8D0481                lea eax,dword ptr ds:[ecx+eax*4]
00A3E184         8985 B4B0FFFF         mov dword ptr ss:[ebp+FFFFB0B4],eax
00A3E18A         8B85 B8B0FFFF         mov eax,dword ptr ss:[ebp+FFFFB0B8]
00A3E190         8B8D B4B0FFFF         mov ecx,dword ptr ss:[ebp+FFFFB0B4]
00A3E196         8908                  mov dword ptr ds:[eax],ecx
00A3E198       ^ E9 4DFFFFFF           jmp 00A3E0EA
00A3E19D         A0 6C13A500           mov al,byte ptr ds:[A5136C]           ; 这里处理结束,下断,Shift+F9中断下来。
设置1007600(1001000+6600,即解密CALL运行时堆栈中察看到的值)为完整权限,
把SaveIat000497FA8.bin里面的有序地址全部粘贴到1007600处。
注意,我们要先去掉非函数地址的数据。利用WinHEX察看SaveIat000497FA8.bin文件可以看到
000002F0   D6 48 34 76 CE 00 33 76  DF 7C A2 00 CA 7D A2 00   諬4v?3v遼?蕔?
自0X2F8后明显不是正确的地址,就可以全部删除了。
在WINHEX中选中BLOCK 00000000-00000300,然后Copy Block-〉Hex Values

然后回到OD中,CTRL+G,输入1007600,然后选中要粘贴的区域,然后进行二进制粘贴
FD D5 DC 77 7D 8F DC 77 C8 6F DA 77 CC D7 DA 77 1B 76 DA 77 83 78 DA 77 F0 6B DA 77 AE 7C A2 00
E5 7E EF 77 CF 44 F2 77 8A 5A EF 77 90 5B EF 77 FB 5E EF 77 F2 7D EF 77 5F 39 F2 77 26 F1 F0 77
C9 DD F0 77 51 E0 F0 77 98 6E EF 77 94 6C F0 77 D6 7F EF 77 99 99 EF 77 2D 6C EF 77 26 D5 EF 77
3D 6D F0 77 1A 9A EF 77 91 BE EF 77 94 83 EF 77 E1 61 EF 77 65 EE F1 77 C7 9A EF 77 AE 7C A2 00
B1 2E 83 7C 82 FE 80 7C 19 FF 80 7C 31 03 93 7C 40 03 93 7C A1 B6 80 7C 76 2E 81 7C EE 1E 80 7C
6D 0C 81 7C 8E 93 80 7C 2F FC 80 7C 62 15 81 7C C6 97 80 7C 60 07 81 7C 64 BA 80 7C EF B9 80 7C
2F 99 80 7C A0 AD 80 7C 83 6F 81 7C 32 0F 81 7C D7 ED 80 7C E1 EE 80 7C CC A9 80 7C 8D 99 80 7C
09 9A 80 7C 8F 4B 83 7C 5E A3 80 7C 1D 2E 83 7C 36 96 87 7C 77 1D 80 7C 96 A9 80 7C DC B7 80 7C
D3 3F 83 7C 75 37 83 7C 10 9F 80 7C D4 A7 80 7C 44 20 83 7C D4 A0 80 7C 05 B9 80 7C 64 BF 80 7C
BC 25 83 7C 31 1F 83 7C 87 0D 81 7C F8 9B 80 7C 74 B9 80 7C 47 9B 80 7C 15 99 80 7C 27 09 83 7C
57 7D A2 00 67 9D C0 77 EB EE BE 77 A4 F1 BE 77 75 D6 C1 77 D8 23 C3 77 2F EE C1 77 DB F1 BE 77
7C 53 C0 77 AC 17 C3 77 7E 9E C0 77 AE 2D C0 77 9A 9E C0 77 94 5C C0 77 A3 AE C1 77 3D AB C1 77
6B 80 C1 77 36 D0 BE 77 77 CE BE 77 2F 80 C1 77 95 7D A2 00 12 07 5E 7D E0 70 64 7D 3B 24 63 7D
AE AF 5F 7D 95 7D A2 00 BC DF D2 77 C6 91 D1 77 11 12 D2 77 28 F7 D2 77 F9 D7 D1 77 9A DB D1 77
44 37 D2 77 EC DB D1 77 F5 B5 D1 77 8C 17 D6 77 69 D8 D1 77 AF BA D2 77 C8 BD D1 77 76 BD D1 77
DA 5C D2 77 58 BF D1 77 9D 86 D1 77 C7 86 D1 77 60 DA D1 77 2C 66 D2 77 CB 8C D1 77 F0 BE D1 77
EA 12 D2 77 F2 60 D6 77 ED E5 D1 77 2F EA D1 77 E2 16 D2 77 BA B8 D1 77 8B 14 D3 77 CD 48 D2 77
3C B3 D1 77 1E C2 D1 77 4C 1F D3 77 EA DA D1 77 4B BE D1 77 27 BE D1 77 7F AF D1 77 FE DA D1 77
01 8A D1 77 F6 8B D1 77 1E 94 D1 77 50 EC D1 77 A6 88 D1 77 9D 8F D1 77 36 BC D1 77 8E 1A D3 77
3D 02 D3 77 3E F1 D2 77 4F 02 D3 77 14 94 D2 77 B6 A9 D1 77 7A 5C D2 77 50 62 D2 77 AD 47 D2 77
9B 92 D1 77 70 DB D1 77 38 1D D2 77 2B D6 D1 77 EE 84 D2 77 71 BE D1 77 B6 CD D1 77 36 9E D1 77
9F 03 D3 77 69 9D D1 77 34 AF D1 77 D2 90 D1 77 A4 D8 D1 77 AE B6 D1 77 46 DF D2 77 50 FF D1 77
9A 7D A2 00 90 60 F7 72 49 57 F7 72 90 53 F7 72 9A 7D A2 00 96 86 33 76 F3 7C 33 76 65 7C 33 76
29 9D 34 76 CA 86 33 76 86 19 32 76 A9 C4 33 76 D6 48 34 76 CE 00 33 76 00 00 00 00 00 00 00 00
00
接着我们来修复这些乱序的输入表函数,Patch代码如下。在00A3E19D处开始输入以下代码:
00A3E19D         60                    pushad
00A3E19E         8BB5 E4D7FFFF         mov esi,dword ptr ss:[ebp-281C]
00A3E1A4         8BBD 24D9FFFF         mov edi,dword ptr ss:[ebp-26DC]
00A3E1AA         833F 00               cmp dword ptr ds:[edi],0
00A3E1AD         74 2E                 je short 00A3E1DD
00A3E1AF         8B07                  mov eax,dword ptr ds:[edi]
00A3E1B1         05 00000001           add eax,1000000
00A3E1B6         8B10                  mov edx,dword ptr ds:[eax]
00A3E1B8         BB 00760001           mov ebx,1007600   ;IAT 开始地址
00A3E1BD         81FA 90909090         cmp edx,90909090
00A3E1C3         74 13                 je short 00A3E1D8
00A3E1C5         8B12                  mov edx,dword ptr ds:[edx]
00A3E1C7         3B13                  cmp edx,dword ptr ds:[ebx]
00A3E1C9         74 0B                 je short 00A3E1D6
00A3E1CB         83C3 04               add ebx,4
00A3E1CE         81FB 00790001         cmp ebx,1007900   ;IAT 结束地址
00A3E1D4       ^ 7C F1                 jl short 00A3E1C7
00A3E1D6         8918                  mov dword ptr ds:[eax],ebx
00A3E1D8         83C7 04               add edi,4
00A3E1DB       ^ EB CD                 jmp short 00A3E1AA
00A3E1DD         61                    popad
00A3E1DE         90                    nop
或利用OllyDBG二进制代码复制,然后进行修改。
60 8B B5 E4 D7 FF FF 8B BD 24 D9 FF FF 83 3F 00 74 2E 8B 07 05 00 00 00 01 8B 10 BB 00 76 00 01
81 FA 90 90 90 90 74 13 8B 12 3B 13 74 0B 83 C3 04 81 FB 00 79 00 01 7C F1 89 18 83 C7 04 EB CD
61 90
在00A3E1DE处下断点,然后F9在00A3E1DE中断后乱序输入表修复完毕。

因为下面Armadillo还要再对代码段加密,所以此时运行LordPE完全dump出此进程!注意PID选择要正确。

然后运行ImportREC,OEP=6420,RVA=0007600,Size=00000300,获取输入表,Cut掉几个填充在DLL间的垃圾数据,DUMP FIX。
四、手动处理code splicing
该程序还需要将code splicing手动处理,ALT+M察看内存,发现如下内存段:
内存映射,项目 61
地址=01690000
大小=00015000 (86016.)
Owner=         01690000 (itself)
区段=
类型=Priv 00021020,此处是关键了
访问=R E
初始访问=RWE
打开lordpe,找到目标进程,选择区域脱壳(第三个选项),找到地址=01690000
然后把这部分dump出来,为Region01690000-01695000.dmp,然后用lordpe--点pe editor,打开dumped_.exe,点sections,右键,第三个选项,从磁盘导入section,选择刚才的Region01690000-01695000.dmp,导入后,右键,选edit section header
修改virtual address为 01690000-01000000=0690000,然后设置lordpe的选项,把rebuilder里面的选项全部去掉,只保留LordPE的“Validate PE”选项,重建PE。搞定收工。

将 KuNGBim大侠的测试版本 的附上。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
呵呵,学习一下
2010-4-13 23:58
0
游客
登录 | 注册 方可回帖
返回
//