実行可能ファイルの署名を取得して確認する方法と、必要なその他の追加情報を取得する方法については、多くの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
でもかまいません。ファイルszFileName
からすべての証明書でいっぱいのhStore
が届きます。したがって、pvContext
とhStore
に関しては、CryptoAPIを含むファイルを調べることができます。 (少なくともCERT_QUERY_CONTENT_PKCS7_SIGNED
の場合、CERT_QUERY_CONTENT_PKCS7_UNSIGNED
,CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
)の場合には、の場合に追加設定されるhMsg
を使用して、 ローレベルマッサージAPIを使用することをお勧めします。
は、私はあなたが
CertGetCertificateChainと
CertVerifyCertificateChainPolicyは、証明書が一般的に有効であるだけでなく、ことを確認するために使用することをお勧めしますファイルの署名を検証するために、それ(またはそのすべての親が)のAuthenticode(
szOID_PKIX_KP_CODE_SIGNING
)に対して有効であること。
CertGetCertificateChainは、さまざまな失効シナリオで使用できます。
CERT_CHAIN_POLICY_AUTHENTICODE
と
CERT_CHAIN_POLICY_AUTHENTICODE_TS
という2つの別々のコールを実行して、AuthenticodeチェーンポリシーとAuthenticodeタイムスタンプチェーンポリシーの両方が有効であることを確認する必要があります。
更新済み:最新の質問(更新済み部分)を再読しました。あなたの現在の問題は、ファイルの署名者/発行者を取得する方法です。だから私はその質問だけに答えます。
あなたが署名検証のためのthe code from sysinternalを使用する場合は、あなただけのライン
if (!CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0))
のために、そのファイルが署名が関連して検証されるシステムのWindowsのファイルである場合にはInfoStruct
のフィールドを設定するステートメント敷居を検索します.catファイルの一部。フィールドInfoStruct.wszCatalogFileには、.catファイルの名前が表示されます。
C:\Windows\explorer.exe
ファイルのデジタル署名を検証しようとすると、私のWindows 7などで、そのハッシュが見つかった.catはC:\Windows\system32\CatRoot\{F750E6C3-38EE-11D1-85E5-00C04FC295EE}\Package_1_for_KB2515325~31bf3856ad364e35~amd64~~6.1.1.0.cat
です。
CryptQueryObject
のパラメータを、上述とあなたがKB323809からコードを使用する場合は、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
をexplorer.exe
の他の署名者が存在しないので、だから、の.catファイルのちょうど署名者を使用する必要があります。
ありがとうございます+1、私はあなたの時間をいただきありがとうございます。私はまだいくつかの問題を抱えていますが、あなたのおかげで、私は以前よりも目標に近いです感じ:)。 CryptQueryObjectをexplorer.exeに呼び出すと、「オブジェクトを検索しようとすると一致しません」というエラーコード80092009が返されます。 explorer.exe(?)のカタログが見つかりませんでした。 – Davita
@Davita:テキストファイルやエクスプローラのような署名されていない実行可能ファイルを調べようとするならば。exe)あなたは[CRYPT_E_NO_MATCH](http://msdn.microsoft.com/en-us/library/aa909166.aspx)エラーを受け取る 'CryptQueryObject'に関して、 explorer.exeのプロパティを調べると、「デジタル署名」タブが表示されないので、ファイルは署名されていません。実装に他の問題がある場合は、私に尋ねることができます。数年前、EXE、CATなどのコードで多くの時間を費やしました。だからおそらく私はすぐにあなたを助けることができるでしょう。 – Oleg
多くのありがとうオレグ、私は本当にあなたの努力に感謝します。まだ混乱があります。 http://forum.sysinternals.com/howto-verify-the-digital-signature-of-a-file_topic19247.html < - このコードでexplorer.exeをチェックすると、WinVerifyTrustは署名が有効であることを伝えます。私が何かを紛失していたり、PEの署名とカタログファイルが別の目的を持っていますか? (おかげで再び – Davita