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/

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
===================================================================   本工具,直接在【鼠标右键】创建快捷菜单;   非常方便汉化工作者对APKDex文件的编译操作;   工具箱集合了,当今最强悍,最犀利的APKDex文件编译工具;   【注意:反编译文件名称 不能用中文,否则无法回编译。】 ___________________________________________________________________ 使用说明:   本工具执行安装后,直接在【鼠标右键】生成快捷键,自动关联APKDEX、 Odex、Zip文件。只要在电脑任意非分区根目录,【鼠标右键】点击相关文件,即 可编译操作。如,反编译APKDEX文件反编译后生成可编译的同名文件夹, 汉化修改完成后,对文件夹点击【鼠标右键】根据文件反编译前的文件类型, 现在【回编译XXX文件】即可!   同时,针对apk和zip文件增加签名操作,只要【鼠标右键】点击,选择 【签名XX文件】即可!签名前无需删除原来的【META-INF】签名数据。本工具会 判别apk还是zip并自动删除签名数据。 ___________________________________________________________________ 常见问题:   1、被杀毒软件拦截误杀(安装前,关闭杀毒软件)   2、没有管理员权限(右键以管理员身份运行C:\Apkdb\安装.exe)   3、UAC限制 安装过程没有写入注册表提示,直接显示安装完成   (右键 我的电脑-管理-本地用户和组-用户-Administrator(√ 密码永不过期)   4、安装成功,安装过程有写入注册表提示,但是右键APK 没有菜单   (检查是不是安装了PC版的手机管理工具,关联了APK文件)   5、安装后无法编译文件,提示JAVA 错误   (未安装JAVA平台,或安装错误。请卸载后重启电脑,重装再次重启电脑)   6、安装成功后,编译文件提示 “Can't create the output directory \\****\smali”   (拜托,这是文件夹 没有写入权限。是不是在硬盘分区根目录编译了?    Apktool不能在磁盘分区,如C盘 D盘 根目录进行编译!    如果不是根目录,请检查apk文件名称是不是有问题,如文件名结尾空格。)   7、能反编译,但无法回编译   (可能是被旧版本的Apktool编译过,可以试试用旧版的反编译,在用新版的回编译)   8、其他小白问题,上QQ群提问,不要单独Q我,谢谢! ___________________________________________________________________ 更新特性: v.1.6.5 2011.12.07   1.更新,手动选择编译工具Apktool版本   2.保留,出错自动切换Apktool其他版本   3.更新,回编译无Dex 工具保留“smali”源码文件   4.更新,合并OdexApk 采用Baksmali1.3.0版并自动切换API等级   5.更新,Apktool v1.4.2为中文版   6.增强,兼容各类PC版APK安装器(无需删除APK关联)   7.其他微调整
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值