在我们安卓开发当中,我们不仅需要掌握基础的开发技能,也需要掌握软件的安全技能,这样才可以让我们的软件能够成为一款能够真正可以进行发布的软件,同时也可以让自己的核心技术不会被别人所盗取。
首先我们应当了解的是,对于正常的反编译我们一共需要三个工具,它们分别是:APKTool、dex2jar 和 jd-gui。
APKTool:用于解析apk的res文件以及AndroidManifest.xml文件
dex2jar:用于把apk解压后生成的classes.dex文件解析为后缀为jar的文件,与下面的jd-gui工具联合使用则可以得到我们的核心Java代码
jd-gui:将上一步所得到的jar文件解析为Java文件,从而得到软件的核心代码
注意:这就是反编译的核心流程,凡是没有被MD5算法加密,或者未被加固过的APK都可以利用这个方法来进行反编译破解。
解析apk中的图片、视图资源 —>通过apktool d 工具 —> 解析出图片、视图资源
解析apk中的jar包---->通过dex2jar工具 ----->解析出jar包
解析 jar为Java源码---->通过jd-gui工具------>查看Java源码
apktool 官方网址:https://ibotpeaches.github.io/Apktool/install/
Windows:
apktool.bat
)apktool.jar
apktool.jar
&apktool.bat
)移至Windows目录(通常为C://Windows
)C://Windows
,则可以将两个文件放在任何位置,然后将该目录添加到环境变量系统PATH变量中。Linux:
apktool
)apktool.jar
apktool.jar
&apktool
)移动到/usr/local/bin
(需要root)chmod +x
)macOS:
apktool
)apktool.jar
apktool.jar
&apktool
)移动到/usr/local/bin
(需要root)chmod +x
)或者您可以通过Homebrew安装apktool :
brew install apktool
在终端中执行命令(无需root)。最新版本将安装/usr/local/Cellar/apktool/[version]/
并链接到/usr/local/bin/apktool
。注意 -包装脚本不是必需的,但很有用,因此您不必java -jar apktool.jar一遍又一遍地输入。
使用命令如下命令即可,注意默认反编译文件同在apk所在目录
apktool d 指定需要反编译的apk
这样我们的反编译过程就完成了,如下所示:
$ apktool d test.apk
I: Using Apktool 2.4.1 on test.apk
I: Loading resource table...
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: 1.apk
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Baksmaling classes.dex...
I: Copying assets and libs...
I: Copying unknown files...
I: Copying original files...
其中的res文件夹是程序当中的所有资源文件,smali文件夹下存放了程序所有的反汇编代码。apktool这个工具主要是用来解析资源res和资源AndroidManifest.xml的,除此之外的,我们还需要另外的工具来解析Java源码,利用下以下两个工具则可以用于解析Java源代码,它们分别是:dex2jar和jd-gui.
dex2jar的下载网址是:https://sourceforge.net/projects/dex2jar/files/latest/download
1.下载到我们刚刚安装apktool的文件夹下,然后解压,更改解压后的文件名为dex2jar
如果是macos 需要设置文件夹dex2jar/的执行权限,命令如下:
chmod -R +x dex2jar/
.bash_profile 中增加环境变量(由于d2j-dex2jar名字太长了,我们增加一个别名方便以后通过dex2jar
命令即可使用):
alias dex2jar='/Users/summer/Downloads/dex2jar/d2j-dex2jar.sh'
2.执行以下命令将apk文件解析出jar包:
注意默认解析的jar路径为dex2jar包根目录,但我们增加了环境变量,则默认是你命令执行的当前目录;
./d2j-dex2jar.sh xxx.apk
或 dex2jar xxx.apk
当然我们可以改变输出目录,如我放在desdisk目录下,可以增加一个-o参数即可。如下
./d2j-dex2jar.sh xxx.apk -o /desdisk/xxx.jar
或 dex2jar xxx.apk -o /desdisk/xxx.jar
APKTool是GOOGLE提供的APK编译工具,能够反编译及回编译apk,同时安装反编译系统apk所需要的framework-res框架,清理上次反编译文件夹等功能。但这些基础都在用app没有被其他工具加密或加固的前提下,加固过的反编译有些复杂,这里不再阐述,大家可以查询网上其他资料;另外市面上也有大量的apk破解工具也就是基于上述几种工具的一种包装组合,更方便用户使用!如何加固自己的app有很多种解决方案,如360加固、腾讯加固等;更多加固探讨文章请参看 《移动安全专场——APP加固新方向(演讲速记)》