作者:jafon.tian
转载请注明出处:https://blog.csdn.net/JT_Notes
Android的应用包格式具有防篡改,防重打包的能力,这是如何做到的?秘密就隐藏在META-INF文件夹中,下面通过QQ安装包的分析来进行详细的说明和分析。
1. 准备
1 | 到QQ官网下载Android安装包mobileqq_android.apk |
2 | 将安装包后缀由apk改为zip,使用解压软件释放中其中的文件 |
3 | 将其中的META-INF文件夹拷贝出来,用于后续分析 |
META-INF/
--ANDROIDR.RSA
--ANDROIDR.SF
--MANIFEST.MF
2. 文件分析
名称 | 说明 |
---|---|
MANIFEST.MF | 包含了除META-INFO目录外所有文件的路径和hash结果 |
ANDROIDR.SF | 对MF整个文件和里面每个条目进行了二次hash |
ANDROIDR.RSA | 包含开发者证书以及使用开发者私钥对SF文件的签名 |
文件之间的逐层保护关系为 RSA文件–>SF文件–>MF文件–>应用其他文件
2.1 MANIFEST.MF文件
下面截取文件头部的片段进行说明,除了文件头,其他文件内容都遵循相同的规则。
Manifest-Version: 1.0
Name: AndroidManifest.xml
SHA1-Digest: 8tS1gpP+QbotpYp6jN1PCfulDbU=
名称 | 说明 |
---|---|
Manifest-Version: 1.0 | Manifest版本信息,应该是用于日后扩展使用 |
Name: AndroidManifest.xml SHA1-Digest: 8tS1gpP+QbotpYp6jN1PCfulDbU= |
Name字段指明应用文件全路径 SHA1-Digest字段指明使用的hash算法是SHA1以及计算结果的base64编码 |
SHA1-Digest计算过程:
- 对文件AndroidManifest.xml的进行SHA1运算,结果用16进制字符串表示为:
f2d4b58293fe41ba2da58a7a8cdd4f09fba50db5 - 将16进制字符串进行base64编码的结果为:
8tS1gpP+QbotpYp6jN1PCfulDbU=
2.2 ANDROIDR.SF文件
下面截取文件头部的片段进行说明,与MF文件类似,除了文件头,其他文件内容也是遵循相同的规则。
Signature-Version: 1.0
Created-By: 1.0 (Android)
SHA1-Digest-Manifest: ouJT4yGiaaiMea/Wu6708IP44P4=
X-Android-APK-Signed: 2
Name: AndroidManifest.xml
SHA1-Digest: lu99E667G2n1uJJ2nDaMFNZLEmE=
名称 | 说明 |
---|---|
Signature-Version: 1.0 Created-By: 1.0 (Android) X-Android-APK-Signed: 2 |
版本信息 |
SHA1-Digest-Manifest: ouJT4yGiaaiMea/Wu6708IP44P4= | 对MANIFEST.MF整个文件进行hash运算结果的base64编码形式,hash运算采用SHA1算法 |
Name: AndroidManifest.xml SHA1-Digest: lu99E667G2n1uJJ2nDaMFNZLEmE= |
Name字段指明应用文件全路径 SHA1-Digest字段是对SF中对应字段内容的hash运算结果,详细见下文说明 |
SHA1-Digest-Manifest计算过程:
- 对文件MANIFEST.MF进行SHA1运算,结果的16进制字符串表示为:
a2e253e321a269a88c79afd6bbaef4f083f8e0fe - 将16进制字符串进行base64编码的结果为:
ouJT4yGiaaiMea/Wu6708IP44P4=
SHA1-Digest计算过程:
- 在MANIFEST.MF文件中找到具有相同Name字段的内容。
在MANIFEST.MF文件中找到Name字段为AndroidManifest.xml的条目
“
Name: AndroidMani