反编译未加固的 APK

所使用到的工具

apktool: 资源文件获取,可以提取出图片文件和布局文件进行使用查看。

dex2jar:将 apk (实际上是其中的 classes.dex) 反编译成 java 源码。

jd-gui:查看 jar 文件的结构和其中的源码。

PKID:查壳的工具。本来只有 Windows 版本的,有位大佬觉得每次虚拟机麻烦,于是写了个 java 的。

使用 PKID 查壳

双击打开 pkid.jar 然后将需要查的 apk 直接拖入即可。

未加壳

加壳

其实有加壳的一般都具有明显的特征,因为大部分都是使用一些别人的加固厂商的产品来加固的。

如上面的 360加固 的 demo 中就有明显的特征: qihoo 。

qihoo关键字

使用 apktool 反编译资源文件和 manifest 文件

为了便于操作和方便,可以将上述的工具下载、解压后都统一放到自己的 tool 目录中,建议再添加一个环境变量。于是就可以随处键入唤起。

打开终端,键入下面的命令。启动 apktool 将 demo.apk 反编译到 demoapk/ 目录下。

1
java -jar apktool_2.4.0.jar d -f ../demo.apk -o ../demoapk

效果如下如所示

反编译截图

打开文件夹 demoapk/ ,可以看到其中的文件,包括 manifest 文件和 res/ 文件夹。

文件内容

但是其中却只反编译到了 smali 随便打开都是只到了 smali ,虽然高级一点的逆向者都需要能够随手手撕 smali 然后再打包签名,但是作为新手,还不至于。

使用 dex2jar 反编译到 java 源码

前面 apktool 只反编译到了 smali ,而接下来的 dex2jar 就可以直接将 classes.dex 反编译到 jar 。

将上面的 demo.apk 文件修改后缀名为 zip 后进行解压,其中就会发现 classes.dex 文件。如下图所示,

其中还会有 classes2.dex , classes3.dex …..这是由于 dex 的文件结构决定了一个文件中的最大方法数量不能超过 65535,而现在的大型 app 的方法数量早就超过了这个数值,于是就有了 multi-dex 的技术,可以生成多个 dex 文件来存放。

关于这个问题,笔者在网上找到一个解决方法: d2j-dex2jar.sh the-apk-witch-mutidex.apk 就可以直接完成。

dex文件

对于某个单独的 dex 文件的反编译可以直接使用下面的命令完成。

1
d2j-dex2jar classes.dex

然后就会生成对应反编译之后的 .jar 文件。

对于有 multidex 的就使用如下的命令

1
d2j-dex2jar.sh the-apk-witch-mutidex.apk

d2j-dex2jar命令

生成的jar

使用 jd-gui 查看 jar 文件的源码

前面 dex2jar 已经完成了生成 .jar 的工作,接下来就应用 jd-gui 来查看其中的 java 源码。

双击运行后,将想要查看的 .jar 拖入即可。

大概就是下图的效果。

jd-gui查看效果

总结

至此,一个没有加壳的 apk 已经被反编译完成了。脱壳还在学习中。

参考链接

参考链接1:反编译一个 APK https://www.jianshu.com/p/dbe579f6cc84

参考链接2:dex2jar multidex https://github.com/pxb1988/dex2jar/issues/63