Android odex文件反编译
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文件反编译相关推荐
- 对Android APK文件反编译查看其源码
概述 作为android的开发者,相信你会有那么一刻,比如,对于手机中某一款App,有一项功能或者效果你蛮喜欢的,想学习一下它具体是怎么实现的.追求高一点的话,我想深究它这个App的项目架构,本着一探 ...
- android apk 文件反编译
Android 反编译APK 的好处 第一,当自己代码加混淆的时候,代码找不到CLASS 可以反编译下看看,到底是没有屏蔽,还是有其他的问题 第二,参考下别人的代码是怎么写的 使用工具 就一个 htt ...
- Android APK+Dex文件反编译及回编译工具
本帖最后由 zhu891108 于 2012-8-3 11:00 编辑 大家好! 相信很多人玩智能手机,无论是塞班,安卓等等,不只是看重各种软件的功能,而更多的是看重系统的可定制性,可以自己动手DIY ...
- Android APK+Dex文件反编译及回编译工具 v.1.8.0 测试版
可显示APK文件自身图标 _______________________________________________________________________________________ ...
- Android APK+Dex文件反编译及回编译工具(APKDB)v.1.9.2 正式版
http://idoog.me/?p=1913 [Android APK+Dex文件反编译及回编译工具 (APKDB)v.1.9.2 正式版] <APK+Dex文件反编译及回编译工具> 简 ...
- [软件共享] 【强荐】Android APK+Dex文件反编译及回编译工具 v.1.7.2 正式版
该工具非常强大,集成了反编译和回编译APK文件的工具apktool1.3/1.43/1.50版本,可以用于编译ICS4.0和JB4.1的APK文件, 里面还有ZIP刷机包和APK文件的签名工具, 所以 ...
- Android APK+Dex文件反编译及回编译工具 比 APKtool GUI 好千倍
Android APK+Dex文件反编译及回编译工具 v1.7.2 正式版 Soyu Zom 出品 =========================== ...
- 转: android apk 防止反编译技术(1~5连载)
转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习. ...
- Android程序的反编译对抗研究
转自: http://www.freebuf.com/tools/76884.html 一.前言 对抗反编译是指让apk文件或者dex文件无法正常通过反编译工具,而且有可能导致工具异常或者崩溃,如ap ...
最新文章
- 通俗易懂地讲解 Java 的注解
- mysql query 查询失败_如何在mysql进行查询缓存及失败的解决方法
- 并行多机调度遗传算法调参记录---变异和淘汰哪个更重要?
- 实现iframe_单点登录的三种实现方式,你会几种?
- linux文件内容打印成二进制,如何在二进制文件中只打印可打印字符(相当于Linux下的字符串)?...
- 关于DataAccess Application block
- 【今日CV 视觉论文速览】Wed, 6 Feb 2019
- 洛谷——P2637 第一次,第二次,成交
- 链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的
- 视频怎么转化成动态图?巧用视频转gif生成器
- Unable to cast object of type ‘Newtonsoft.Json.Linq.JArray‘ to type ‘Newtonsoft.Json.Linq.JObject‘.
- 西安电子科技大学833真题_【考研名校】2021西安电子科技大学考研资料及历年真题解析汇总...
- Win10设置双网卡优先级
- 如何正确地跟二维码里的神仙打架?给小朋友讲解二维码原理
- 华为服务器插键盘的位置,服务器如何调出软键盘
- 减法公式运算法则_减法的运算法则
- 如何清理计算机类重复的文件,怎么删除电脑中的重复文件
- Windows用户管理、文件权限、本地策略、组策略说明
- 【装机必备】Win软件卸载工具
- 假期离校必备:Mac远程连接Win10桌面(设置断电自动重启、Win10配置远程桌面、Microsoft Remote Desktop Beta远程桌面连接、将Win作为服务器可以conda跑代码)
热门文章
- C#拾遗系列(5):泛型委托
- python range倒序_Python算法学习之堆和堆排序
- junit可执行但控制层无法执行_springboot项目controller接口junit测试
- Python自省(反射)指南 1
- Unity编辑器定制和开发插件
- cocos2dx 2.0升级为3.0一些常见变化纪录
- 怎么查看linux硬盘多路径,linux下磁盘多路径
- pandas将某列复制到另一个表_使用pandas将列从一个数据帧复制到另一个数据帧的最快方法?...
- 力扣-图解算法数据结构
- RecyclerView设置空视图