windy_ll 发表于 2021-5-3 15:38

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

本帖最后由 windy_ll 于 2022-3-27 21:23 编辑


## 一、前言

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

**    1、找到DexFile对象(art虚拟机下是DexFile对象,dalvik虚拟机下是DexFile结构体),获取到DEX文件的起始地址和大小,然后`dump`下来。常见能够找到`DexFile对象`的函数有`LoadMethod`、`ResolveMethod`函数等,能直接获取到`DEX起始地址和大小`的常见函数有`openMemory`、`dexparse`、`dexFileParse`、`dvmDexFileOpenPartial`等函数。`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`的字符串,获取到的类名的截图:**

![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//dumpshell/1.png)

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

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

![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//dumpshell/2.png)

---

## 三、其他识别方法

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

![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//dumpshell/3.png)

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

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

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

![](https://cdn.jsdelivr.net/gh/windy-purple/blog_picture_bed//dumpshell/4.png)

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

---

## 五、其他

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

XhyEax 发表于 2021-5-6 16:04

本帖最后由 XhyEax 于 2021-5-6 16:10 编辑

可以在java层通过loadClass主动加载指定类,然后调用getDeclaredMethods获取该类的方法,再通过JNI得到ArtMethod,从而得到DexFile(需要根据系统版本处理不同的偏移值)。
思路来自:hanbinglengyue/FART: ART环境下自动化脱壳方案

windy_ll 发表于 2021-5-6 15:57

Ashamed 发表于 2021-5-4 13:16
来晚了             求处理违规内容重发

相关图片已经打码了,管理还没解封,@管理员

djxding 发表于 2021-5-3 15:54

学习了。

你就是前途无量,未来的大牛。

谢谢!

zhangxu888 发表于 2021-5-3 16:16

看看,之前安装过但是在运行模拟器里的frida时候说找不到

心中有梦闯天下 发表于 2021-5-3 18:37

上面的联系方式需要打码吗?

VE5514 发表于 2021-5-3 19:05

这windows啥ui

windy_ll 发表于 2021-5-3 19:43

心中有梦闯天下 发表于 2021-5-3 18:37
上面的联系方式需要打码吗?

这个应该不用,样本来自论坛

First丶云心 发表于 2021-5-4 07:39

w92vv 发表于 2021-5-4 10:20

我来迟一步?

小刀十九块 发表于 2021-5-4 11:27


我来迟一步?

wenrtxn 发表于 2021-5-4 12:42

为什么会被屏蔽,又触犯了什么规则
页: [1] 2 3
查看完整版本: 对脱壳脚本的一些改进--识别出目标DEX