.odex文件的反编译

0x00 问题呈现 在分析某手机自带应用时,为了在JEB中反编译,将其adb pull到了电脑上。解压后发现如下文件:
.odex文件的反编译
文章图片
APK解压目录列表 惊奇的发现该APK包中没有dex文件,一开始特别疑惑没有dex文件,也就是没有代码,那是如何运行的呢?
其实APK文件中的dex文件被odex化了,该处理方式有以下好处:

  1. odex是从apk文件中提取出classes.dex文件,并通过优化生成一个可运行的文件单独存放。
  2. 应用保护,一般情况下有odex的应用,其对应的apk文件中只存留资源文件,或者破损的dex文件,这样在反编译的情况下得不到正确的应用数据,同时也无法安装使用。
具体原理就不说了,本文旨在如何将APK包重组使得JEB可以反编译。
了解到odex机制后,目标就是找到该APK对应的odex文件,而该odex文件名是和包名一致的,所以很容易找到:
.odex文件的反编译
文章图片

其实odex文件JEB是可以直接反编译的,但是会存在两个问题:
  1. odex文件中很多字符串等资源都在原apk包中,仅仅反编译odex将会识别不出来。
  2. 系统级的应用都会需要系统框架中代码的支持,仅仅反编译odex很多方法将会使得很多函数失败,例如下面这些类都是异常的。
.odex文件的反编译
文章图片
单独反编译odex文件出现的问题 所以我们需要做两个方面的修复:
  1. 结合系统框架还原修复dex文件。
  2. 将dex文件合并到APK中,并进行反编译。
0x01 odex转dex odex转dex流程大致分为下面几个步骤:
步骤一:通过baksmali工具将odex反汇编成smali文件工程。
如果你不知道需要哪些其他系统框架的支持,直接使用baksmali对odex进行反编译,但是会出现如下错误:
.odex文件的反编译
文章图片
直接使用baksmali反编译 报错:不能找到 Could not find classpath entry /system/framework/core.odex
您只要到手机目录下adb pull出对应的文件到同级目录下,然后继续反编译。使用同样的方式解决这样的问题直到反编译成功。
其实为操作方便你只要将/system/framework文件夹内容全部拷贝出来,然后使用baksmali进行反编译。中途可能刷屏一些警告和错误信息,不用管,其实很多文件已经正确反编译成smali文件(很小几率刚好错误的文件是你分析的代码,否则认倒霉吧)。
生成的smali工程将在统计目录的out文件夹中:
.odex文件的反编译
文章图片
baksmali反编译odex成功
步骤二:再通过smali工具将smali工程文件编译成dex文件。
使用如下工具命令进行编译smali汇编到dex文件:
.odex文件的反编译
文章图片
smali工具生成dex 发现编译过程中因为这两个文件使得编译失败 ,我们将这两个文件删除重新操作就可以生成一个dex文件了。这两个文件也可以备份,防止重要逻辑代码在该处。
.odex文件的反编译
文章图片
dex文件生成成功 工具下载地址:https://bitbucket.org/JesusFreke/smali/downloads/
0x02 反编译APK 为反编译APK可以直接将上述生成的dex文件压缩放入APK包中:
.odex文件的反编译
文章图片
dex放入APK中 然后就可以使用JEB反编译该APK文件,我们发现之前反编译失败的函数都被修正了:
.odex文件的反编译
文章图片
反编译成功的代码 【.odex文件的反编译】

    推荐阅读