Android之反编译apk

  想象一下,如果你的开发的apk被别人反编译出来,而且代码还没有混淆,如果涉及到商业机密的话,你想想你的老板是不是要找你麻烦,要想知道你打出来的包被解出来之后会有哪些东西,你需要先学会反编译你的apk。废话不多说,下面开始介绍如何反编译:

工具准备

apktool —— 下载链接,其作用是拿到apk 中的dex文件;(可选工具,非必须)
dex2jar—— 下载链接,见名知意,就是把dex转化为jar文件,这是最关键的一步;
gui —— 下载链接,这是一个图形化工具,查看jar里面的代码。(非必需,有其他可替代工具)

整个过程大致三步:从apk文件中拿到dex文件,把dex文件转化为jar包文件,查看jar文件中的代码;

从apk文件中拿到dex文件

这里介绍两种从apk文件中拿到dex文件的方法:
1、使用apktool,首先在上面的apktool链接中下载到两个文件:apktool.bat、apktool.jar,之后将两个文件放在你自己指定的一个文件夹下,然后在电脑环境变量中配置apktool,之后将apk文件放在apktool.jar同级的目录下,然后在命令行中定位到当前文件夹,然后输入命令:
apktool d xxx.apk 这样就成功了。会在当前目录下生成一个以 apk 命名的目录,这个目录就是解压出来的目录。如下图:demo.apk执行完命令之后会生成demo1文件夹。

执行命令生成文件.png
文件夹中的具体内容是这样的:
demo1.png
可能你注意到这里面并没有看到dex文件,那怎么才能有dex文件呢,下面是apktool的命令,注意到其中有一个options是-s,也就是说不解码sources。
apktools命令.png
接下来执行一下apktool d -s xxx.apk,执行之后解出来的文件内容是这样的:
demo2.png
可以看到其中多了一个classes.dex文件,但是没有了smali文件,那么classes.dex文件到底是什么文件呢?classes.dex是程序的核心文件,是java语言的代码编译后的二进制字节码程序。这种字节码程序是编译专供机器阅读的, 类似于汇编语言的机器码。然而如果想直接阅读这部分程序, 最好的方法就是将该文件转化为smali文件。反编译工具 apktool 就可以完成这部分工作。它将classes.dex文件反编译成一堆的smali文件, 这些文件按源码的包结构保存在各自的文件夹中。另外, apktool 工具强大之处在于它不仅可以反编译apk文件, 而且可以根据现有的smali 文件生成新的apk文件。 这就给汉化apk或者去除apk内嵌广告提供了可能。
2、用解压文件打开,修改.apk后缀为.zip,之后直接解压。这种方式就比较粗暴直接了。但是相较于第一种方式,这种做法可能会造成 xml 乱码。下面是直接解压之后的文件:
demo3.png

另外,现在app为了突破最大方法数量限制,用了多dex 方式,所以这里apk内部可能会有多个dex文件。

将dex转换为jar文件

这里比较重要的是dex2jar工具,把刚才下载dex2jar解压并放到与apk同级的目录下,然后把classes.dex文件放到刚刚解压出来的dex2jar文件夹下。之后cmd定位到dex2jar目录下运行命令:d2j-dex2jar classes.dex classes2.dex(如果有两个dex文件,就像这样执行),执行完之后会出现如下的文件,其中classes-dex2jar.jar这个文件就是我们所需要的了。

dex2jar文件夹.png
如果在执行上面命令的时候出错了,有可能是命令写的不对,你可能需要这样写:.\d2j-dex2jar classes.dex classes2.dex

用gui 图形化工具查看代码

下载好gui工具,安装好文件之后,直接把jar文件拖入其中即可。

反编译后的文件.png

需要说明一下的这里的文件不包括注册文件,布局文件等,只有class文件,其他文件在上面解压apk的时候就可以看得到了。
  说完了反编译,那么我们应该怎么做才能防止别人在反编译我们的apk之后,获取到我们的源码文件呢,不妨来看看代码混淆

参考文章:
android 反编译方法、工具介绍
Android反编译技术总结
Android 反编译的使用

你可能感兴趣的:(Android之反编译apk)