我们如果从安卓系统中提取应用,就会发现有的apk是被优化过的,生成了odex文件,直接安装apk会报错缺少DEX文件【INSTALL_FAILED_DEXOPT】,缺少什么就给他补充什么,我们虽然没有dex文件,但是我们可以拿到odex文件,只要转码一下补充进去不就OK了?说干就干。
1. 准备必要的工具(baksmali-2.4.0.jar、smali-2.4.0.jar、oat2dex.jar[art虚拟机才需要])
前两个可以在这里下载:https://bitbucket.org/JesusFreke/smali/downloads/
oat2dex.jar在这下载:https://github.com/testwhat/SmaliEx
下载完成后,将上述三个文件和提取出来的apk以及odex文件都放在同一级目录中,命令进入该目录
例如:
2. 如果是art虚拟机,需要执行这一步,否则可以直接执行3
java -jar oat2dex.jar odex <oat file>
例如:
java -jar oat2dex.jar odex Dialer.odex
这一步执行完会在当前目录生成一个文件夹 名称为 Dialer.odex-odex,里面放的就是我们需要的dex文件,名称为Dialer.dex
3. 反编译dex
java -jar [baksmali jar包路径] d [dex路径] -o [输出目录]
例如:
java -jar baksmali-2.4.0.jar d Dialer.dex -o dial
执行完此步骤,会在当前目录下生成一个文件夹 dial
4. 编译classes.dex
java -Xmx512M -jar [smali jar包路径] assemble [回编smali目录,对应上面的输出目录] -o [输出路径]
例如:
java -Xmx512M -jar smali-2.4.0.jar assemble dial -o classes.dex
执行完此步骤,会在当前目录下生成一个文件classes.dex
5. 将classes.dex直接拖到之前提取出来的apk中
6.将apk重新签名即可安装
apk可以成功安装,但是打开闪退