odex 是经过优化的dex文件,且独立存在于apk文件。odex 多用于系统预制应用或服务。通过将apk中的dex文件进行 odex,可以加载 apk 的启动速度,同时减小空间的占用。请参考ODEX关于 odex 的说明。

在反编译 odex 文件的过程中,我们需要使用到以下工具

  • smali/baksmali
  • dex2jar
  • JD Compiler, jar反编译工具

smali/baksmali是odex与dex文件格式互相转换的两个工具,dex2jar则是将dex文件转为java的jar文件,JD Compiler用于反编译jar文件。也就是说,经过以上一系列的操作,我们最终可以从一个odex文件得到一个可读的java文件。(事实上,也不是完全可读,与源码上还是有差别,有时候部分代码还无法反编译过来,只能以jdk虚拟机指令的方式存在了)。

首先,一个 odex 文件的生成过程是:java -> class -> dex -> odex,那么反编译的就是上面过程的逆操作了:odex -> dex -> class -> java。

我的测试环境:

  • Android 4.1.2
  • Samsung Galaxy II

以Android系统中的 uiautomator.odex 文件为例,目标是反编译其源码(其实它的源码grepcode).

工具准备

创建一个临时目录test,将 smali/baksmali 相关的工具都放入其中。

反编译 (odex -> dex)

首先,将目标 odex 文件拿出来。

1
2
cd test
adb pull /system/framework/uiautomator.odex

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

关于命令的使用,直接执行 java -jar baksmali-2.0.2.jar 可以得到相关的使用说明。这里要用到的参数主要是:

  • [-a | --api-level]: Android API等级,Android 4.1.2是16
  • [-x | --deodex]: 操作,反编译
  • [-d|--bootclasspath-dir]: 依赖包的目录,我们用当前目录.

开始反编译,执行以下命令:

1
2
3
4
5
6
7
8
D:\test>java -jar baksmali-2.0.2.jar -a 16 -x uiautomator.odex -d .
Error occured while loading boot class path files. Aborting.
org.jf.util.ExceptionWithContext: Cannot locate boot class path file /system/framework/core-junit.odex
        at org.jf.dexlib2.analysis.ClassPath.loadClassPathEntry(ClassPath.java:217)
        at org.jf.dexlib2.analysis.ClassPath.fromClassPath(ClassPath.java:161)
        at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:59)
        at org.jf.baksmali.main.main(main.java:274)

以上的异常表明,反编译的过程缺少依赖包/system/framework/core-junit.odex,那就从系统中提取。

1
2
3
4
5
6
D:\test>adb pull /system/framework/core-junit.odex
# 重复
D:\test>java -jar baksmali-2.0.2.jar -a 16 -x uiautomator.odex -d .
# 如果还有缺失的依赖包,则反复从手机上提取

反编译 uiautomator.odex 总共需要使用到以下依赖包:

1
2
3
D:\test>ls *.odex
android.policy.odex  bouncycastle.odex  core.odex  framework.odex   sec_edm.odex    services.odex
apache-xml.odex      core-junit.odex    ext.odex   framework2.odex  seccamera.odex  uiautomator.odex

baksmali 执行成功后,会产生一个 out 目录,里面放的是中间文件。这时,可以使用这些中间文件来生成dex文件:

1
2
3
4
5
D:\test>java -jar smali-2.0.2.jar -a 16 -o classes.dex out
## 解压 dex2jar 到 test 目录
D:\test\dex2jar-0.0.9.15>d2j-dex2jar.bat ..\classes.dex
dex2jar classes.dex -> classes-dex2jar.jar

classes-dex2jar.jar 便是我们要得到java jar包。通过JD Compiler打开这个jar可以看到反编译后的java内容。

之所以反编译 uiautomator,是因为Android SDK中给出的 uiautomator.jar 包中很多API都没有包含其中,也没有在其官方文档中给予说明。通过阅读 uiautomator 的源码,发现它有很多可以扩展的地方。

转载于:https://www.cnblogs.com/ungshow/p/3511330.html

