反编译未加固的 APK

所使用到的工具

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

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

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

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

使用 PKID 查壳

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

未加壳

加壳

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

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

qihoo关键字

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

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

打开终端,键入下面的命令。启动 apktooldemo.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