反编译未加固的 APK
所使用到的工具
apktool: 资源文件获取,可以提取出图片文件和布局文件进行使用查看。
dex2jar:将 apk (实际上是其中的 classes.dex) 反编译成 java 源码。
jd-gui:查看 jar 文件的结构和其中的源码。
PKID:查壳的工具。本来只有 Windows 版本的,有位大佬觉得每次虚拟机麻烦,于是写了个 java 的。
使用 PKID 查壳
双击打开 pkid.jar 然后将需要查的 apk 直接拖入即可。


其实有加壳的一般都具有明显的特征,因为大部分都是使用一些别人的加固厂商的产品来加固的。
如上面的 360加固 的 demo 中就有明显的特征: 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 文件的反编译可以直接使用下面的命令完成。
1 | d2j-dex2jar classes.dex |
然后就会生成对应反编译之后的 .jar 文件。
对于有 multidex 的就使用如下的命令
1 | d2j-dex2jar.sh the-apk-witch-mutidex.apk |


使用 jd-gui 查看 jar 文件的源码
前面 dex2jar 已经完成了生成 .jar 的工作,接下来就应用 jd-gui 来查看其中的 java 源码。
双击运行后,将想要查看的 .jar 拖入即可。
大概就是下图的效果。

总结
至此,一个没有加壳的 apk 已经被反编译完成了。脱壳还在学习中。
参考链接
参考链接1:反编译一个 APK https://www.jianshu.com/p/dbe579f6cc84
参考链接2:dex2jar multidex https://github.com/pxb1988/dex2jar/issues/63







