有许多 API 和方法可用于获取和验证可执行文件的签名,以及如何获取所需的其他附加信息。问题是你选择哪个级别(高级别比如WinVerifyTrust)
可用于从 CAT 或 EXE 文件中获取加密上下文的最简单的第一个 API 是 CryptQueryObject 函数。 KB323809 中的代码示例可以让您了解如何解码您需要的信息。如果您使用 CAT 文件,主要区别在于您应该修改 CryptQueryObject 的一些参数。我建议您只使用 CERT_QUERY_CONTENT_FLAG_ALL 和 CERT_QUERY_FORMAT_FLAG_ALL 和 CryptQueryObject 将在内部完成您需要的所有操作:
BOOL bIsSuccess;
DWORD dwEncoding, dwContentType, dwFormatType;
HCERTSTORE hStore = NULL;
HCRYPTMSG hMsg = NULL;
PVOID pvContext = NULL;
// fill szFileName
...
// Get message handle and store handle from the signed file.
bIsSuccess = CryptQueryObject (CERT_QUERY_OBJECT_FILE,
szFileName,
CERT_QUERY_CONTENT_FLAG_ALL,
CERT_QUERY_FORMAT_FLAG_ALL,
0,
&dwEncoding,
&dwContentType,
&dwFormatType,
&hStore,
&hMsg,
&pvContext);
CryptQueryObject 设置的值dwContentType 将为您提供有关szFileName 文件类型的基本信息。在您需要的大多数情况下,pvContext 将是 PCCERT_CONTEXT,但如果您使用 .ctl 或 .crl 文件作为输入,它也可以是 PCCRL_CONTEXT 或 PCCTL_CONTEXT。您将收到hStore,其中包含来自文件szFileName 的所有证书。因此,对于pvContext 和hStore,您可以使用 CryptoAPI 检查包含的文件。如果你喜欢
您可以使用hMsg 的低级按摩API,在某些dwContentType 的情况下将额外设置(至少对于CERT_QUERY_CONTENT_PKCS7_SIGNED、CERT_QUERY_CONTENT_PKCS7_UNSIGNED、CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED)。
要验证文件的签名,我建议您使用 CertGetCertificateChain 和 CertVerifyCertificateChainPolicy 来验证证书不仅在一般情况下有效,而且它(或其所有父级)对于验证码(@ 987654352@)。 CertGetCertificateChain 可用于不同的撤销场景。您应该使用 CERT_CHAIN_POLICY_AUTHENTICODE 和 CERT_CHAIN_POLICY_AUTHENTICODE_TS 进行两次单独调用,以验证 Authenticode 链策略和 Authenticode 时间戳链策略是否有效。
已更新:我重读了您当前的问题(已更新部分)。您当前的问题是如何获取文件的签名者/发布者。所以我只回答这个问题。
如果您使用the code from sysinternal 进行签名验证,您只需搜索该行
if ( !CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0) )
该语句仍然设置InfoStruct 的字段,以防该文件是针对某些.cat 文件验证签名的系统windows 文件。 InfoStruct.wszCatalogFile 字段将为您提供 .cat 文件的名称。
例如,在我的 Windows 7 上,如果我尝试验证 C:\Windows\explorer.exe 文件的数字签名,可以找到其哈希值的 .cat 是 C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat。
如果您使用来自KB323809 的代码和CryptQueryObject 的上述参数,您将解码C:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat 的SPC_SP_OPUS_INFO_OBJID ("1.3.6.1.4.1.311.2.1.12") 属性(参见函数GetProgAndPublisherInfo) 你就知道了
pwszProgramName: "Windows Express Security Catalogs"
pPublisherInfo: NULL
pMoreInfo->dwLinkChoice: SPC_URL_LINK_CHOICE
pMoreInfo->pwszUrl "http://www.microsoft.com"
因此,该文件不包含任何特殊的发布者信息。如果您检查目录的签名者,您会发现:
The signer of the .cat file: "Microsoft Windows"
The signer signed it with the certificate:
Serial Number: 0x6115230F00000000000A
Issuer Name: Microsoft Windows Verification PCA
Full Issuer Name:
CN = Microsoft Windows Verification PCA
O = Microsoft Corporation
L = Redmond
S = Washington
C = US
Subject Name: Microsoft Windows
Full Subject Name:
CN = Microsoft Windows
OU = MOPR
O = Microsoft Corporation
L = Redmond
S = Washington
C = US
The Date of TimeStamp : 28.02.2011 21:16:36
TimeStamp Certificate:
Serial Number: 0x6103DCF600000000000C
Issuer Name: Microsoft Time-Stamp PCA
Subject Name: Microsoft Time-Stamp Service
所以你应该只使用 .cat 文件的签名者,因为explorer.exe 没有其他签名者。