一.Apk打包签名那些事
1.打包流程
我们用as打包时,gradle会借助build-tools中的一些命令帮助我们编译,比如aapt/appt2编译资源文件,aidl.exe帮助我们生成java代码等,然后使用dx/d8编译生成android虚拟机运行的dex文件,如果设置了multdex会帮助我们打包多个dex文件,随后资源文件、so、asset\manifest和dex一起打包成.apk文件, 我们就可以对apk进行zipalign对齐在进行签名,签完名之后在最后完成了apk的整体打包流程。
2.签名流程
- 签名有什么用?
安卓中的签名属于自我验签,它可以防止我们的数据被篡改及数据的一致性,并且我们更新升级安装的时候也会帮助我们来验证。
- 签名的机制
消息摘要:
md5、sha1、sha256,通过hash算法对文件计算出特定长度的数字,可以验证数据是否被更改,并且它不具有可逆性。
非对称加密:
公钥加密、私钥解密这种就是非对称加密,两端算法不一致,如发送端使用公钥加密,接收端拿到私钥进行解密,常见的算法有RSA。
对称加密:
公钥和私钥都是同一个,我们就叫对称加密,两端都用同一个算法来加解密,常见的算法有AES、3DES、DES。
签名机制:
非对称加密使用一对密钥,即公钥和私钥。私钥由签名者秘密保存,公钥可以公开分发。在验签过程中,主要基于“私钥签名、公钥验证”的原则,签名者使用私钥对消息的摘要(通常通过消息摘要算法生成)进行加密,生成签名;验证者使用公钥对签名进行解密,并与重新计算的消息摘要进行比对,如果一致则验签成功,表明消息在传输过程中未被篡改且确实来自签名者。
- 签名的实现
首先我们要生成签名密钥,签名密钥可以使用命令来完成,也可以使用as提供的图形界面化来操作。生成签名后,我们就可以使用签名来对我们的应用来签名了,签名的大致流程如下图:
所以对一个APK文件签名之后,APK文件根目录下会增加META-INF目录,该目录下增加三个文件:
MANIFEST.MF、CERT.SF、CERT.RSA。
二.如何实现apk的加固
1.为什么要加固?
.class文件容易被反编译,基本属于裸奔。
2.加固方案与原理
方案1:检测是否是虚拟机
由于虚拟机可以开启root模式,甚至可以自己编译系统,我们可以通过检测是否是虚拟机来决定是否强制关闭app;
方案2:代码虚拟化
在平台之上再加一层虚拟器运行自己的代码。
方案3:部分代码加密
对样本部分代码进行加密。
3.代码加密加固实现
1.流程分析
它的原理就是对部分dex进行加密,并且配套一个壳dex,这个壳dex的作用是用来解密这个加密后的dex文件,然后对apk重新打包签名。
2.代码编写
1.apk解压缩获取要加密的dex文件并进行加密
2.壳中的aar中的jar提取打包成dex文件
3.合并壳dex和加密后的dex文件
4.apk对齐与签名
5.在application运行时利用壳的dex解密代码对加固后的apk进行解密后进行hook dex替换
6.hook自己应用的application