Android odex文件反编译相关推荐

  1. 对Android APK文件反编译查看其源码

    概述 作为android的开发者,相信你会有那么一刻,比如,对于手机中某一款App,有一项功能或者效果你蛮喜欢的,想学习一下它具体是怎么实现的.追求高一点的话,我想深究它这个App的项目架构,本着一探 ...

  2. android apk 文件反编译

    Android 反编译APK 的好处 第一,当自己代码加混淆的时候,代码找不到CLASS 可以反编译下看看,到底是没有屏蔽,还是有其他的问题 第二,参考下别人的代码是怎么写的 使用工具 就一个 htt ...

  3. Android APK+Dex文件反编译及回编译工具

    本帖最后由 zhu891108 于 2012-8-3 11:00 编辑 大家好! 相信很多人玩智能手机,无论是塞班,安卓等等,不只是看重各种软件的功能,而更多的是看重系统的可定制性,可以自己动手DIY ...

  4. Android APK+Dex文件反编译及回编译工具 v.1.8.0 测试版

    可显示APK文件自身图标 _______________________________________________________________________________________ ...

  5. Android APK+Dex文件反编译及回编译工具(APKDB)v.1.9.2 正式版

    http://idoog.me/?p=1913 [Android APK+Dex文件反编译及回编译工具 (APKDB)v.1.9.2 正式版] <APK+Dex文件反编译及回编译工具> 简 ...

  6. [软件共享] 【强荐】Android APK+Dex文件反编译及回编译工具 v.1.7.2 正式版

    该工具非常强大,集成了反编译和回编译APK文件的工具apktool1.3/1.43/1.50版本,可以用于编译ICS4.0和JB4.1的APK文件, 里面还有ZIP刷机包和APK文件的签名工具, 所以 ...

  7. Android APK+Dex文件反编译及回编译工具 比 APKtool GUI 好千倍

    Android APK+Dex文件反编译及回编译工具 v1.7.2 正式版                        Soyu Zom 出品 =========================== ...

  8. 转: android apk 防止反编译技术(1~5连载)

    转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习. ...

  9. Android程序的反编译对抗研究

    转自: http://www.freebuf.com/tools/76884.html 一.前言 对抗反编译是指让apk文件或者dex文件无法正常通过反编译工具,而且有可能导致工具异常或者崩溃,如ap ...

最新文章

  1. 通俗易懂地讲解 Java 的注解
  2. mysql query 查询失败_如何在mysql进行查询缓存及失败的解决方法
  3. 并行多机调度遗传算法调参记录---变异和淘汰哪个更重要?
  4. 实现iframe_单点登录的三种实现方式,你会几种?
  5. linux文件内容打印成二进制,如何在二进制文件中只打印可打印字符(相当于Linux下的字符串)?...
  6. 关于DataAccess Application block
  7. 【今日CV 视觉论文速览】Wed, 6 Feb 2019
  8. 洛谷——P2637 第一次,第二次,成交
  9. 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的
  10. 视频怎么转化成动态图?巧用视频转gif生成器
  11. Unable to cast object of type ‘Newtonsoft.Json.Linq.JArray‘ to type ‘Newtonsoft.Json.Linq.JObject‘.
  12. 西安电子科技大学833真题_【考研名校】2021西安电子科技大学考研资料及历年真题解析汇总...
  13. Win10设置双网卡优先级
  14. 如何正确地跟二维码里的神仙打架?给小朋友讲解二维码原理
  15. 华为服务器插键盘的位置,服务器如何调出软键盘
  16. 减法公式运算法则_减法的运算法则
  17. 如何清理计算机类重复的文件,怎么删除电脑中的重复文件
  18. Windows用户管理、文件权限、本地策略、组策略说明
  19. 【装机必备】Win软件卸载工具
  20. 假期离校必备:Mac远程连接Win10桌面(设置断电自动重启、Win10配置远程桌面、Microsoft Remote Desktop Beta远程桌面连接、将Win作为服务器可以conda跑代码)

热门文章

  1. C#拾遗系列(5):泛型委托
  2. python range倒序_Python算法学习之堆和堆排序
  3. junit可执行但控制层无法执行_springboot项目controller接口junit测试
  4. Python自省(反射)指南 1
  5. Unity编辑器定制和开发插件
  6. cocos2dx 2.0升级为3.0一些常见变化纪录
  7. 怎么查看linux硬盘多路径,linux下磁盘多路径
  8. pandas将某列复制到另一个表_使用pandas将列从一个数据帧复制到另一个数据帧的最快方法?...
  9. 力扣-图解算法数据结构
  10. RecyclerView设置空视图