我希望解析并显示从Window PE二进制文件的安全目录中提取的Authenticode PKCS#7签名的内容。
我可以使用OpenSSL在命令行中使用“openssl pkcs7 -text -in extracted_signature.pks -inform DER -print_certs
”执行此操作,但我需要通过C / C ++和Windows API执行此操作。我不能自己使用OpenSSL库。
使用CryptDecodeObjectEx
API我可以开始解码提取的签名:
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->pszObjId
的OID为“1.2.840.113549.1.7.2”(szOID_RSA_signedData)但是我无法找到继续解码所需的结构。 CryptDecodeObjectEx的可用OID列于here。
有人可以建议如何通过Windows API解码Authenticode PKCS#7签名吗?
答案 0 :(得分:1)
我发现解码Authenticode PKCS#7签名的正确方法是使用设置了CryptQueryObject
和CERT_QUERY_OBJECT_BLOB
标记的CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED
。对于可能需要执行此操作的任何人,请在下面编写代码snippit。
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...
}