- 对本书的赞誉
- 前言
- 基础篇
- 第 1 章 Android 中锁屏密码加密算法分析
- 第 2 章 Android 中 NDK 开发
- 第 3 章 Android 中开发与逆向常用命令总结
- 第 4 章 so 文件格式解析
- 第 5 章 AndroidManifest.xml 文件格式解析
- 第 6 章 resource.arsc 文件格式解析
- 第 7 章 dex 文件格式解析
- 防护篇
- 第 8 章 Android 应用安全防护的基本策略
- 第 9 章 Android 中常用权限分析
- 第 10 章 Android 中的 run-as 命令
- 第 11 章 Android 中的 allowBackup 属性
- 第 12 章 Android 中的签名机制
- 第 13 章 Android 应用加固原理
- 第 14 章 Android 中的 so 加固原理
- 工具篇
- 第 15 章 Android 逆向分析基础
- 第 16 章 反编译神器 apktool 和 Jadx
- 第 17 章 Hook 神器 Xposed
- 第 18 章 脱壳神器 ZjDroid
- 第 19 章 Native 层 Hook 神器 Cydia Substrate
- 操作篇
- 第 20 章 静态方式逆向应用
- 第 21 章 动态调试 smali 源码
- 第 22 章 IDA 工具调试 so 源码
- 第 23 章 逆向加固应用
- 第 24 章 逆向应用经典案例分析
- 第 25 章 Android 中常见漏洞分析
- 第 26 章 文件加密病毒 Wannacry 样本分析
12.2 Android 中签名流程
下面开始从源码中去分析 Android 中的签名机制和原理流程。因为网上没有找到 jarsigner 的源码,但是找到了 signapk 的源码,下面就来看看 signapk 的源码:源码位置是 com/android/signapk/sign.java。
通过上面的签名可以看到,Android 签名 apk 之后,会有一个 META-INF 目录,这里有三个文件:
·MANIFEST.MF
·CERT.SF
·CERT.RSA
下面来看看这三个文件到底是干啥的。
1.MANIFEST.MF 文件
这个文件主要包括 apk 文件中所有文件的数据摘要内容,如下所示:
下面来看看源码:
在 main 函数中,需要输入四个参数,然后开始写 MANIFEST.MF 文件内容:
进入方法 manifest.write(outputJar):
代码逻辑很简单,主要看那个循环的意思:除了三个文件(MANIFEST.MF、CERT.RSA、CERT.SF)之外都会对其他文件内容做一次 SHA1 算法,就是计算出文件的摘要信息,然后用 Base64 进行编码即可,下面用工具来做个案例看看是不是这样:首先安装工具:HashTab,这个工具网上有,可以自行搜索下载。然后网上搜索在线计算 Base64。
下面就开始验证工作吧。验证一下 AndroidManifest.xml 文件,首先在 MANIFEST.MF 文件中找到这个条目,记录 SHA1 的值,如下所示:
安装 HashTab 之后,找到 AndroidManifest.xml 文件,右击,选择 Hashtab,如图 12-7 所示。
复制 SHA-1 的值:9C64812DE7373B201C294101473636A3697FD73C,到上面的那个 Base64 转化网站,转化一下,如图 12-8 所示。
图 12-7 查看文件的 SHA-1 值
图 12-8 SHA-1 值转化
nGSBLec3OyAcKUEBRzY2o2l/1zw=和 MANIFEST.MF 中的条目内容一模一样。
那么从上面的分析就知道了,其实 MANIFEST.MF 中存储的是这样的内容:逐一遍历里面所有条目,如果是目录就跳过,如果是一个文件,就用 SHA1(或者 SHA256)消息摘要算法提取出该文件的摘要然后进行 BASE64 编码后,作为“SHA1-Digest”属性的值写入到 MANIFEST.MF 文件中的一个块中。该块还有一个“Name”属性,其值就是该文件在 apk 包中的路径。
2.CERT.SF 文件
这个文件主要是前面 MANIFEST.MF 文件的每个块内容的数据摘要信息,如下所示:
这里的内容感觉和 MANIFEST.MF 的内容差不多,来看看代码吧:
进入到 writeSignatureFile 方法中:
首先可以看到,需要对之前的 MANIFEST.MF 文件整个内容做一个 SHA1 放到 SHA1-Digest-Manifest 字段中。
看看 manifest 变量就是刚刚写入了 MANIFEST.MF 文件的,这个可以验证一下,如图 12-9 所示。
然后转化一下,如图 12-10 所示。
图 12-9 查看文件的 SHA-1 值
图 12-10 SHA-1 值转化成 Base64
看到了吧,和文件中的值是一样的,如下所示:
下面继续看代码,有一个循环:
这里还是用到了刚刚传入的 mainfest 变量,遍历它的条目内容,然后进行 SHA 算法计算,再用 Base64 计算一下。其实就是对 MANIFEST.MF 文件中的每个条目内容做一次 SHA,再保存一下即可。
做个例子验证一下:用 AndroidManifest.xml 为例,把 MANIFEST.MF 文件中的条目拷贝保存到 txt 文档中,如图 12-11 所示。
图 12-11 签名文件格式
这里需要注意的是,保存之后,需要添加两个换行,可以在代码中看到逻辑如下所示:
然后计算 txt 文档的 SHA 值,如图 12-12 和图 12-13 所示。
图 12-12 查看文件签名
图 12-13 Base64 转码
看到了吧,这里计算的值是一样的,如下所示:
到这里就知道 CERT.SF 文件做了什么,如下所示:
1)计算 MANIFEST.MF 文件的整体 SHA1 值,再经过 BASE64 编码后,记录在 CERT.SF 主属性块(在文件头上)的“SHA1-Digest-Manifest”属性值值下。
2)逐条计算 MANIFEST.MF 文件中每一个块的 SHA1,并经过 BASE64 编码后,记录在 CERT.SF 中的同名块中,属性的名字是“SHA1-Digest”。
3.CERT.RSA 文件
这个文件就是对前面 CERT.SF 文件做签名操作之后的结果,也就是前面提到的签名文件,如下所示:
看到都是二进制文件,因为 RSA 文件加密了,所以需要用 openssl 命令才能查看其内容,如下所示:
关于这些信息,可以参考图 12-14 的解释。
来看一下代码:
图 12-14 rsa 文件格式说明
这里会把之前生成的 CERT.SF 文件用私钥计算出签名,然后将签名以及包含公钥信息的数字证书一同写入 CERT.RSA 保存。CERT.RSA 是一个满足 PKCS7 格式的文件。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论