首页
社区
课程
招聘
[原创]Android加壳与脱壳学习(4)—— 一代壳脱壳工具集
2022-10-20 12:02 18737

[原创]Android加壳与脱壳学习(4)—— 一代壳脱壳工具集

2022-10-20 12:02
18737

Android加壳与脱壳(3)——一代壳脱壳工具集

目录

一、前言

在前面的文章中我们已经讲述了Android加壳与脱壳的基本原理,也制作了简易的加壳机,本文主要分享一些网络上常使用的开源脱壳工具,这里收集并整理了,方便逆向工作者针对一代壳进行简易脱壳。

二、工具介绍

1.场景1

假设你手里有一台已经root过的测试机,但目前什么工具都没有安装,你想使用这部机器进行脱壳,你可以方便使用哪些工具呢?

1.1 Frida

你考虑使用frida,这里你可以考虑两种方案,第一自己写Frida脚本,看过我前面整体加壳和脱壳原理的,这里应该十分容易,这种方法更加具有灵活性,其次你可以使用网络上的开源框架,这里推荐使用网络上葫芦娃大佬的框架FRIDA-DEXDump

1.1.1 自定制脚本

根据脱壳原理选择脱壳点,然后编写相应的hook脚本,然后通过frida进行hook上即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
var savepath = "/sdcard/"
function savedexfile(dexfileptr) {
    try {
        //将mCookie转换为对应的dexfile内存指针
        var dexfilebegin = ptr(dexfileptr).add(Process.pointerSize*1).readPointer(); //dex的初始指针
        var dexfilesize = ptr(dexfileptr).add(Process.pointerSize*2).readU32(); //dex的大小
        var dex = new File(savepath+"_"+dexfilesize+".dex","a");
        if(dex!=null){
            var content = ptr(dexfilebegin).readByteArray(dexfilesize);
            dex.write(content);
            dex.flush();
            dex.close();
            console.warn("[dumpdex]"+savepath+"_"+dexfilesize+".dex");
        }
    } catch (e) {
 
    }
}
 
 
function dumpDexBymCookie() {
    Java.perform(function () {
       var DexFileClass = Java.use("dalvik.system.DexFile");
       Java.choose("dalvik.system.DexFile",{
           onMatch:function (dexfile) {
               var mCookie = dexfile.mCookie.value;
               //获取类列表和dex路径
            //    var classlist = DexFileClass.getClassNameList(mCookie);
            //    classlist.forEach(function (classname) {
            //        console.log(dexfile.mFileName.value+"->"+classname);
            //    })
               //console.log(mCookie.$className);
               var Array = Java.use("java.lang.reflect.Array");
               var size = Array.getLength(mCookie);
               var i = 0;
               for(i=0;i<size;i++){
                   //console.log(i+"->"+Array.getLong(mCookie,i));
                   var longvalue = Array.getLong(mCookie,i);
                   var dexfilestr = ptr(longvalue + "");
                   //console.log(dexfilestr);
                   savedexfile(dexfilestr)
                }
 
           },onComplete:function () {
               console.warn("Search DexFile over!");
           }
       })
    })
}
1.1.2 FRIDA-DEXDump

葫芦娃大佬的框架针对第一代壳也十分好用,不想自己编写脚本的朋友,可以直接使用工具

 

工具链接:FRIDA-DEXDump

 

使用说明:

 

 

我们简单演示一下,这里结合objection一起使用

 

image-20221016154708131

1.1.3 缺陷

使用Frida的脱壳方式,需要root和frida两个要求,但是现在很多设备会对root进行检测以及frida进行检测,这样使得这种方式就不能很好的处理,当然针对root检测和frida检测都有相应的对抗方式,比如定制root以及定制frida,但是这样都比较麻烦。

1.2 Xposed

比如这里我们遇到frida检测了,我们还可以在我们的设备上安装Xposed,通过编写Xposed模块来进行脱壳,Xposed脱壳原理和frida没有区别,只是编程语言有差异而已,这里我们直接给出一些已经开源的Xposed的模块

 

Xposed的安装十分简单:

1
2
3
4
5
6
7
8
9
10
11
12
(1) 4.4以下Android版本安装比较简单,只需要两步即可
    1.对需要安装Xposed的手机进行root
    2.下载并安装xposedInstaller,之后授权其root权限,进入app点击安装即可
    但是由于官网不在维护,导致无法直接通过xposedinstaller下载补丁包
