1

我希望解析并显示从 Window PE 二进制文件的安全目录中提取的 Authenticode PKCS#7 签名的内容。

我可以使用 OpenSSL 在命令行中使用“ openssl pkcs7 -text -in extracted_signature.pks -inform DER -print_certs”来执行此操作,但是我需要通过 C/C++ 和 Windows API 来执行此操作。我不能使用 OpenSSL 库本身。

使用CryptDecodeObjectExAPI,我可以开始解码提取的签名:

CRYPT_CONTENT_INFO * content_info;
DWORD len;

CryptDecodeObjectEx(
    X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
    PKCS_CONTENT_INFO,
    pointer_to_extracted_signature,
    length_of_extracted_signature,
    CRYPT_DECODE_ALLOC_FLAG,
    NULL,
    &content_info,
    &len
);

上述调用成功完成,content_info->pszObjIdOID 为“1.2.840.113549.1.7.2”(szOID_RSA_signedData),但是我找不到继续解码所需的结构。此处列出了 CryptDecodeObjectEx 的可用 OID 。

有人可以建议如何通过 Windows API 解码 Authenticode PKCS#7 签名吗?

4

1 回答 1

2

我发现解码 Authenticode PKCS#7 签名的正确方法是CryptQueryObject与设置CERT_QUERY_OBJECT_BLOBCERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED标志一起使用。下面的代码片段供任何可能需要执行此操作的人使用。

CERT_BLOB cert_blob;
HCERTSTORE cert_store = NULL;
HCRYPTMSG cert_msg    = NULL;

cert_blob.pbData = pointer_to_extracted_signature;
cert_blob.cbData = length_of_extracted_signature;

CryptQueryObject(
    CERT_QUERY_OBJECT_BLOB,
    &cert_blob,
    CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED,
    CERT_QUERY_FORMAT_FLAG_BINARY,
    0,
    NULL,
    NULL,
    NULL,
    &cert_store,
    &cert_msg,
    NULL
);

PCCERT_CONTEXT next_cert = NULL;

while( (next_cert = CertEnumCertificatesInStore( cert_store, next_cert ) ) != NULL )
{
    // process next_cert...
}
于 2014-10-10T14:09:53.957 回答