首页
社区
课程
招聘
[原创]对脱壳脚本的一些改进--识别出目标DEX
2022-3-27 21:24 10821

[原创]对脱壳脚本的一些改进--识别出目标DEX

2022-3-27 21:24
10821

一、前言

    通常对于加壳的程序,第一步的操作通常是脱壳,而现在脱壳一般都选择利用frida来进行hook进行脱壳,不谈其他脱壳方式,利用frida脱壳原理大致分为两种:

 

    1、找到DexFile对象(art虚拟机下是DexFile对象,dalvik虚拟机下是DexFile结构体),获取到DEX文件的起始地址和大小,然后dump下来。常见能够找到DexFile对象的函数有LoadMethodResolveMethod函数等,能直接获取到DEX起始地址和大小的常见函数有openMemorydexparsedexFileParsedvmDexFileOpenPartial等函数。frida_unpack便是其中的代表作。

 

    2、利用frida的搜索内存,通过匹配DEX文件的特征,例如DEX文件的文件头中的magic---dex.035这个特征。frida-Dexdump便是这种脱壳方法的代表作。

 

    然而不管是上述哪一种原理,在我这个有点强迫症的看来,都有一点小缺陷,这两种方法从原理上决定了经过某个函数的DEX(或者存在于内存中的DEX)都会被dump下来,所以出现了dump下来很多个DEX文件,但是只有其中一个或者几个是我们的目标DEX,为了寻找到目标DEX,只有全部反编译出后来能知道,这就比较浪费时间和精力了,对此,本人对脱壳脚本做了一些改进,通过对dump下来的DEX进行解析,从而识别出那个是我们的目标DEX!!!


二、通过类名识别出DEX

    PS:通过类名识别是本人发现识别率最准确、实现代价最小的方法,所以本篇重点主要在这,后面的其他识别方法在某些特殊情况下更好用!!!

 

    DEX文件的格式可以大致分为文件头索引区数据区文件头这个区域无法找到一个DEX文件的一个唯一特征(ps:sha-1校验码这两个能作为一个DEX文件唯一特征的前提是我们已经知道这个dex文件所有字节了,所以放在这里并不成立),索引区包括了很多数据的索引,其中便包括字符串的索引,通过这我们可以解析出整个DEX文件使用到的字符串。而我们已知的DEX文件的一些信息便包括包名

 

    通过解析一个DEX文件,我们可以发现在DEX中一个类被表示出如下形式--L包名/类名;,例如Lcom/example/test/ManActivity;这种形式,例如下面为使用脚本解析DEX的字符串,获取到的类名的截图:

 

 

    包名是唯一的,所以我们只需要构造/com/example/test这种形式的特征,便可以很轻易的锁定到目标DEX,但是,在壳程序中,也可能含有这种类型的字符串,我们的特征便不再是唯一的,这个时候,我们便需要一个新的唯一特征。

 

    在一个APP中,我们通常所写的类不止一个,而是很多个,那么便含有很多个上述所说的特征;而写过加壳程序都应该知道,我们在加壳程序中,最多也就拉起那么一个或几个类。那么,通过这种数量上的差异同样也可以作为唯一特征,以下是脱壳改进脚本脚本运行截图:

 


三、其他识别方法

    1、其他字符串,通过将app安装运行手动观察到的,但是这种方式有点碰运气,只有直接写入到java源码中的才能作为特征,写入到strings.xml便不得行。如下截图(ps:为直接写入到java中的,可以在字符串池中解析出来的),解析字符串池:

 

 

    2、布局xml文件名、控件名(ps:这种可行性太低,在这里筹字数的,基本不能作为特征)

 

    3、布局、控件资源ID,这些16进制搜索整个DEX文件也可以作为特征,但是有很其他DEX文件装车的可能。

 

    4、方法原型,例如一个方法返回值是Double,参数也是Double,那个这个方法原型便是FF,而这个方法原型一定存在于字符串池中,但是也不是很靠谱这个特征,原因如下截图所示(而且还需要知道一个方法才行):

 

 

    5、对DEX做更深入解析,解析出更多特征,而不仅仅止于解析出字符串池,感兴趣的研究一下,但第一个依靠类名便够用了。


