有很多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
類型的基本信息。如果您使用.ctl或.crl文件作爲輸入,則pvContext
對於您需要的大多數情況將爲PCCERT_CONTEXT
,但它也可以是PCCRL_CONTEXT
或PCCTL_CONTEXT
。您將收到文件szFileName
中填寫的所有證書的hStore
。因此,就pvContext
和hStore
而言,您可以使用CryptoAPI檢查包含的文件。如果您更喜歡 低級別按摩API,則可以使用hMsg
,在dwContentType
(至少對於CERT_QUERY_CONTENT_PKCS7_SIGNED
,CERT_QUERY_CONTENT_PKCS7_UNSIGNED
,,CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
)的情況下將另外設置該值。
來驗證文件的,我會建議你使用CertGetCertificateChain和CertVerifyCertificateChainPolicy驗證不僅證書一般有效簽名,但它(或者其所有的父母)是有效的驗證碼(szOID_PKIX_KP_CODE_SIGNING
)。 CertGetCertificateChain可用於不同的撤銷方案。您應該分別撥打CERT_CHAIN_POLICY_AUTHENTICODE
和CERT_CHAIN_POLICY_AUTHENTICODE_TS
兩次,以驗證Authenticode鏈策略和Authenticode時間戳鏈策略是否有效。
已更新:我重讀了您當前的問題(更新的部分)。您當前的問題是如何獲取文件的簽署者/發佈者。所以我只回答這個問題。
如果你的簽名驗證使用the code from sysinternal你應該只是搜索線
if (!CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0))
聲明門檻設置InfoStruct
領域的情況下該文件是簽名相對於驗證系統windows文件一些.cat文件。字段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
沒有其他簽名者。
非常感謝你和+1,我感謝你的時間。雖然我仍然有一些問題,感謝你,我覺得我比以前更接近目標:)。當我調用CryptQueryObject(對explorer.exe)時,它返回錯誤代碼80092009,這意味着「嘗試查找對象時不匹配」。我想它沒有找到explorer.exe(?)的目錄。非常感謝你的努力:) – Davita
@Davita:如果你想嘗試檢查任何文本文件或任何未簽名的可執行文件(如資源管理器。exe)相對於'CryptQueryObject'你會收到[CRYPT_E_NO_MATCH](http://msdn.microsoft.com/en-us/library/aa909166.aspx)錯誤。如果您檢查explorer.exe的屬性,您將不會看到「數字簽名」選項卡,因此該文件未被簽名。如果你在執行中會遇到其他問題,你可以問我。幾年前我花了很多時間在代碼簽名EXE,CAT等等。所以我可能會很快幫到你。 – Oleg
非常感謝奧列格,我非常感謝你的努力。還是有些混亂。 http://forum.sysinternals.com/howto-verify-the-digital-signature-of-a-file_topic19247.html < - 當我用這段代碼檢查explorer.exe時,WinVerifyTrust告訴簽名是有效的。我是否缺少某些東西或PE簽名和目錄文件有不同的用途?對不起,這個愚蠢的問題,我真的需要得到這個工作:(再次感謝 – Davita