找回密码
 立即注册
注册 登录
×
热搜: 活动 交友 discuz
查看: 128|回复: 2

一篇文章带你学会Armadillo脱壳

[复制链接]

1

主题

3

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2022-9-21 17:39:51 | 显示全部楼层 |阅读模式
0x1 Armadillo

0x1.1 保护机制

         Armadillo,中文名穿山甲,本意为犰狳,就是下面那个有点可爱的家伙。




         Armadillo主要采用了Debug-Blocker,CopyMem-II, Enable Import Table Elimination,Enable Nanomites Processing,Enable Memory-Patching Protections保护手段。同时也有单双进程之分,造成了保护手段的多样性。
         Debug-Blocker,称为阻止调试器,所谓反调试,基本只要开插件都可以过,所以这也是为什么大家脱穿山甲的时候打开IsProcessDebug去反调试选项和忽略异常的原因。
         CopyMem-II:双进程保护,最常使用的是bp OpenMutexA,然后转到401000 patch代码。另外一种是修改相反跳转的方法。(脚本方法就是不说了)
         Enable Import Table Elimination:IAT保护,修改Magic_Jmp。
         Enable Nanomites Processing就是CC保护,也是Armadillo最强大的保护机制。原理就是就是将程序中的部分代码改写为int3或者向其中插入int3代码。
0x1.2 前期侦壳

         知己知彼百战不殆,在脱壳最重要的就是侦壳。这里需要使用到的工具主要有:PEID(不推荐),exepeinfo,ArmaFP,任务管理器。
         其中,exepeinfo是用于查壳的,任务管理器是用于判断是单进程还是双进程,如果是双进程就需要双转单。ArmaFP是用于判断其保护模式,是标准模式,还是全保护模式(专业模式)。
         不过关于壳的版本,exepeinfo容易误报,所以可以使用这个方法:OD载入程序,下HE OutputDebugStringA断点。shift+F9中断后,看堆栈如果出现如下的,就是4.0以上的壳。这是由于Arm在4.0利用Od在调式保护格式串的消息时会奔溃而新增的反调试技术。



0x2 Armadillo单进程脱壳
0x2.1 标准单进程Armadillo 3.78 - 4.xx 脱壳
         这是最简单的加密方法,只需要修改Magic_Jmp就可以了,因为这个版本单进程防护只是加密了IAT,(1)只需要绕过加密,(2)并让其解压压缩区段即可。
         绕过IAT加密的方法就是修改Magic_Jmp,这是脱穿山甲壳必须使用的方法。步骤如下:
step1:在GetModuleHandle下硬件断点,可以HE GetModuleHandle或者HE GetModuleHandle+5。
Step2:然后Shift+F9,断下的时候,看堆栈窗口是否存在VirtualAlloc或者VirtualFree,只要出现这两个API函数,就表明快到了。



Step3:继续Shift+F9,只要堆栈出现kernel32.dll,但是不包含任何其他函数名称,表示到达了返回的时机。此时执行到返回ctrl+F9。如何判断之前执行到返回的时机是否正确呢,就是看是否存在LoadLibrary这个API函数。此时就是正确的。



此时就可以修改LoadLibrary函数下面的那个条件跳转(00715D12)为jmp,跳转到00425E5C,然后撤销之前的修改。



Step4:因为外壳肯定需要将存储在某一区段的数据解压到text段,需要对该段进行访问,所以,在内存窗口的程序的text段下访问断点。然后shift+F9。中断在43468F,然后单步,在此代码段的最后一个call ecx处步入就是OEP。





0x2.2 单进程Armadillo v4.x脱壳

         首先需要判断加壳版本是否是http://4.xxx。关于这点如何判断呢,主要下硬件断点 HE OutputDebugStringA 。在堆栈窗口出现%s%s%s%s的标志,说明这是4.X的壳。



关于Armadillo v4.x单进程脱壳把握两点,第一,使用Magic_Jmp避过IAT加密保护,对GetCurrentThreadId下断点找到OEP
         关于第一条,就是上面2.1讲的原则,下面解释第二条。首先对GetCurrentThreadId下断。HE GetCurrentThreadId。查看堆栈窗口,会出现如下结果.中间省略多个,查看关于GetCurrentThreadId都是来自其他模块的调用,但是最后一个是来自程序的调用。这就是程序返回的时机,所以,F8步过,根据之前说的规则,OEP在该程序段最后一个call ecx中。





2.3 加 PassWord单进程

         这是就比2.2多了一个密码验证,我们直接绕过密码验证就好。首先Shift+F9运行,通过查看导入表,在GetDlgItem处下断bpx GetDlgItem。然后在输入伪码按OK,程序中断在35359D0处.注意:先运行,在下断!在输入



接着修改魔法跳,可以使用bp GetModueHandle或者HE GetModuleHandle。这里发现了kernel32.dll就可以执行到返回查看了。
         然后就是找OEP,这里还是可以使用2.2中对GetProcessId下断。这里介绍个新方法。**可以在内存窗口.text段按F2下断点。因为壳执行完肯定会执行代码段的内容。也就是说代码段是由外壳到源程序的一扇门。所以在此处下断必然成立。



总结一下,现在有两个方法可以找OEP。第一是对GetProcessId下断,第二个就是在.text下断。
0x2.4 包含Code Splicing和Import Table Elimination的修复

         Armadillo使用Code Splicing和Import Table Elimination两项技术使得程序修复变得更加困难。幸好有大佬开发了ArmInline工具可以使得修复变得简单一些。注意:本节只将修复,不讲程序优化。
         当我们寻找到OEP之后,就可以着手修复Code Splicing和Import Table Elimination了。



首先祭上大杀器ArmInline,欲要善其事,必先利其器。需要我们填写的就是上述三个区域,不过我这个版本可以自动填写修复的数据,只需要知道我们需要修复的进程,如图,目标进程ID为FC4,选中后依次删除拼接代码和巡回IAT基址。




         然后按照常规的方法dump和修复IAT就可以了。注意的是使用PELord一定要勾选从磁盘粘贴文件头(一般默认勾选上了)
         如果你的ArmInline不能自己修复,关于Code Splicing的修复可以这样,Alt+M到内存窗口,在fraps模块之后有一段内存没有被其他模块映射,在最后一块内存处,就是拼接代码起点。

回复

使用道具 举报

0

主题

3

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2025-2-11 14:38:01 | 显示全部楼层
我擦!我要沙发!
回复

使用道具 举报

0

主题

1

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2025-2-27 23:25:56 | 显示全部楼层
沙发???
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| 黑客通

GMT+8, 2025-4-6 10:44 , Processed in 0.156904 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2020, LianLian.

快速回复 返回顶部 返回列表