Android反编译主要分为两部分,一是代码的反编译,二是资源的反编译。 让我们立即一一了解它们。
工具介绍:
apk工具
作用:主要查看res文件下xml文件、AndroidManifest.xml和图片。(注意:如果直接解压.apk文件,xml文件打开全部是乱码)
dex2jar
作用:将apk反编译成Java源码(classes.dex转化成jar文件)
京东GUI
作用:查看APK中classes.dex转化成出的jar文件,即源码文件
工具下载
apk工具下载地址
dex2jar下载地址
jd-gui下载地址
使用apktool反编译apk,获取图片、XML配置、语言资源等文件
进入apktool所在目录,将apk也复制到该目录下。
在此目录中打开命令行窗口
执行订单:
java -jar apktool_2.3.3.jar d app-release.apk
反编译成功后,会在当前目录生成反编译文件夹。
其中,d表示decode,表示我们要解码Demo.apk这个文件。 除了这个基本用法之外,我们还可以添加一些额外的参数来控制decode的更多行为:
-f 如果目标文件夹已存在反编译apk出源码,则强制删除现有文件夹(默认情况下,如果目标文件夹已存在,则解码会失败)。
-o 指定解码目标文件夹的名称(默认使用APK文件的名称来命名目标文件夹)。
-s 不反编译dex文件,即保留classes.dex文件(dex文件默认会解码为smali文件)。
-r 不反编译资源文件,即保留resources.arsc文件(resources.arsc默认会解码为具体的资源文件)。
java -jar apktool_2.0.1.jar d -f E:AndroidDevelopToolAndroid反编译工具包测试apkMMTS-release-1.0.2.apk -o MMTS
打开文件夹可以看到反编译后的文件,如右图:
在生成的文件和文件夹中,我们关注的是[res]文件夹和AndroidManifest.xml文件。 打开res文件夹,里面就会有我们想听的内容。
使用dex2jar反编译apk得到Java源代码
即将反编译后的APK后缀名改为.rar或.zip,解压得到classes.dex文件(由java文件编译后用dx工具打包)。
将获得的classes.dex放入之前解压的工具【dex2jar-2.0】文件夹中。
在此目录中打开命令行窗口
执行订单:
d2j-dex2jar classes.dex
命令执行完成后,在当前目录下可以看到生成的Jar文件,如右图:
反编译classes.dex得到classes-dex2jar.jar文件后,可以使用【jd-gui】工具将class文件反编译成java源代码。
OK,可见我们的代码反编译工作已经成功了。 MainActivity中的代码非常清晰反编译apk出源码,已经基本完成了90%以上的恢复工作。 而如果想要实现100%的代码还原,还是非常困难的,因为像setContentView()这样传入的参数只是一个资源的id值,所以这里的反编译只能还原对应的id值。 恢复,但未能创建像R.layout.activity_main那样直观的代码展示。
此外,不仅是MainActivity,其他很多代码也被反编译了。 由于当前项目有引用 support-v4 和 support-v7 的包,因此引用的库也会打包为代码的一部分。 到classes.dex文件中,因此反编译时也会恢复这段代码。
好了,既然我们已经学会了如何反编译代码,那么我们就来看看如何反编译资源吧。
JD-GUI似乎能够将类反编译成java源代码,而对于一些混淆的类,反编译效果并不是那么理想。 混淆后的类的反编译效果图(类文件名和上面的方法名会采用a、b、c...等样式命名):