如何获取签名文件的 PE 文件哈希?

信息安全 电子签名 pkcs7
2021-09-02 05:43:13

我有一个带有数字签名的 PE 二进制文件。我想得到原始的 PE 散列(不是整个文件的散列)。

我不知道如何从文件中读取它。Authenticode 规范建议 PKCS#7 签名块(例如属性证书表)具有包含原始 PE 哈希的 ContentInfo 字段。不幸的是,微软没有定义 ContentInfo 结构。PKCS#7 规范也没有。

如果文件被篡改,重新计算哈希将无济于事。

1个回答

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用于SignedDataAuthenticode 的:

• 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 和摘要值。