2)Android 5.0-8.0 由于5.0后出现ART,所以安装步骤分成两个部分:xposed.zip
    XposedInstaller.apk,zip文件是框架主体,需要进入Recovery后刷入,apk文件用于Xposed管理
    1.完成对手机的root,并刷入reconvery(比如twrp),使用Superroot
    2.下载你对应的zip补丁包,并进入recovery刷入
    3.重启手机,安装xposedInstaller并授予root权限即可
    官网地址:https://dl-xda.xposed.info/framework/
3)由于Android 8.0后,Xposed官方作者没有再对其更新,我们一般就使用国内大佬riyu的Edxposed框架
    Magisk + riyu + Edxposed

这里收集了网上开源的Xposed脱壳模块,其中以FDex2和反射大师较为经典

 

image-20221016155539952

 

这里我们拿反射大师为例:

1.2.1 反射大师

反射大师的使用流程十分简单,首先我们安装Xposed并装上反射大师的模块,打开反射大师

 

image-20221016191354324

 

我们选择要脱壳的目标进程

 

image-20221016191430678

 

然后我们再次打开目标进程,点击中间的六芒星,然后选择当前Activity

 

image-20221016191545887

 

然后我们写出Dex,就可以脱下dex文件,并在保存路径中可以拿出来

 

image-20221016191641937

1.2.2 FDex2

FDex2的原理更加简单,利用两个可导出的apigetDex、getBytes,使用流程也十分简单,直接单开选择目标进程hook即可

 

image-20221016191838251

1.2.3 缺陷

Xposed的安装较frida麻烦,最主要遇到检测Xposed的样本可能就无法使用,但是我们也可以对Xposed进行定制

1.3 Xposed+Frida

1.3.1 DITOR

我们知道除了Xposed现在还有很多frida持久化的方案,这里我们就是一个支持Xposed动态注入和frida注入的模块

 

image-20221020113606544

 

这里你可以选择动态注入但是安装Xposed,你也可以选择frida注入,后面我们演示了xposed,这里我们主要演示frida

 

image-20221020113800032

 

你可以选择内置脚本,自己也可以将我们前面写的脱壳脚本上传,这里我们就选内置脚本

 

image-20221020113848991

 

选择一个脚本,配置成功,我们可以选择对应的模式,这里不同模式针对不同壳,这里我就选择通用模式

 

image-20221020113953291

 

然后就可以脱壳成功,这里如果不成功可能是系统与脱壳脚本不匹配等问题

2.场景2

此时你拿到一些样本,你发现这个样本检测frida、检测Xposed、检测root,然后你不知道如何解决

2.1 Fart

Fart是寒冰大佬定制的针对Art的主动调用脱壳机,适用于一代壳和二代抽取壳

 

Fart现在开源出来的版本包含:

1
2
Fart原始版:无法应对root检测
Fart8:抹除了指纹,可以应对root检测

Fart的使用很简单,可以配合寒冰大佬的定制版jadx来进行恢复抽取壳,本文主要针对第一代壳的解决

 

使用说明:https://github.com/hanbinglengyue/FART

2.2 定制化系统

我们学习Fart的原理,可以发现第一代壳的定制化是很容易实现的,是在一些脱壳点进行插桩,然后保存dex,例如LoadMethod、DexFile等等

 

我们在源码编译(1)——Android6.0源码编译详解中已经讲述了如何编译源码,接下来我们进行插桩脱壳

 

同理、还是定位脱壳点,我们还是随便定位一个脱壳点LoadMethod 然后进行插桩

 

image-20220613220518548

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//add
char dexfilepath[100]=0;
memset(dexfilepath,0,100);
sprintf(dexfilepath,"%d_%zu_LoadMethod.dex",getpid(),dex_file.Size());
int dexfd = open(dexfilepathm,O_CREAT|O_RDWR,666);
if(dexfd>0){
    int result = write(dexfd,dex_file.Begin(),dex_file.Size());
    if(result>0){
        close(dexfd);
        LOG(WARNING)<<"LoadMethod"<<dexfilepath;
    }
 
}
//add

同理我们在execute同样插桩此段代码,最后进行编译,编译成功

 