五、其他

    github地址:https://github.com/windy-purple/dumpshell


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞3
打赏
分享
最新回复 (19)
雪    币: 205
活跃值: (334)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
上官临逸 2022-3-27 22:39
2
0
报错啦大佬 Failed to spawn: the 'argv' option is not supported when spawning Android appsain\magicdexfile.js`...
雪    币: 2407
活跃值: (4161)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
windy_ll 2 2022-3-27 22:58
3
0
上官临逸 报错啦大佬 Failed to spawn: the 'argv' option is not supported when spawning Android appsain\magicdexfile ...
https://blog.csdn.net/qq_43032479/article/details/116503061
雪    币: 205
活跃值: (334)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
上官临逸 2022-3-27 23:27
4
0
windy_ll https://blog.csdn.net/qq_43032479/article/details/116503061
这篇博客看了,但是没成功,我明天再试试
雪    币: 5348
活跃值: (5349)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 3 2022-3-31 10:17
5
0
有些样本,多dex的,其中有的dex可能不包含当前包名的特征字符串,这种情况是不是就漏了?
雪    币: 2407
活跃值: (4161)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
windy_ll 2 2022-3-31 14:30
6
0
脚本是一年之前写的,当时确实没考虑到这种情况
雪    币: 5348
活跃值: (5349)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 3 2022-4-1 09:47
7
0
windy_ll 脚本是一年之前写的,当时确实没考虑到这种情况
嗯,一直也没想到好办法过滤,我现在都是通过大小把系统的dex过滤掉。
雪    币: 122
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
波什 2022-4-1 15:08
8
0
脱壳之后的反编译出来的方法是空的,怎么修复呢 ? 方法都是这样

@Override
 protected void onCreate(Bundle bundle) {

 }

雪    币: 2407
活跃值: (4161)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
windy_ll 2 2022-4-1 17:08
9
0
波什 脱壳之后的反编译出来的方法是空的,怎么修复呢 ? 方法都是这样 @Override protected void onCreate(Bundle bundle) { }
脚本只针对脱壳,不修复
雪    币: 18
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无名小姐 2022-4-5 19:10
10
0
小白 一个

雪    币: 18
活跃值: (87)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
无名小姐 2022-4-5 19:10
11
0
太高深了
雪    币: 110
活跃值: (189)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
无名诸葛 2022-4-12 11:00
12
0
脱壳时机没讲,要学脱壳的,参考下fart脱壳rom讲的脱壳时机
雪    币: 110
活跃值: (189)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
无名诸葛 2022-4-12 11:00
13
0
还要关注主动调用脱壳的技巧
雪    币: 13414
活跃值: (4743)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2022-6-20 09:00
14
0
你这个逻辑是不是有问题?谁规定类名就一定要包含包名?难道不知道包名是可以随时修改的?
如果从AndroidManifest.xml读取类名是不是好一点?
雪    币: 13414
活跃值: (4743)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2022-6-20 09:02
15
0
GitRoy 嗯,一直也没想到好办法过滤,我现在都是通过大小把系统的dex过滤掉。
dex大小能判断吗?怎么判断?
为什么不读取AndroidManifest.xml的类名来判断?
雪    币: 2407
活跃值: (4161)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
windy_ll 2 2022-6-20 10:14
16
0
tDasm dex大小能判断吗?怎么判断? 为什么不读取AndroidManifest.xml的类名来判断?
只针对常规,大小是经验总结出来的,别拿特殊情况来说,别杠,杠就是你赢
雪    币: 13414
活跃值: (4743)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tDasm 2022-6-20 11:18
17
0
windy_ll 只针对常规,大小是经验总结出来的,别拿特殊情况来说,别杠,杠就是你赢
常规就不需要你这个东西。
一般是加壳了,类名不含包名绝对不是特例。不要别人说你不是,就是杠,按照你这个说法,论坛早就应该关闭了,因为交流就应该讲道理摆事实。
雪    币: 2407
活跃值: (4161)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
windy_ll 2 2022-6-20 16:34
18
0
tDasm 常规就不需要你这个东西。 一般是加壳了,类名不含包名绝对不是特例。不要别人说你不是,就是杠,按照你这个说法,论坛早就应该关闭了,因为交流就应该讲道理摆事实。
请仔细看一下我发的样本,你觉得没用也代表不了所有人,至于其他的,你开心就好,我只是分享一个思路
雪    币: 5348
活跃值: (5349)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
GitRoy 3 2022-6-22 10:28
19
0
系统那些dex大小固定的,只针对单个机型哈,dump一次出来,就知道哪些是系统dex了
雪    币: 224
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_yhsgfsyk 2022-6-28 06:36
20
0
是否能把它脱完整,例如抽取壳,或者被so抽走了这种。
游客
登录 | 注册 方可回帖
返回