本文主要目的:将apk进行反编译,对.dex加密再生成新的加密后的apk,运行时,再对该apk进行解密。
一、apk反编译
1、apk反编译,是通过使用apk编译工具将apk文件中源文件和资源反编译出来,得到源文件和资源文件可以进行处理后再进行编译,以达到个性化定制,汉化apk等目的。
二、apk反编译方法
以自己写的一个apk为例。apkaes-debug.apk
1、将apkaes-debug.apk后缀改为apkaes-debug.zip,并解压
其中:META-INF为该apk的签名文件(每个apk能装到手机上运行,都有签名文件)。
classes.dex:在Android系统中,一个App的所有代码都在一个Dex文件里面。Dex是一个类似Jar的包,存储了很多Java编译字节码的归档文件,是由dx.bat工具生成的。因为Android系统使用Dalvik虚拟机,所以需要把使用Java Compiler编译之后的class文件转换成Dalvik能够执行的class文件。
dx.bat工具所在路径:
C:\Users\61472\AppData\Local\Android\Sdk\build-tools\29.0.3
该路径包含很多工具,都是用来编译apk需要的工具。
2、下载dex2jar工具。dex2jar-2.0.zip
下载地址:https://sourceforge.net/projects/dex2jar/
解压dex2jar-2.0.zip,将classes.dex文件放到该文件夹下,命令行定位到该文件夹,使用命令d2j-dex2jar classes.dex -o classes.jar生成classes.jar文件。
3、下载jd-gui.exe工具。
File->Open File打开刚刚生成的classes.jar文件,可以看到源代码。
可以看到 ,未经加固的apk非常不安全,所以apk在发布之前,需要对代码进行加密之后再发布。这个过程叫做apk的加固。
三、加固的方案
基本思想:对apk的源文件源dex进行加密,外加一个壳dex对源dex进行解密。最后将源dex与壳dex都压缩到apk中。整体架构方案:
1、什么时dex文件。
加固的目的时保护dex文件。了解dex文件。
2、apk的打包过程
三、代码流程
步骤1:新建一个java工程addshell,生成加固apk。
步骤1:准备源dex 壳dex,将源dex与壳dex组装为一个新dex
1、源dex。以上文用到的apk为例。在addshel工程下新建文件夹/source/apk,将上文的apkaes-debug.apk放到该文件夹下。用代码将该apk文件解压到temp文件夹,得到classes.dex文件。并对classes.dex文件加密。加密后将classes.dex 改名为classes_.dex,方便区分。
2、获取壳dex。壳dex需要对加密的dex进行解密。加密后的apk已经运行在设备中.(省略)
3、处理aar。获取壳dex。
4、壳dex与源dex合并,生成apk;
5、对apk签名。