反编译未加固的 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