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中
通过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文件内嵌了原始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仍不太方便,所以可以考虑将这些所有的文件集中处理。
分析MultiDex时,好在jeb2后期版本已经支持MultiDex,可以无障碍的在multidex中使用交叉引用功能。不过对于从OAT提取的dex或者其他动态加载的dex仍不太方便,所以可以考虑将这些所有的文件集中处理。
- 思路:将所有dex解压到同一目录,然后smali2dex合并成dex,最后用aapt add替换apk包中原始dex
- 工具:dex2jar工具集、aapt、unzip
- 提取所有dex到同一目录,运行
d2j-dex2smali.sh classes.dex —force -o tmp
d2j-dex2smali.sh classes2.dex —force -o tmp - 合并为同一dex
d2j-smali.sh -o classes.dex tmp - 删除apk的旧dex文件,将dex加入apk中
aapt add demo.apk classes.dex
- 提取所有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 评论:
发表评论