IT狗

android逆向之多dex(multiDex)文件apk的逆向

0x00 Who is Multidex

许多大厂的Android App由于业务量大,引用库多引发其apk包的中的类于要领剧增.这样就有大概呈现由于要领数过于繁多引发编译失利的状况.发生这个成绩的主因是dex文件格式的限定.一个DEX文件中method个数运用运用原生范例short来索引文件中的要领,也就是4个字节总计最多表述65536个method,field/class的个数也均有此限定。关于DEX文件,则是将项目所需悉数class文件归并且紧缩到一个DEX文件时期,也就是Android打包的DEX进程中,单个DEX文件可被引用的要领总数被限定为65536.

为办理这个成绩,谷歌推出了Multidex技能,简洁来讲就是将一个apk中的dex文件拆分成多个分主次前后加载,固然在这之前业界曾经开端运用插件化来弱化此类成绩.此刻市道上也有许多Multidex和插件化两种计划都运用的app.

Multidex会给逆向项目师带来以下贫苦:

1.容易发现东西静态阐发的类和要领不全

2.静态阐发东西由于交织引用的成绩引发反编译失利或溃散

3.静态调试中没法下断点

4.hook的工夫找不到订定的类和要领

0x01 merge multidex

在逆向apk中经常会碰到一些类丧失,反编译溃散的状况.假如这工夫去考察apk紧缩包会发明当中有跨越一个dex,上图中就有两个dex.那末这个app阐发起来就不会很轻松了,由于这个叫dex分包的技能间接意味着你要面临跨越65536个java要领.而这篇美文重要就是解说笔者在碰到这类状况的工夫一些对付伎俩.

假如你的dex2jar版本为v2.1之前的版本,那末dex2jar就会默许转变第一个dex文件而疏忽其他dex文件. 52f26c6 2.1版本开端支撑multidex,间接履行

d2j-dex2jar.sh the-apk-witch-mutidex.apk

就可以转变一切dex文件到一个jar包中.

在dex2jar更新v2.1之前笔者是用的一个对比”正直”的要领办理这个成绩,由于dex的method数量有限可是jar包对method是没有分外限定的,以是我写了一个脚本将apk中多个dex先转变为jar文件以后解紧缩末了归并打包紧缩,异样可以获得完备的反编译文件.

Android逆向中出镜率较高的jeb在晚期版本v1.x也异样有类似为难的成绩,只默许反编译第一个dex文件.可是到v2.2也开端支撑multidex运用merge的方法办理多个dex的反编译成绩.也就是在jeb2.2以后就可以无障碍的在multidex中运用交织引用功用了.

在很长一段工夫运用jeb1.5的工夫办理这个成绩的方法异样也也merge多个dex的smali代码,由于要回编译至dex以是就没法倏忽65K要领数的限定,那末就要想方法对multidex进行减肥.大数据状况下咱们只关怀其自有代码,对其依靠库常常是带过的(大多数状况是和设置文件中application大概出口Activity同途径的代码).这里就须要挑选一个较小的dex去辨认去除一些依靠库和第三方sdk比方android support / google gson,然后抽取别的的dex的主包smali代码归并到较小的dex中.末了回编译至dex拖入jeb1.5中就可以一般阐发了.

0x02 attach multidex 

在multidex的测试进程中还会呈现一种状况,就是运用xposed hook其要领的工夫,假如要领位于默许dex中是可以的一般hook,可是假如要领位于dex分包中xposed就会报错提醒所要hook的要领地点类没法找到.

要阐发这个成绩的缘故原由和办理方法,就要先相识multidex的载入进程和xposed的hook机会.

dex分包加载大抵流程以下,可以得出分包是滞后主包很多工夫加载的:

1.检测是不是有分包须要装置,零碎是不是支撑multidex

2.从apk中解压出分包

3.经过反射将分包注入到以后classloader

而xposed为了能让module实时载入履行以是得快速挪用handleLoadPackage(),以是这时候获得的context的classloader中只需默许dex主的包的类.

故此咱们得设法获得完备的上下文context,对比突出的获得完备context的hook机会有以下两处:

MultiDex.install()

MultiDexApplication.attachBaseContext()

而xposed的作者倡议是挑选android.app.Application.attach(),由于attachBaseContext是有几率被重写的不波动.以是挑选要领内挪用了attachBaseContext的Application.attach().

示例代码以下

阐发到这里就可以想到一些加壳后的app没法一般hook也大概是类似缘故原由可以用异样的要领办理(这里条件固然是能脱壳发现代码且壳没对hook做反抗,假如有反抗仍是脱了以后回打包对比稳妥.).下图这个壳异样也左证了attachBaseContext被重写的大概,间接hook被重写的attachBaseContext也是可行的.

0x03refer

https://developer.android.com/studio/build/multidex.html#about

http://souly.cn/%E6%8A%80%E6%9C%AF%E5%8D%9A%E6%96%87/2016/02/25/android%E5%88%86%E5%8C%85%E5%8E%9F%E7%90%86/

http://bbs.pediy.com/showthread.php?t=212332

https://github.com/pxb1988/dex2jar

https://github.com/rovo89/XposedBridge/issues/30#issuecomment-68488797

http://tech.meituan.com/mt-android-auto-split-dex.html

https://android.googlesource.com/platform/frameworks/multidex/+/master/library/src/android/support/multidex

 

 

来自:http://drops.wiki/index.php/2016/10/26/android-multidex/

此文由 IT狗 编辑,本网站所发布展示的作品/文章版权归原作者所有,任何商业用途均须联系作者!

相关推荐

评论 暂无评论