第三章作业3
0.PE文件数字签名原理
签名
- 软件发布者使用散列算法(如MD5或SHA)计算PE文件的散列值。
- 软件发布者使用私钥对散列值进行签名得到签名数据。
- 将签名私钥对应的公钥和签名数据等以证书的形式附加在PE文件之中,形成经过数字签名的PE文件。
- 软件发布者将经过数字签名的PE文件进行发布。
验签
- 从PE文件证书中提取软件发布者的公钥、使用的散列算法、签名算法、原始散列值的签名数据。
- 使用提取的公钥和对应签名验证算法将签名数据还原为原始PE文件的原始散列值。
- 对现有PE文件使用同样的散列算法计算出对应的散列值。
- 对比两个散列值是否一致,从而判断数据是否被破坏和篡改。
1.对Hello25.exe进行数字签名
(1)生成证书和私钥
在windows下使用管理员模式打开cmd,cd到makecert.exe所在目录下,执行以下指令以生成证书和私钥
常用参数(输入
makecert -help
可查看帮助文档):
- -r: 自签名
- -n: 证书名称,格式为-n “CN=名称, E=Email,O=组织名称,C=国家, S=省份(州), P=县城”
- -a: 指定散列算法,其值必须是md5(默认值)或SHA1
- -$: 指定证书的签名权限,其值必须是commercial(商业软件)或individual(个人软件)
- -b: 证书有效期的开始时间,格式为月/日/年(例如04/18/2021)
- -e: 证书有效期的结束时间,格式为月/日/年
makecert -r -$ "individual" /sv "test_pvk.PVK" -n "CN=whb,O=besti,C=China,S=BeiJing" -a md5 -b 04/18/2021 -e 01/01/2030 test_cer.cer
输入私钥密码,不需要也太复杂
输入上一步设置好的密码
成功运行
出现了证书和私钥
(2)使用私钥进行签名并附加相应证书
双击证书打开,会显示不受信任,安装一下就好了,单击安装证书
选择当前用户,单击下一步
选择
将所有证书都放入下列存储
,单击浏览,选择受信任的根证书颁发机构
单击完成即可
再次打开就会信任此证书
单击详细信息就可以查看证书的版本、序列号、签名哈希算法等参数
右键
signcode.exe
以管理员身份运行为Hello25.exe签名
单击浏览选择文件路径(我这里重命名了一下)
单击自定义,然后下一步
单击从文件中选择,找到之前生成的证书文件,选择X.509证书,单击打开,下一步
选择磁盘上的私钥文件,单击浏览找到之前生成的
.PVK
文件,下一步
签名算法选择
sha1
(这里的散列算法是PE文件的签名信息, 而之前makecert.exe设置的md5
是证书的散列算法。)
选择“证书路径中的所有证书,包括根证书”,下一步,之后单击完成即可
弹出下面这个弹窗即成功签名,文件的属性也会多一栏信息,可以点击详细信息查看
2.解析证书信息和程序中所带的签名信息
使用
PEview
查看程序 发现多了一个数字签名
在数据目录表中找到验证表的偏移量为
0x00000A00
,大小为0x000004B0
来到签名对应的位置,前4字节代表表项长度,值为
0x000004B0
,与数据目录表一致;后面两字节为证书版本,值为0x0200
,表示版本号为WIN_CERT_REVISION_2,还有一个0x0100
代表WIN_CERT_REVISION_1,但不太常用;最后两字节代表证书类型,值为0x0002
,意为包含PKCS#7
的SigneData的结构,后面一直到结束都是签名的具体内容。
使用010 Editor打开文件,复制签名数据,从第9字节开始,到末尾的
0x00
结束
鼠标右键选择selection,单击Save Selection,选好要存储的目录保存即可
由于导出的签名数据为ASN.1的数据结构,所以需要``ASN1View
或
ASN1Dump进行解析,我这里采用的是
ASN1Dump`进行分析
内容所遵守的标准编码和签名信息
指定SignedData结构
值为“1.2.840.113549.1.7.2”,表示采用PKCS#7结构生成签名的哈希算法
图中为SHA1:1.3.14.3.2.26MD5:1.2.840.113549.2.5
SHA256 2.16.840.1.101.3.4.2.1
签名属性
SPC:1.3.6.1.4.1.311.2.1.4
证书信息
获取证书颁发者信息,包括md5withRSA签名、证书颁发者、组织、国家及省份
还存储了证书有效时间和RSA公钥等信息
RSA签名后的数据和公钥值会还原出来第一个hash值,摘要数据存储hash值。如果两个值一致,则表示该PE文件在传输过程中未被篡改或破坏,且受信任;否则已经被破坏
使用
ASN1View
解析会把数据基本分析好,只需要查看就行
3.按照实践1修改程序后再次查看签名信息
修改后发现证书无效,原因应该是摘要值发生了改变
具体修改方式见博客园链接
我们提前在另一原始程序中重新进行上述更改(未进行数字签名),将前6个字节改为我们所需要的效果,多余的两字节直接改为00即可,保存之后重新签名
复制新程序没有问题的数字签名
前面8字节都是一样的,可以不复制,把有问题的签名直接覆盖掉
修改完成后数字签名显示正常
4.修改带有有效签名的文件,使得签名仍然有效
使用010 Editor打开程序,修改签名大小为
0x000004B8
在签名的最后添加一串字符
保存,证书依然有效
将一个PE文件可以直接嵌入数字签名中,修改大小为
0x568
=0x4a0
+0xc8
,0xc8
=200为PE文件的大小
将PE文件内容直接粘贴就好了
修改完成后数字签名显示正常
5.如何更有效的检测数字签名
①对时间戳检验
右键属性,详细信息可以查看签名时间
②virustotal网站对PE文件检验
即使数字签名正常,PE文件也不一定是绝对安全的,最好检验一下
原程序的检验
修改后数字签名正常的情况下程序的检验
问题
修改签名使签名仍然有效,增加的字节数必须是8的整数倍,否则证书就会失效,不太理解为什么(不过PE文件中的信息是使用了
0x00
补齐8字节的),对签名验签的流程不太懂
使用文件中给出的公钥,签名值,散列值验签失败