image-20220613172222202

 

然后给程序授权sdcard权限,再次启动应用,就可以看见脱取的dex文件就保存在sdcard目录下

 

image-20220613215956911

 

再次将sdcard下dex文件打开,这里我们已经看见了8732435这个文件,再次打开脱取成功

 

image-20220613172222202

2.3缺陷

定制系统的方法对抗一代壳还是十分适用的,不过缺点是定制系统流程较为复杂,而且复杂的壳还可以通过检验crc码、对write进行hook来进行对抗

3.场景3

假如我们现在不想定制系统,样本也进行frida、Xposed的强检测

3.1动态调试

我们可以使用IDA、GDB进行动态调试,原理还是一样,找到脱壳点,编写相应的脚本即可

 

所谓动态调试法,核心原理和上面一样,就是我们在动态调试的过程中找到DexFile的起始地址和大小,然后执行脚本进行dump

 

首先选取脱壳点,我们还是选择DexFile::DexFile

 

image-20220613210130186

 

动态调试的步骤我在前面的文章中已经做了详细的讲解,不会的朋友去看前面的文章

 

首先我们启动android_server

 

image-20220613194111711

 

然后我们附加上进程

 

image-20220613194326114

 

image-20220613195349008

 

image-20220613203024990

 

然后我们打开libart.so,并定位到DexFile::DexFile

 

image-20220613210859021

 

然后在该函数下断点,然后F9过来

 

image-20220613211145356

 

此处我们就可以很明显看到X1就是我们的起始地址,X4是我们的偏移值

 

编写脚本进行hook

1
2
3
4
5
6
7
8
9
10
11
static main(void){   
    auto fp, begin, end, dexbyte;     
    fp = fopen("d:\\dump.dex", "wb+");     
    begin =  0x76FCD93020;   
    end = begin + 0x7EEC5600;
    for ( dexbyte = begin; dexbyte<end;dexbyte++)
    {
    fputc(Byte(dexbyte), fp);       
    }  
 
}

image-20220613214647627

 

直接运行run

 

然后我们查看dump.dex文件

 

image-20220613215148251

 

我们可以发现这里是代理类,还没有到我们想要的dex,我们再次F9,再次到这里,地址再次改变,再次结合长度来计算,我们每次计算可以取小点值,先试一下

 

image-20220613215343895

 

发现还是不是,我们需要不停测试直到dump出dex为此

 

这里大家可以下去按照此方法尝试,或者换一个脱壳点来尝试

3.2缺陷

动态调试的方式遇到强反调的样本,就无法很好的使用了

4.场景4

假如我们的手机连root都无法做到,现在就是一个未解锁的正常手机,如何应对

4.1BlackDex

BlackDex利用虚拟化的技术,也就是IO重定向,原理和Vitualbox一致,好处是无需root,无需hook可以进行脱壳

 

我们打开BlackDex

 

image-20221016193325544

 

我们只需要点击相应的应用,就可以进行脱壳

 

image-20221016193358469

4.2 MT管理器

MT管理器是一个功能十分强大的逆向工具,一键傻瓜式逆向,收费不过相对偏移,可以针对简易的壳一键脱壳

 

image-20221016194126560

4.3 NP管理器

NP管理器类似MT管理器,同样功能十分强大,关键是不收费,没错作者很nice,免费!!!

 

image-20221016194657276

 

同样是功能十分的强大,还有加壳,绕过反调,去签等各种功能

4.2缺陷

这种方法十分适用,但难以应对虚拟化检测的样本,也无法解决后面的加壳技术

5.场景5

假如我们还是正常的手机,无法root,但是我们想要获得hook、root等一些操作,而且适配更多系统

5.1 手机虚拟机(VMOS)+Xposed

VMOS是一款手机虚拟机,让你无需root,自由切换安卓系统,一键开通root和Xposed权限,结合我们前面的脱壳模块,彻底掌握傻瓜式脱壳的快乐

 

image-20221020111259647

 

VMOS可以提供不同版本的Android系统虚拟机,你可以根据需求来使用,这里我们拿Android7.1版来举例实操

 

开启虚拟机已经支持了Xposed和root权限,我们再安装上wifiadb,就可以十分方便的进行逆向工作了

 

image-20221020112024592

 

我们测试一下root权限

 

