为什么需要反编译?
需要声明的是:
本篇文章只讲述Android反编译工具的使用,不涉及原理的讲解。(ps:主要是因为很多原理性的东西我也搞不清楚,不想误人子弟!)
俗话说“工欲善其事,必先利其器”,想反编译Android,我们需要下面四个强大的工具(ps:这几个工具均可以跨平台):
在Android开发中,一般会遇到apk、jar包和odex文件需要进行反编译。我先用一张流程图描述一下反编译流程和其中需要使用到的反编译工具。
根据流程图,我们先来看一下apk、jar、odex等文件如何获取classes.dex文件。
我们需要使用unzip解压apk。具体命令如下:
unzip test.apk -d /tmp/test
解压完成后,我们就能在解压目录(ps:上面是/tmp/test)下找到classes.dex文件了。
jar也是java文件的集合,我们可以使用jar -xf命令进行解压。在反编译Android的/system/framework目录下的jar文件时,我们经常会用到这个命令。
jar -xf classes.jar
解压完成后,一般就能看到classes.dex文件了。
想从odex文件中获取classes.dex相比apk、jar包会麻烦一些,中间需要一些转换。
odex文件首先需要使用baksmail工具转成smail文件集合,然后在通过smail工具将smail文件集合打包成classes.dex文件。
下面以/system/framework目录下的telephony-common.odex文件为例,介绍如何使用baksamil和smail工具。
使用baksmail.jar文件将odex文件进行分解,具体命令如下:
java -jar baksmali-2.0.6.jar -x telephony-common.odex
成功的话,会在当前目录下生成一个out目录,里面都是一些以”.smail”为后缀名的文件。
更多关于baksmail的使用,可以在命令行直接运行:
java -jar baksmali-2.0.6.jar
执行结果部分截图如下:
接下来就是用smail工具将上面生成的out目录打包成classes.dex文件。具体命令如下:
java -Xmx1024M -jar smali-2.0.3.jar out -o classes.dex
如果过程没报错,这个时候,我们就已经将odex文件转换为dex文件了。
接下来,使用这个神器将classes.dex文件转换为classes-dex2jar.jar文件。具体命令如下:
bash -x d2j-dex2jar.sh classes.dex
注意,需要给d2j-dex2jar.sh和d2j_invoke.sh两个脚本可执行权限。
像我的Ubuntu 13.10的64位版本使用jd-gui的时候,可能会遇到如下的错误:
./jd-gui: error while loading shared libraries:...
主要是缺少32位的库,如下安装命令可以解决这些问题:
sudo apt-get install libgtk2.0-0:i386 libxxf86vm1:i386 libsm6:i386 lib32stdc++6
然后,直接用jd-gui打开刚才dex2jar.sh生成的classes-dex2jar.jar即可看到反编译的源码。如下图:
但是,如上图所示,目前基本大部分市场发布的apk都会做代码混淆。
使用dex2jar和jd-gui等只能看到程序的源码,没法看到资源文件和xml布局文件。想查看apk的资源文件和xml就需要用另外一个神器了:apktool。
由于我是Ubuntu13.10的系统,所以我只讲解Ubuntu环境下如何安装apktool。
解包apk的命令如下:
./apktool.sh d test.apk
打包apk的命令如下:
./apktool.sh b test
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/wzy_1988/article/details/45852809