0x00 问题呈现
在分析某手机自带应用时,为了在JEB中反编译,将其adb pull到了电脑上。解压后发现如下文件:
![](https://i-blog.csdnimg.cn/blog_migrate/d8a42bdfc6eff940c23410fb38c81da3.png)
惊奇的发现该APK包中没有dex文件,一开始特别疑惑没有dex文件,也就是没有代码,那是如何运行的呢?
其实APK文件中的dex文件被odex化了,该处理方式有以下好处:
- odex是从apk文件中提取出classes.dex文件,并通过优化生成一个可运行的文件单独存放。
- 应用保护,一般情况下有odex的应用,其对应的apk文件中只存留资源文件,或者破损的dex文件,这样在反编译的情况下得不到正确的应用数据,同时也无法安装使用。
具体原理就不说了,本文旨在如何将APK包重组使得JEB可以反编译。
了解到odex机制后,目标就是找到该APK对应的odex文件,而该odex文件名是和包名一致的,所以很容易找到:
其实odex文件JEB是可以直接反编译的,但是会存在两个问题:
- odex文件中很多字符串等资源都在原apk包中,仅仅反编译odex将会识别不出来。
- 系统级的应用都会需要系统框架中代码的支持,仅仅反编译odex很多方法将会使得很多函数失败,例如下面这些类都是异常的。
![](https://i-blog.csdnimg.cn/blog_migrate/eecaa4dcfd107e1cb95c1064372a9bc9.png)
所以我们需要做两个方面的修复:
- 结合系统框架还原修复dex文件。
- 将dex文件合并到APK中,并进行反编译。
0x01 odex转dex
odex转dex流程大致分为下面几个步骤:
步骤一:通过baksmali工具将odex反汇编成smali文件工程。
如果你不知道需要哪些其他系统框架的支持,直接使用baksmali对odex进行反编译,但是会出现如下错误:
![](https://i-blog.csdnimg.cn/blog_migrate/7e986bd4454e1634f3cdb6777c98b7fa.png)
报错:不能找到 Could not find classpath entry /system/framework/core.odex
您只要到手机目录下adb pull出对应的文件到同级目录下,然后继续反编译。使用同样的方式解决这样的问题直到反编译成功。
其实为操作方便你只要将/system/framework文件夹内容全部拷贝出来,然后使用baksmali进行反编译。中途可能刷屏一些警告和错误信息,不用管,其实很多文件已经正确反编译成smali文件(很小几率刚好错误的文件是你分析的代码,否则认倒霉吧)。
生成的smali工程将在统计目录的out文件夹中:
![](https://i-blog.csdnimg.cn/blog_migrate/1e606b06a23b4f127a66197f788a500b.png)
步骤二:再通过smali工具将smali工程文件编译成dex文件。
使用如下工具命令进行编译smali汇编到dex文件:
![](https://i-blog.csdnimg.cn/blog_migrate/59f21bf870788fa10f90b54224d85ea8.png)
发现编译过程中因为这两个文件使得编译失败 ,我们将这两个文件删除重新操作就可以生成一个dex文件了。这两个文件也可以备份,防止重要逻辑代码在该处。
![](https://i-blog.csdnimg.cn/blog_migrate/5d11f01d1858901a6743e6c6771ebdd0.png)
工具下载地址:https://bitbucket.org/JesusFreke/smali/downloads/
0x02 反编译APK
为反编译APK可以直接将上述生成的dex文件压缩放入APK包中:
![](https://i-blog.csdnimg.cn/blog_migrate/79e89aa43d1bbffccd8c52ca6319d59d.png)
然后就可以使用JEB反编译该APK文件,我们发现之前反编译失败的函数都被修正了:
![](https://i-blog.csdnimg.cn/blog_migrate/fd0047dfe6c8da41d58705f17363d321.png)