我有一个带有数字签名的 PE 二进制文件。我想得到原始的 PE 散列(不是整个文件的散列)。
我不知道如何从文件中读取它。Authenticode 规范建议 PKCS#7 签名块(例如属性证书表)具有包含原始 PE 哈希的 ContentInfo 字段。不幸的是,微软没有定义 ContentInfo 结构。PKCS#7 规范也没有。
如果文件被篡改,重新计算哈希将无济于事。
我有一个带有数字签名的 PE 二进制文件。我想得到原始的 PE 散列(不是整个文件的散列)。
我不知道如何从文件中读取它。Authenticode 规范建议 PKCS#7 签名块(例如属性证书表)具有包含原始 PE 哈希的 ContentInfo 字段。不幸的是,微软没有定义 ContentInfo 结构。PKCS#7 规范也没有。
如果文件被篡改,重新计算哈希将无济于事。
PKCS7(又名 CMS)当然确实定义了泛型ContentInfo
. 请参阅rfc2630 第 3 节等,或 rfc2315 第 7 节(无锚链接):
ContentInfo ::= SEQUENCE {
contentType ContentType,
content [0] EXPLICIT ANY DEFINED BY contentType }
ContentType ::= OBJECT IDENTIFIER
但这是故意如此灵活,以至于在处理数据时毫无用处:它可以包含任何类型的数据,只要有一个 OID 来标识该类型的数据。
你不清楚你的来源,但我第一次在谷歌上点击“Authenticode 签名格式”是 download.microsoft.com/download/9/c/5/9c5b2167-8017.../Authenticode_PE.docx 并且在页面上说7 关于contentInfo
用于SignedData
Authenticode 的:
• contentType 必须设置为 SPC_INDIRECT_DATA_OBJID (1.3.6.1.4.1.311.2.1.4)。
• content 必须设置为SpcIndirectDataContent 结构,这将在后面介绍。
从第 9 页到第 11 页(确实在后面)包含一个详细的定义,以
SpcIndirectDataContent ::= SEQUENCE {
data SpcAttributeTypeAndOptionalValue,
messageDigest DigestInfo
} --#public—
SpcAttributeTypeAndOptionalValue ::= SEQUENCE {
type ObjectID,
value [0] EXPLICIT ANY OPTIONAL
}
其中DigestInfo
包含使用从第 15 页开始详细说明的过程计算的文件规范散列的 AlgId 和摘要值。