反编译之系统级应用(apk和被拆分的odex合并)

Android的存储中有很多odex文件,相对于APK中的dex文件而言这个odex有什么作用呢? 如果你仔细观察会发现apk和odex文件名是一一对应的,同时那些对应的apk文件解压后发现其中没有了dex文件,而一般第三方apk改后缀为zip后解压会发现里面是有dex文件的。这样做可以使其厂商保证一定的反盗版,因为没有没有dex文件的apk是无法正常安装的,而厂商直接将odex和不完整的apk文件放到手机ROM固化到/system/bin中可以让一般用户无法正常导出使用。

优化的可运行dex——odex
 odex是从apk文件中提取出classes.dex文件,并通过优化生成一个可运行的文件单独存放

原apk文件中的classes.dex文件可以保留,也可以删除,有时候为了混淆视听,甚至会留下残破的dex文件

所以odex的目的一般有两个:

1. 加快软件的启动速度,同时减小空间的占用,odex可预先提取(提前存储于缓存,优先级高于对应apk中的dex,有odex的情况下不会再加载其对应的dex),一般多用于系统预制应用或服务。

2. 应用保护,一般情况下有odex的应用,其对应的apk文件中只存留资源文件,或者破损的dex文件,这样在反编译的情况下得不到正确的应用数据,同时也无法安装使用。

在反编译 odex 文件的过程中,我们需要使用到以下jar:
smali、baksmali

smali/baksmali是odex与dex文件格式互相转换的两个工具
一个 odex 文件的生成过程是:java -> class -> dex -> odex,那么反编译的就是上面过程的逆操作了:odex -> dex -> class -> java。

本文只做odex反编译到dex,然后合并到apk文件中形成完整的apk,最后用jadx来反编译完整的apk看源码。

至于如果想要只看odex反编译成的java源码,那就另外需要dex2jar、
JD Compiler, jar反编译工具,此处不谈。

我以android Launcher3.odex为例:

工具准备

1.创建一个临时目录文件夹launcher,将 smali、baksmali 的jar都放入其中
2.把待用的Launcher3.odex和Launcher3.apk也放入这个文件夹里

在合成 odex 文件过程中,还需要用到很多依赖文件,它们同样也是 odex 格式的。因此在合成时,我们需要根据情况反复从手机中抽取相关的依赖包。

关于命令的使用,用cmd ,调转到launcher文件夹目录下直接执行 java -jar baksmali-2.4.0.jar 可以得到相关的使用说明.(中间是版本号,看你下载的baksmali版本而定)

baksmali使用说明:

反编译之系统级应用(apk和被拆分的odex合并)_第1张图片
上面写了解码命令是deodex

当然,smali的使用说明也是同理:
反编译之系统级应用(apk和被拆分的odex合并)_第2张图片

开始反编译

执行 java -jar baksmali-2.4.0.jar deodex Launcher3.odex
反编译之系统级应用(apk和被拆分的odex合并)_第3张图片
报错了! 不要慌,报错了就按照提示操作就好了。我们看看,它说缺包了,缺啥补啥呗!现在是缺boot.oat,百度了一下,这玩意在android机器中的system/framework/arm,要从系统中提取

用adb 命令提取到我在d盘新建的pull文件夹中

adb pull system/framework/arm D:\pull

提取后,在pull文件夹中找到boot.oat,复制到我的launcher文件夹中,再执行一遍 java -jar baksmali-2.4.0.jar deodex Launcher3.odex

反编译之系统级应用(apk和被拆分的odex合并)_第4张图片
又报错说少了一个依赖包 boot-core-libart.oat,好嘛,再去pull文件夹中找到这个玩意,复制进launcher文件夹,再来一次 java -jar baksmali-2.4.0.jar deodex Launcher3.odex
反编译之系统级应用(apk和被拆分的odex合并)_第5张图片
又来了,这次说要boot-conscrypt.oat文件,这下找到规律了,敢情它要全部带oat后缀的文件,那我就去pull文件夹中把全部后缀是oat的文件都复制到launcher文件夹中,再次执行命令 java -jar baksmali-2.4.0.jar deodex Launcher3.odex

这下没有报错,我们可以在launcher文件夹中发现多了个out文件夹,
里面有名为android和名为com的文件夹,打开里面全是smali文件

smali文件转dex

cmd执行命令,把out文件夹的smali转成dex,且起名classes.dex

java -jar smali-2.4.0.jar assemble out -o classes.dex 

在这里插入图片描述
然后发现成功了,在launcher 文件夹下发现生成了classes.dex。

dex文件放入apk中

这个简单,把Launcher3.apk文件把apk后缀为zip,然后用解压软件打开,添加classes.dex进去(把它拖进去也行),然后再把zip后缀改回apk即可,一个完整的apk就出来了!

之后针对apk的反编译用jadx就行,详情看我之前写的关于jadx反编译的博文。

如果是需要安装apk,光把dex塞入apk还不行,会产生INSTALL_PARSE_FAILED_NO_CERTIFICATES错误,需要利用signapk来重新进行签名

如果你安装的apk出现闪退,报错,卡死等等,那么恭喜你,你遇到反调了,这个就暂时无解了

Ps 介绍一个神器:
ES文件浏览器,当需要破解某些系统软件,而该系统还无法root时,这个软件可以轻松的获取源文件:
它类似与文件管理器,但可以显示那些系统想隐藏而不让你看到你文件,且无需root权限。一般系统软件都存放在 system/app中,当然别忘了还有system/priv-app等,从内存中将想要的文件进行拷贝,然后黏贴到sdcard,接着通过USB调试就可以直接获取这些文件,简单易用

你可能感兴趣的:(反编译之系统级应用(apk和被拆分的odex合并))