Android-APK加固
学习APK加固,首先我们需要了解APK的构造。才能了解我们需要加固什么,怎么保护我们文件信息。
将APK解压
APK解压后的文件目录目录结构
assets:存放资源文件的目录
lib:存放ndk生成的so文件
META-INF:签名信息存放的目录
res:资源文件的存放目录
AndroidMannifest:清单文件,存储描述了应用的名字、版本、权限、注册的服务等信息
classes.dex:java源码编译经过编译后生成的dalvik字节码文件,主要在Dalvik虚拟机上运行的主要代码部分。这类文件可能会有多个。
resources.arsc:编译后的二进制资源索引文件(通过resources.arsc能过准确的找到对应的资源文件)。
对文件的加固一般分为.dex文件加固保护java源码和so文件加固保护so不被泄露。
.dex文件加固:
加固基本思想:
①原apk文件,解压过后有若干文件和若干.dex文件。
②我们需要一个壳dex文件,壳dex文件的application方法具有解密和恢复功能代码。
③我们有2种方式加壳:
(1)通过对dex文件有深入的了解,我们把所有的原dex加密并拼接写入壳dex文件中,并记录位置,以方便我们知道从哪里开始使我们源dex文件内容。仅能破译壳dex文件的有效内容。(最终只有一个dex文件 内容=壳dex文件+加密后的dex文件内容)。
(2)我们把所有原dex文件加密重新写入一个dex文件中,命名不要和壳dex文件冲突即可,如我们重命名为class_jiami1.dex类似这种方式。仅能破译壳dex文件,所有的加密过后的dex文件将无法被识别和破译。(最终只有一个可识别的dex文件,和若干不可识别的特殊命名的dex文件。)
④不管用哪种方式加壳,我们把新dex文件们和apk的其他文件,进行重新打包生成新的apk。
⑤新的apk重新签名生成可安装的apk.
运行解壳思想:
①运行apk,会加载apk中dex文件的application方法。application有2个关键方法attachBaseContext和onCreate方法,先运行attachBaseContext然后运行onCreate。
②attachBaseContext 我们dex解密重新加载回程序就在这个方法内执行。由于加壳方式不同,解壳方式也不同。
(1) 通过dex文件记录的文件大小值,我们可以读取len(.dex文件) – len(记录的文件大小值),即这个大小之后的数据就是我们拼接进去的原dex文件加密过后的内容,我们对这些数据内容进行解密,保存到资源目录(一般是apk的data私有目录下自己指定的目录),然后参考热修复的方式,我们反射或者自定ClassLoader加载这些dex文件。
(2)直接通过解密算法解密其他特殊命名的dex文件,然后参考热修复的方式,我们反射或者自定ClassLoader加载这些dex文件。
③onCreate中,反射修改AndroidThread类,将Application指向原dex文件中的Application,然后创建原Application对象,调用Applicaiton中的OnCreate等方法启动原程序。