乐者为王

Do one thing, and do it well.

反编译Android APK文件

2017/9/17更新

classes.dex是Java源代码编译后生成的字节码文件。由于Android使用的Dalvik虚拟机与标准的Java虚拟机是不兼容的,因此,dex文件与class文件相比,不论是文件结构还是opcode都不一样。

目前市面上有多种反编译dex的工具,下面我们就来把它们逐个介绍下。

dexdump

dexdump是Android软件开发套件提供的反编译工具。用法是:首先启动Android模拟器,把要反编译的dex文件用adb push命令推送到其中,然后通过adb shell登录,找到该dex文件,执行dexdump demo.dex。总的来说dexdump功能比较弱,且用起来麻烦,反编译的结果的可读性也很差。

Dedexer

另一个反编译工具是Dedexer,反编译的效果比较好。它可以读取dex格式的文件,生成一种类似于汇编语言的输出。与dexdump相比它至少有3个优点:

1. 不需要在Android模拟器中运行; 2. 反编译后的文件目录结构和源代码的目录结构相近,每个class文件对应一个ddx文件,不像dexdump那样把所有的结果都放在一起; 3. 可以作为反编译引擎。

它的使用的方法如下:

java -jar ddx.jar -o -D -r -d src classes.dex

AXMLPrinter2

APK中的资源通常是压缩过的,用文本工具看都是乱码,不过我们可以用AXMLPrinter2将其转换成可读的XML文件。具体命令为:

java -jar AXMLPrinter2.jar demo.xml output.xml

Apktool

目前最好的反编译工具是Apktool。可以帮助我们把APK文件反编译,输出smali格式的代码、图片和资源等文件,还可以在修改后重新打包。将下载下来的apktool和apktool-install-windows解压到同一目录,可以看到有三个文件:aapt.exe,apktool.bat和apktool.jar。以下是它的使用方法:

1
2
java -jar apktool.jar d demo.apk  # Decoding
java -jar apktool.jar b demo  # Building

dex2jar + JD-GUI

dex2jar是一个能操作Android的dex文件和Java的class的工具集合。它包含有将dex文件转换成jar文件或smali代码的工具:

1
2
d2j-dex2jar.bat demo.apk  # 将文件中的classes.dex转换成jar文件
d2j-dex2smali.bat demo.apk  # 将文件中的classes.dex转换成smali代码

生成的jar文件可以用JD-GUI工具直接打开查看。

JD-GUI从2015年9月开始就停止了维护,对此有担忧的同学可以使用jadx作为JD-GUI的替代品。实际上jadx是可以直接打开APK文件的,而且jadx的反编译结果更加优美简练。

smali

smali可以反编译dex文件,也可以把你修改过的代码重新编译成dex:

1
2
java -jar baksmali.jar classes.dex -o classes
java -jar smali.jar classes -o classes.dex

Comments