web-dev-qa-db-ja.com

署名されたファイルのPEファイルハッシュを取得するにはどうすればよいですか?

デジタル署名付きのPEバイナリがあります。 (ファイル全体のハッシュではなく)元のPEハッシュを取得します。

ファイルから読み取る方法がわかりません。 Authenticode仕様では、PKCS#7署名ブロック(属性証明書テーブルなど)に、元のPEハッシュを含むContentInfoフィールドがあることを示唆しています。残念ながら、MicrosoftはContentInfo構造を定義していません。 PKCS#7仕様も同様です。

ファイルが改ざんされている場合、ハッシュの再計算は役に立ちません。

5
dockd

PKCS7(別名CMS)は確実にジェネリックContentInfoを定義します。 rfc2630セクション et succ、またはrfc2315セクション7(リンクするアンカーなし)を参照してください。

  ContentInfo ::= SEQUENCE {
        contentType ContentType,
        content [0] EXPLICIT ANY DEFINED BY contentType }

  ContentType ::= OBJECT IDENTIFIER

しかし、これは意図的に非常に柔軟であり、データの処理に役に立たないほどです。OIDがそのタイプのデータを識別するためにある限り、任意のタイプのデータを含めることができます。

ソースが明確ではありませんが、「Authenticode署名形式」の最初のGoogleヒットはダウンロードです。Microsoft.com/ download/9/c/5/9c5b2167-8017 .../Authenticode_PE.docxとは、 Authenticodeに使用されるcontentInfoSignedDataに関する7:

•contentTypeはSPC_INDIRECT_DATA_OBJID(1.3.6.1.4.1.311.2.1.4)に設定する必要があります。
•コンテンツは、後で説明するSpcIndirectDataContent構造体に設定する必要があります。

そして、9ページから11ページ(実際には後で)には、で始まる詳細な定義が含まれています

SpcIndirectDataContent ::= SEQUENCE {
    data                    SpcAttributeTypeAndOptionalValue,
    messageDigest           DigestInfo
} --#public—

SpcAttributeTypeAndOptionalValue ::= SEQUENCE {
    type                    ObjectID,
    value                   [0] EXPLICIT ANY OPTIONAL
}

ここで、DigestInfoには、15ページから始まる詳細なプロセスを使用して計算されたファイルの正規ハッシュのAlgIdとダイジェスト値が含まれています。

1