赞
踩
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系统中的 uiautomator.odex 文件为例,目标是反编译其源码(其实它的源码grepcode).
创建一个临时目录test,将 smali/baksmali 相关的工具都放入其中。
首先,将目标 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 的源码,发现它有很多可以扩展的地方。
注: 关于smali语法,可以参考官方
http://code.google.com/p/smali/w/list
或 http://blog.csdn.net/uiop78uiop78/article/details/7186638
最近对android 2.3.3的framework.jar进行了一些反编译和回编译的操作,写下来备忘。
一、framework.jar反编译为smali文件
1、下载smali-1.2.6.jar和baksmali-1.2.6.jar这两个工具(下载地址:http://code.google.com/p/smali/downloads/list)
2、将framework.jar中的classes.dex解压出来(好像不解压,直接用framework.jar也行)
3、使用baksmali.jar对classes.dex进行反编译(前提是安装了jdk,并且设置好了环境变量),执行命令:
java -jar baksmali-1.2.6.jar classes.dex-oout/
其中classes.dex是要反编译的文件,out/是要把反编译后的文件存放到的文件夹,如果不是在当前目录下,那么baksmali-1.2.6.jar还要加上路径
这样就OK了,在out文件夹中可以看到一堆扩展名为.smali的文件,用记事本就可以打开它们,从中可以窥到一些信息。但是与.java文件还是有一些不同,我也不太清楚这是什么结构。
二、smali文件回编译为classes.dex
1、一条命令就OK了:java -jar smali-1.2.6.jarout/-o classes.dex
2、再把编译好的classes.dex放回到framework.jar中就行了(可以使用winrar、winzip之类的工具作为辅助)。
三、framework.jar反编译为.class和.java文件
1、下载以下工具:
(1)dex2jar(http://code.google.com/p/dex2jar/)
(2)xjad(http://www.skycn.com/soft/41898.html)或jd-gui(http://java.decompiler.free.fr/?q=jdgui)
2、使用dex2jar对framework.jar进行转换,执行命令:dex2jar.bat framework.jar 将会生成一个framework.jar.dex2jar.jar
3、直接对该jar文件解压,可以看到里面都是.class文件了
4、如果还需要转换成.java文件,可以使用xjad或jd-gui,均可将class文件变为java文件。
注:dex2jar工具也可以处理.dex文件,因此也可以不直接处理framework.jar。而是先将framework.jar解压,生成classes.dex后再处理也行。
四、framework.odex反编译为.class和.java文件
1. 下载一下工具:
(1.)odex2jar/baksmali-2.0.3.jar 和odex2jar/smali-2.0.3.jar
执行 java -jar baksmali-2.0.2.jar -x -a 18 -d <framework_dir> framework.odex 生成out目录的 smail文件
再执行java -jar odex2jar/smali-2.0.3.jar out/ -o classes.dex
在执行 上面步骤三 ,把dex 转 jar
1:apk反编译
2:odex转dex
操作环境:ubuntu
A:apk反编译
.到code.google上下载apktool.jar以及相关文件:http://code.google.com/p/android-apktool/downloads/list
点击下载apktool-1.0.0.tar.bz2 和apktool-install-linux-2.1_r01-1.zip
Apktool 命令
./apktool d geek.apk test 反编译 geek.apk到文件夹test
B:odex转dex
http://code.google.com/p/smali/downloads/list
下载下面4个文件。
现在我们要对CardManager.odex进行反编译,以CardManager.odex为例。
1:java -jar baksmali-1.3.2.jar -a 12 -x CardManager.odex
//注意:这里要有core.jar:ext.jar:framework.jar:android.policy.jar:services.jar文件支持。这个 apk 所在的 rom 里面的一些 jar 文件,都在 /system/framework 里面: core.jar, ext. jar, framework. jar, android.policy. jar, services.jar和对应的.odex文件,把这些文件放在CardManager.odex同一级目录。
运行java -jar baksmali-1.3.2.jar -a 12 -x CardManager.odex ,会生成一个out文件夹,里面的文件以.smali结尾,
2:生成 classes.dex文件
运行 java -jar smali-1.3.2.jar out/ -o classes.dex
3:下载 dex2jar : dex2jar-0.0.9.8.zip
http://code.google.com/p/dex2jar/downloads/list
解压 tar -xzvf dex2jar-0.0.9.8.tar.gz
生成classes_dex2jar.jar文件
dex2jar-0.0.9.8$ ./dex2jar.sh ../Test_HW_ODEX/classes.dex
wanqi@wanqi-System-Product-Name:~/Downloads/dex2jar-0.0.9.8$ ./dex2jar.sh ../Test_HW_ODEX/classes.dex
dex2jar version: translator-0.0.9.8
dex2jar ../Test_HW_ODEX/classes.dex -> ../Test_HW_ODEX/classes_dex2jar.jar
4:运行jd-gui-0.3.2.linux.i686,打开classes_dex2jar.jar。就ok了。
反编译framework.odex
java -Xmx512m -jar baksmali-1.3.2.jar --api-level 12 -c:core.jar:bouncycastle.jar:ext.jar:framework.jar:android.policy.jar:services.jar:core-junit.jar -d framework/ -x framework.odex
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。