必备的系统知识#Apk打包签名

56 阅读3分钟

必备的系统知识#系统启动

必备的系统知识#AMS

必备的系统知识#PMS

必备的系统知识#Binder

必备的系统知识#Apk打包签名

必备的系统知识#Handler

一.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