Android APK反编译详解

为了学习新知识,或者在做安全测试过程中,我们经常都需要对Android apk进行反编译来学习其源代码或者了解其逻辑结构。

在对Android apk进行反编译之前,我们必须了解apk的结构,apk文件其实是一个压缩包,我们可以直接对其解压缩,如下图所示:


其中的classes.dex就是我们所需要的进行一系列编译加密处理后的源代码文件,而Androidmanifest.xml是加密后的安卓配置文件。另外几个文件夹则包含了此app

的一些资源文件,比如图片、音乐等。

我们知道,Android是用java开发的,我们使用到的反编译工具,也都需要jdk环境,所以,在反编译之前,请先配置好jdk。

classes.dex我们可以直接解压缩apk获取到,那么怎么拿到java源代码呢?这时候我们需要用到几个工具:

1. dex2jar    https://jaist.dl.sourceforge.net/project/dex2jar/dex2jar-2.0.zip

使用此工具可直接将dex文件转换成jar包。使用方法很简单,只需要一条命令。

将dex文件放到dex2jar目录下(或者自己在使用命令时输入详细地址),输入d2j-dex2jar classes.dex即可。


如图所示,出现的classes-dex2jar.jar即为源代码jar包。要查看这个jar包,我们需要用到下面另外一个工具。

2. jd-gui     https://github.com/java-decompiler/jd-gui/releases/download/v1.4.0/jd-gui-1.4.0.jar

将前面转换后的jar包直接使用jd-gui打开,即可看到此apk的java源代码。


这两个工具只能看到java源代码,我们可以发现解压缩apk后出现的Androidmanifest.xml打开是乱码,包括其他资源文件也是乱七八糟的。我们需要得到原文件,就需要借助另外一个工具:

3. apktool     https://ibotpeaches.github.io/Apktool/

apktool是一款非常强大的工具,只需要一条命令,即可逆向出apk的所有资源文件和Androidmanifest.xml,而且还能得到apk的smali文件,smali在安全测试中是经常需要用到的,可以直接查看应用运行逻辑。

使用方法: java -jar apktool.jar d *.apk

其中 “*.apk”指所需要反编译的文件名。



如上图所示,完成后,会在当前路径生成一个文件夹,包含我们所需要的各种资源原文件,而且Androidmanifest.xml也变成了明文,到此,apk反编译完成。