Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说秒懂Android应用加固之dex加固,希望能够帮助你!!!。
Android应用加固是一个很常见的功能,但是对其原理了解的人却不多。
下面,小亭跟您聊聊Android应用加固中的代码加固技术。
代码加固就是对dex加固,dex文件是对多个class文件的压缩。不管是加固,还是热更新、插件化、APM工具,这些技术的原理都是相同的,都是对dex的研究。所以这部分知识的了解还是很有必要的。
下面从以下三个方面对Android应用加固的dex加固技术进行说明。
一、dex文件是什么?
二、加固流程是什么?
三、如何加载加固后的dex文件?
我们先看第一个问题:
一、dex文件是什么?
apk就是一个zip包。这个zip压缩包中有以下文件:
1、dex文件:多个class文件的压缩。
2、META-INF夹:签名文件。
3、AndroidManifest.xml文件
4、lib: so库
5、resources.arsc:资源文件压缩包
6、assets:assets目录下的资源
二、加固流程是什么?
1、解压缩APK,将dex文件放到一个文件夹中。
2、对dex文件进行AES加密。
3、生成壳dex文件。
4、将源dex文件和壳dex文件以及解压文件夹下的其他文件一起生成新apk文件。
5、对新apk文件进行签名,生成最终apk文件。
对于上述流程,我们会产生以下问题:
1、dex文件可以随便拼凑么?
2、壳dex怎么来的?
3、如何签名?
4、如何运行新apk(如何脱壳)?
在解答以上疑问之前,让我们先来了解一个必备知识,就是apk的打包流程。
1、应用资源使用aapt生成R.java和resouces.arsc,AS帮我们做的。
2、Aidl文件使用aidl工具生成Java接口
3、R.java、Aidl相关Java文件和我们的java文件通过Java解析器生成class文件
4、使用dx工具将所有class文件生成dex文件
5、使用apkBuider将资源文件、dex文件等生成apk文件
6、使用签名工具对apk文件进行签名,生成最终的apk文件。
对源Dex文件进行加密:apk->unzip->过滤dex->对dex文件加密
1、通过ZipFile解压缩apk文件
2、用文件过滤器过滤出dex文件放到一个数组中
3、将每一个dex文件转成byte数组
4、将byte数组进行AES加密
5、将byte数组通过文件IO写回到原来的文件
生成壳dex文件:aar->unzip->过滤jar->用dx转成dex
1、将一个module生成的aar文件解压
2、过滤出jar文件
3、使用dx工具将jar文件转成dex文件
生成新apk文件:
使用Zip.zip将解压目录打包成apk文件。
对apk进行签名:
使用apksigner命令对apk进行签名。
三、如何加载Dex文件
Apk第一次启动时,解密dex文件。也就是在壳dex的Application的attachBaseContext方法中处理。
解密代码使用C++开发,生成so库,防止激活成功教程。秘钥通过网络传输过来。
使用hook修改dexElements[]。通过反射将最后的dex插入到dexElements数组中。
使用hook技术将两个application统一起来,让系统看起来只有一个application。
以上便是应用加固技术的核心原理,与热修复、插件化如出一辙。
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。