0.PE文件数字签名原理

签名

  • 软件发布者使用散列算法(如MD5或SHA)计算PE文件的散列值。
  • 软件发布者使用私钥对散列值进行签名得到签名数据。
  • 将签名私钥对应的公钥和签名数据等以证书的形式附加在PE文件之中,形成经过数字签名的PE文件。
  • 软件发布者将经过数字签名的PE文件进行发布。

验签

  • 从PE文件证书中提取软件发布者的公钥、使用的散列算法、签名算法、原始散列值的签名数据。
  • 使用提取的公钥和对应签名验证算法将签名数据还原为原始PE文件的原始散列值。
  • 对现有PE文件使用同样的散列算法计算出对应的散列值。
  • 对比两个散列值是否一致,从而判断数据是否被破坏和篡改。

恶意代码 第三章作业3

图0.1

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

输入私钥密码,不需要也太复杂

恶意代码 第三章作业3

图1.1

输入上一步设置好的密码

恶意代码 第三章作业3

图1.2

成功运行

恶意代码 第三章作业3

图1.3

出现了证书和私钥

恶意代码 第三章作业3

图1.4

(2)使用私钥进行签名并附加相应证书

双击证书打开,会显示不受信任,安装一下就好了,单击安装证书

恶意代码 第三章作业3

图1.5

选择当前用户,单击下一步

恶意代码 第三章作业3

图1.6

选择将所有证书都放入下列存储,单击浏览,选择受信任的根证书颁发机构

恶意代码 第三章作业3

图1.7

单击完成即可

恶意代码 第三章作业3

图1.8

再次打开就会信任此证书

恶意代码 第三章作业3

图1.9

单击详细信息就可以查看证书的版本、序列号、签名哈希算法等参数

恶意代码 第三章作业3

图1.10

右键signcode.exe以管理员身份运行为Hello25.exe签名

恶意代码 第三章作业3

图1.11

单击浏览选择文件路径(我这里重命名了一下)

恶意代码 第三章作业3

图1.12

单击自定义,然后下一步

恶意代码 第三章作业3

图1.13

单击从文件中选择,找到之前生成的证书文件,选择X.509证书,单击打开,下一步

恶意代码 第三章作业3

图1.14

选择磁盘上的私钥文件,单击浏览找到之前生成的.PVK文件,下一步

恶意代码 第三章作业3

图1.15

签名算法选择sha1(这里的散列算法是PE文件的签名信息, 而之前makecert.exe设置的md5是证书的散列算法。)

恶意代码 第三章作业3

图1.16

选择“证书路径中的所有证书,包括根证书”,下一步,之后单击完成即可

恶意代码 第三章作业3

图1.17

弹出下面这个弹窗即成功签名,文件的属性也会多一栏信息,可以点击详细信息查看

恶意代码 第三章作业3

图1.18

恶意代码 第三章作业3

图1.19

2.解析证书信息和程序中所带的签名信息

使用PEview查看程序 发现多了一个数字签名

恶意代码 第三章作业3

图2.1

在数据目录表中找到验证表的偏移量为0x00000A00,大小为0x000004B0

恶意代码 第三章作业3

图2.2

来到签名对应的位置,前4字节代表表项长度,值为0x000004B0,与数据目录表一致;后面两字节为证书版本,值为0x0200,表示版本号为WIN_CERT_REVISION_2,还有一个0x0100代表WIN_CERT_REVISION_1,但不太常用;最后两字节代表证书类型,值为0x0002,意为包含PKCS#7的SigneData的结构,后面一直到结束都是签名的具体内容。

恶意代码 第三章作业3

图2.3

使用010 Editor打开文件,复制签名数据,从第9字节开始,到末尾的0x00结束

恶意代码 第三章作业3

图2.4

恶意代码 第三章作业3

图2.5

鼠标右键选择selection,单击Save Selection,选好要存储的目录保存即可

恶意代码 第三章作业3

图2.6

由于导出的签名数据为ASN.1的数据结构,所以需要``ASN1ViewASN1Dump进行解析,我这里采用的是ASN1Dump`进行分析

内容所遵守的标准编码和签名信息

  • 指定SignedData结构
    值为“1.2.840.113549.1.7.2”,表示采用PKCS#7结构

  • 生成签名的哈希算法
    图中为SHA1:1.3.14.3.2.26

    MD5: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

恶意代码 第三章作业3

图2.7

证书信息

获取证书颁发者信息,包括md5withRSA签名、证书颁发者、组织、国家及省份

恶意代码 第三章作业3

图2.8

还存储了证书有效时间和RSA公钥等信息

恶意代码 第三章作业3

图2.9

恶意代码 第三章作业3

图2.10

恶意代码 第三章作业3

图2.11

恶意代码 第三章作业3

图2.12

RSA签名后的数据和公钥值会还原出来第一个hash值,摘要数据存储hash值。如果两个值一致,则表示该PE文件在传输过程中未被篡改或破坏,且受信任;否则已经被破坏

使用ASN1View解析会把数据基本分析好,只需要查看就行

恶意代码 第三章作业3

图2.13

3.按照实践1修改程序后再次查看签名信息

修改后发现证书无效,原因应该是摘要值发生了改变

具体修改方式见博客园链接

恶意代码 第三章作业3

图3.1

我们提前在另一原始程序中重新进行上述更改(未进行数字签名),将前6个字节改为我们所需要的效果,多余的两字节直接改为00即可,保存之后重新签名

恶意代码 第三章作业3

图3.2

复制新程序没有问题的数字签名

恶意代码 第三章作业3

图3.3

前面8字节都是一样的,可以不复制,把有问题的签名直接覆盖掉

恶意代码 第三章作业3

图3.4

修改完成后数字签名显示正常

4.修改带有有效签名的文件,使得签名仍然有效

使用010 Editor打开程序,修改签名大小为0x000004B8

恶意代码 第三章作业3

图4.1

在签名的最后添加一串字符

恶意代码 第三章作业3

图4.2

保存,证书依然有效

恶意代码 第三章作业3

图4.3

将一个PE文件可以直接嵌入数字签名中,修改大小为0x568=0x4a0+0xc80xc8=200为PE文件的大小

恶意代码 第三章作业3

将PE文件内容直接粘贴就好了

恶意代码 第三章作业3

修改完成后数字签名显示正常

5.如何更有效的检测数字签名

①对时间戳检验

右键属性,详细信息可以查看签名时间

恶意代码 第三章作业3

图5.1

virustotal网站对PE文件检验

即使数字签名正常,PE文件也不一定是绝对安全的,最好检验一下

恶意代码 第三章作业3

图5.2

原程序的检验

恶意代码 第三章作业3

图5.3

修改后数字签名正常的情况下程序的检验

问题

修改签名使签名仍然有效,增加的字节数必须是8的整数倍,否则证书就会失效,不太理解为什么(不过PE文件中的信息是使用了0x00补齐8字节的),对签名验签的流程不太懂

使用文件中给出的公钥,签名值,散列值验签失败

参考文章

[网络安全自学篇] 六十一.PE文件逆向之数字签名详细解析 作者: Eastmount

恶意文件分析中的数字签名验证 作者:李志昕

相关文章: