Android odex文件反编译
odex 是经过优化的dex文件,且独立存在于apk文件。odex 多用于系统预制应用或服务。通过将apk中的dex文件进行 odex,可以加载 apk 的启动速度,同时减小空间的占用。请参考ODEX关于 odex 的说明。
在反编译 odex 文件的过程中,我们需要使用到以下工具
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 的源码,发现它有很多可以扩展的地方。
Android odex文件反编译的更多相关文章
- android apk 文件反编译
最近,自己坑逼的把一个android 项目修改版本的代码删除了.这个项目居然还没上传到源代码管理器.幸好还有apk文件,修改的代码也不多可以反编译一下. 1.下载 dex2jar 获取源码工具 地 ...
- Android dex ,xml 文件反编译方法
Dex 文件是Android上运行于delvik的java二进制文件,如果你对其中的内容感兴趣而开发人员没有公布源代码,你可以用如下方法反编译dex文件: 1 解压system.img 用xyaffs ...
- Android测试(三)——APK文件反编译
APK文件反编译: 在进行反编译操作前,先简单介绍下smali文件: smali是一种文件格式,语法和Jasmine的语言类似,这些smali文件包含开发应用程序时编写的java类的代码. 工具:ja ...
- 转: android apk 防止反编译技术(1~5连载)
转: android apk 防止反编译技术 做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习. ...
- android apk 防止反编译技术第一篇-加壳技术
做android framework方面的工作将近三年的时间了,现在公司让做一下android apk安全方面的研究,于是最近就在网上找大量的资料来学习.现在将最近学习成果做一下整理总结.学习的这些成 ...
- Android混淆、反编译以及反破解的简单回顾
=========================================================================虽然反编译很简单,也没下面说的那么复杂,不过还是转了过 ...
- android apk 防止反编译技术第二篇-运行时修改字节码
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第三篇-加密
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- android apk 防止反编译技术第二篇-运行时修改Dalvik指令
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
随机推荐
- [汇编] 将字符串里的一个'&'字符换成空格
; multi-segment executable file template. data segment ; add your data here! pkey db "press any ...
- [ACM_模拟] ZJUT OJ 1139 七龙珠 (追及类问题,s-t图像,模拟)
Description 话说孙悟饭与小林正在与刚造访地球的赛亚人贝吉塔交战,因为连贝吉塔的手下纳巴的实力也远在他俩之上,由于差距悬殊,小林不得不设脱离战场,去寻找正在修炼中的悟空求救,而赛亚人一伙 ...
- 不要过早退出循环 while(1){no break}
我们在尝试新的事物的时候,总是会遇到各种各样的困难,不同的人会在碰壁不同的次数之后退出.用程序员喜欢的话来说就是,我们都在for循环,区别在于你是什么情况下break的.有的人退出阈值高,这是能坚持的 ...
- android 给空白包签名
前言:之前公司app在腾讯开放平台认领应用时,涉及了一个问题:就是给空白包签名.然后再上传上去审核. 腾讯开放平台的官方说明如下, 如何签名:jarsgner-verbose-keystore[key ...
- Java并发包中Lock的实现原理
1. Lock 的简介及使用 Lock是java 1.5中引入的线程同步工具,它主要用于多线程下共享资源的控制.本质上Lock仅仅是一个接口(位于源码包中的java\util\concurrent\l ...
- PHP cURL模块
简介: cURL是利用URL语法在命令行方式下工作的文件传输工具,目前苹果机器已经内置了cURL.cURL是一个综合性的传输工具,对HTTP.FTP等协议提供了广泛的支持,它甚至可以实现迅雷.快车等下 ...
- C# 热敏打印机 Socket 网络链接 打印 图片
C# 热敏打印机 Socket 网络链接 打印 图片 (一) http://www.cnblogs.com/rinack/p/4838211.html C# 热敏打印机 Socket 网络链接 打印 ...
- Entity Framework Code First迁移基本面拾遗
项目中用到了EF Code First和迁移,但发现有些方面似懂非懂.比如:如何在迁移文件中控制迁移过程?如果在迁移文件中执行SQL语句?如何使用Update-Database的其它参数?数据库在生产 ...
- AsyncTask实现断点续传
之前公司里面项目的下载模块都是使用xUtils提供的,最近看了下xUtils的源码,它里面也是使用AsyncTask来执行异步任务的,它的下载也包含了断点续传的功能.这里我自己也使用AsyncTask ...
- linux crontab 文件位置和日志位置
一.文件位置 位置一般在/var/spool/cron/下,如果你是root用户,那下面有个root文件,建议日常备份,避免误删除导致crontab 文件丢失: 二.日志文件位置 默认情况下,cron ...