image-20221020112322217

 

然后这里我们使用DITOR的脱壳模块进行快速脱壳

 

打开模块,我们可以选择动态注入就是Xposed,以及此模块还支持frida注入,但是虚拟机不支持frida,这里我们就选择动态注入

 

image-20221020112203767

 

 

这里我们选择需要脱壳的目标应用,这里就选第一个

 

image-20221020112749115

 

image-20221020112810032

 

image-20221020112840431

 

然后我们把保存的dex打开

 

image-20221020112930742

 

成功的脱壳,这样是不是脱壳工作变得十分简单了

5.2手机虚拟机(光速)+Magisk+Xposed

我们可以安装手机虚拟机,例如光遇虚拟机,然后在虚拟机中安装Magisk,安装Xposed,这样我们就可以使用前面功能,还可以应对更多场景

 

image-20221016193759059

 

image-20221016193834221

 

这样是不是一些有Magisk需求的朋友也可以快速的进行使用了

5.3 缺陷

在一些场景还是受限,比如无法支持frida等

三、总结

本文针对第一代壳的工具进行了整理和收集,助力大家进行快速的工作,本文的工具整理并上传知识星球,大家也可以前往微信公众号(安全后厨)回复:脱壳工具集,来获取工具集

 

后续也会上传github

 

github:https://github.com/WindXaa/Android-reverse


[CTF入门培训]顶尖高校博士及硕士团队亲授《30小时教你玩转CTF》,视频+靶场+题目!助力进入CTF世界

最后于 2022-10-20 12:05 被随风而行aa编辑 ,原因:
收藏
点赞12
打赏
分享
最新回复 (16)
雪    币: 53
活跃值: (603)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chenai2019 2022-10-20 17:03
2
0
blackdex脱壳后到dex怎么合并呢,多个dex切换有点麻烦
雪    币: 5535
活跃值: (7156)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
以和爲貴 1 2022-10-21 08:23
3
0
太全面了,感谢大佬
雪    币: 8759
活跃值: (3194)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chengdrgon 2022-10-21 10:57
4
0
感谢分享
雪    币: 7745
活跃值: (21142)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
随风而行aa 10 2022-10-21 14:55
5
0
chenai2019 blackdex脱壳后到dex怎么合并呢,多个dex切换有点麻烦
这个多dex是根据脱壳点脱出的,这个一般可以写脚本检索主类,然后选择合适dex 
雪    币: 7745
活跃值: (21142)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
随风而行aa 10 2022-10-21 14:55
6
0
以和爲貴 太全面了,感谢大佬[em_67]
谢谢支持
雪    币: 7745
活跃值: (21142)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
随风而行aa 10 2022-10-21 14:55
7
0
chengdrgon 感谢分享
谢谢支持
雪    币: 198
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gqdsc 2022-10-26 11:01
8
0
关键脱壳后的修复什么,希望大佬再来个教程
雪    币: 7745
活跃值: (21142)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
随风而行aa 10 2022-10-26 15:38
9
0
gqdsc 关键脱壳后的修复什么,希望大佬再来个教程
后面会出系列教程的
雪    币: 230
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_undcejfq 2022-10-28 11:27
10
0
有没有交流群
雪    币: 7745
活跃值: (21142)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
随风而行aa 10 2022-10-28 18:57
11
0
mb_undcejfq 有没有交流群
可以关注公众号:安全后厨,后面会建群
雪    币: 80
活跃值: (1468)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lookaside 2022-11-7 11:27
12
0
mt\np有脱壳功能?
雪    币: 7745
活跃值: (21142)
能力值: ( LV12,RANK:550 )
在线值:
发帖
回帖
粉丝
随风而行aa 10 2022-11-7 11:30
13
0
lookaside mt\np有脱壳功能?
没有一键脱壳功能,但是你可以使用工具完成脱壳
雪    币: 200
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
MrRabbit 2022-11-21 22:44
14
0
很全面,谢谢大佬
雪    币: 8759
活跃值: (3194)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chengdrgon 2022-11-22 12:27
15
0
感谢分享
雪    币: 850
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
MichleMin 2022-12-5 18:17
16
0
感谢分享
雪    币: 226
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
溜溜菜 2023-1-8 00:46
17
0
总结很全面
游客
登录 | 注册 方可回帖
返回