时时勤拂拭,勿使惹尘埃

TOC

Categories

Android(六)ELF-OAT & MultiDex & vdex


ELF-OAT

分析某个app,大量核心代码不在dex中,而是动态加载的dex文件,dex文件运行后解包释放到以下目录
/data/data/[包名]/app_plugins_opt/
通过file指令显示为elf格式,jeb等工具无法直接解析
通过ida可以发现为ELF-OAT格式,而ida只能解析出smali代码:
OAT文件是一种Android私有ELF文件格式,是Android运行时ART的核心,不仅包含有从DEX文件翻译而来的本地机器指令,还包含有原来的DEX文件内容。(OAT文件格式参考Android运行时ART加载OAT文件的过程分析
OAT文件在最外层具有一般ELF文件的结构,但包含有两个特殊的段oatdata和oatexec,oatdata包含有用来生成本地机器指令的dex文件内容,oatexec包含有生成的本地机器指令。
OAT文件原生支持内嵌多个Dalvik的dex文件,一般情况下boot.oat包含了多个dex文件,普通的app的OAT文件通常只有一个dex文件。不过在OAT的header中dex_file_count_字段记录了该oat文件中包含的dex文件个数。
oat文件的加载时,首先加载elf文件,然后以oatdata和oatlastword找到真正的oat文件。接着解析oat header,根据其中的信息解析oat文件余下的部分例,如装载Dalvik的dex文件等。另外ART中利用OatDexFile类来标示Dalvik的dex,但实际上该类还是会调用DexFile类。
既然OAT文件内嵌了原始dex,那么分析OAT文件时候可以手动提取出来,如在16进制编辑器里面检索ascii码的“dex”字符串找到“dex.035”,删掉“dex.035”之前即可使用jeb等加载:
或者直接检索“dex.035”的hex byte“64 65 78 0a 30 33 35”,若有多dex也可直接发现:
当然还有更方便的方法,如jeb的oat插件:ANDROID DALVIK, INSIDE OAT, INSIDE ELF

MultiDex

早期的 Android 系统中,DexOpt方法数有65K的限制问题,尽管在新版本系统修复了这个问题,但app仍然需要对低版本的 Android 系统做兼容。针对这个问题通常采用分包的方案解决,主流的方案有Google官方MultiDex和DEX动态加载方式。
分析MultiDex时,好在jeb2后期版本已经支持MultiDex,可以无障碍的在multidex中使用交叉引用功能。不过对于从OAT提取的dex或者其他动态加载的dex仍不太方便,所以可以考虑将这些所有的文件集中处理。
  • 思路:将所有dex解压到同一目录,然后smali2dex合并成dex,最后用aapt add替换apk包中原始dex
  • 工具:dex2jar工具集、aapt、unzip
    1. 提取所有dex到同一目录,运行
      d2j-dex2smali.sh classes.dex —force -o tmp
      d2j-dex2smali.sh classes2.dex —force -o tmp
    2. 合并为同一dex
      d2j-smali.sh -o classes.dex tmp
    3. 删除apk的旧dex文件,将dex加入apk中
      aapt add demo.apk classes.dex

vdex

google在android8.0对于odex合并跟以往有些差异,新增了vdex文件,定义如下:
art\runtime\ vdex_file.h
VDEX的转换代码:
art\dex2oat\dex2oat.cc
Vdex header部分:
地址 字节数 描述 备注 示例含义
0x00 4 Magic Number 0x76,0x64,0x65,0x78,(’v’,’d’,’e’,’x’,)
0x04 4 version 005
0x08 4 number_of_dex_files Dex个数 01
0x0c 4 dexsize bc f0 06 00 符合后面dex header描述
0x10 4 verifierdeps_size 00 00 17 98
0x14 4 quickeninginfo_size 00 00 b2 f4
0x18 4 未知,是否是VdexFile的类地址? bd e5 c4 1f
对于vdex文件的分析,可以使用vdexExtractor工具来提取dex。
1、 $ git clone https://github.com/anestisb/vdexExtractor.git
2、$ ./make.sh
3、$ vdexExtractor -i ./*.vdex -o ./ —deps -f

0 评论:

发表评论