|
背景
目前市面上的各种APP安全加固厂商非常多,也是由于它们的加固产品的技术不断被攻破,从而推动它们加固技术的不断迭代更新。加固和脱壳永远是对立面的。脱壳更多的需要涉及到对APP内存的dump。
android目前有dalvik虚拟机和ART虚拟机,其中dalvik虚拟机是android 4.4以前使用的,而art虚拟机是android 4.4之后使用的。由于ART的预先加载代替用时查找以此提升APP应用的性能,所以目前的主流的虚拟机都是跑ART虚拟机。但是在加固过程中都需要对这两种虚拟机进行兼容,因此脱壳上也是有不一样的脱壳方法。
脱壳本质
Android中的APP脱壳本质是对内存中处于解密状态的dex进行dump。脱壳就是对加固的app中保护的dex的整体dump,不管是函数抽取、dex2c还是vmp虚拟机壳,都是要对整体的dex进行dump,然后再对脱壳下来的dex文件进行修复。同时要实现对app进行脱壳,那么就需要准确的定位 内存中解密后的dex文件的起始位置和大小。
同时要实现脱壳成功需要两个关键因素:1.内存中dex的起始地址和大小。2.脱壳的时机,只有在dex解密后进行脱壳,这样才能dump出明文状态的dex。
基于hook函数
在dalvik虚拟机下可以通过hook系统关键函数进行dump内存数据也就是脱壳,例如dvmDexFileOpenPartial、DexFileParse等函数
其中DexFileParse该函数主要就是对内存中的dex内容进行解析,最终返回一个DexFile结构体供虚拟机使用,函数的参数部分包含了内存中的dex文件的起始地址和大小,因此可以利用这个函数进行脱壳。
其中dvmDexFileOpenPartial该函数里最后调用了dexFileParse函数来得到解析后的DexFile结构体,函数的参数部分也包含了内存中dex的起始地址和大小,因此也可以利用这个函数进行脱壳。
在ART虚拟机种可以通过hook系统函数openMemory、OpenAndReadMagic、DexFile::DexFile()函数进行dump内存数据也就是脱壳。

从上图中可以看到OpenMemory函数的参数中包含了内存中dex的起始位置和大小,因此可以通过该函数进行脱壳。
基于ART的脱壳
在ART虚拟机下影响脱壳的关键的一个类就是DexFile。

1、那么可以直接查找法就是指以DexFile为关键字,在庞大的源码库中检索定位可能的脱壳点。如参数中出现DexFile类型的、返回值为DexFile类型的、函数流程中出现DexFile类型的源码位置。在获取到DexFile对象以后,然后再通过该对象的Begin()和Size()函数获取到该DexFile对象对应的内存中的dex的起始地址和大小即可进行dex的dump。
2、通过以DexFile为出发点,寻找能够间接获取到DexFile对象的。如通过ArtMethod对象的getDexFile()获取到ArtMethod所属的DexFile对象的这种一级间接法等;然后再在海量源码中以ArtMethod为关键字进行检索,检索那些参数中出现ArtMethod类型的、返回值为ArtMethod类型的、函数流程中出现ArtMethod类型的源码位置;
再比如通过Thread的getCurrentMethod()函数首先获取到ArtMethod或者通过ShadowFrame的getMethod获取到ArtMethod对象,然后再通过getDexFile获取到ArtMethod对象所属的DexFile的二级间接法以及通过ShadowFrame对象的GetMethod()函数获取到当前栈中执行的ArtMethod对象,然后再获取DexFile对象等等的二级间接法。 |
|