कई एपीआई हैं और दृष्टिकोण करते हैं कि आप निष्पादन योग्य के हस्ताक्षर कैसे प्राप्त कर सकते हैं और सत्यापित कर सकते हैं और आपको अन्य अतिरिक्त जानकारी कैसे प्राप्त हो सकती है। समस्या यह है कि आप किस स्तर का चयन करते हैं (उच्च स्तर WinVerifyTrust
)
सीएटी या EXE फ़ाइल से क्रिप्टोग्राफी संदर्भ प्राप्त करने के लिए उपयोग किया जा सकता है सबसे आसान पहला एपीआई CryptQueryObject फ़ंक्शन है। KB323809 से कोड उदाहरण आपको मुख्य जानकारी प्राप्त कर सकता है कि आपको जो जानकारी चाहिए उसे डीकोड कैसे करें। यदि आप सीएटी फाइलों के साथ काम करते हैं तो मुख्य अंतर यह है कि आपको 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);
मूल्य dwContentType
CryptQueryObject
द्वारा निर्धारित आप फ़ाइल szFileName
के प्रकार के बारे आधार जानकारी मिल जाएगी। pvContext
आपको सबसे अधिक मामलों के लिए PCCERT_CONTEXT
होगा, लेकिन यह PCCRL_CONTEXT
या PCCTL_CONTEXT
भी हो सकता है यदि आप इनपुट के रूप में .ctl या .crl फ़ाइल का उपयोग करते हैं। आपको hStore
फ़ाइल szFileName
फ़ाइल से सभी प्रमाणपत्रों से भरा होगा। तो pvContext
और hStore
के संबंध में आप CryptoAPI के साथ फ़ाइल की जांच कर सकते हैं। यदि आप निम्न-स्तरीय मालिश API पसंद करते हैं तो आप hMsg
का उपयोग कर सकते हैं जो अतिरिक्त dwContentType
(कम से कम CERT_QUERY_CONTENT_PKCS7_SIGNED
, CERT_QUERY_CONTENT_PKCS7_UNSIGNED
, CERT_QUERY_CONTENT_PKCS7_SIGNED_EMBED
) के मामले में सेट किया जाएगा।
फ़ाइल के हस्ताक्षर मैं तुम्हें CertGetCertificateChain और CertVerifyCertificateChainPolicy न केवल कि प्रमाण पत्र सामान्य रूप में मान्य है सत्यापित करने के लिए उपयोग करने के लिए सिफारिश करेंगे सत्यापित करने के लिए, लेकिन यह (या इसके सभी माता पिता) Authenticode (szOID_PKIX_KP_CODE_SIGNING
) के लिए मान्य है। CertGetCertificateChain विभिन्न निरसन परिदृश्यों के लिए उपयोग किया जा सकता है।आपको CERT_CHAIN_POLICY_AUTHENTICODE
और CERT_CHAIN_POLICY_AUTHENTICODE_TS
के साथ दो अलग-अलग कॉल करना चाहिए ताकि यह सत्यापित किया जा सके कि प्रमाणीकरण श्रृंखला नीति और प्रमाणीकरण समय स्टाम्प श्रृंखला नीति दोनों मान्य हैं।
UPDATED: मैं अपने वर्तमान प्रश्न (अद्यतन भाग) को पुन: पढ़ने। आपकी वर्तमान समस्या फ़ाइल के हस्ताक्षरकर्ता/प्रकाशक को कैसे प्राप्त करें। तो मैं केवल सवाल पर जवाब देता हूं।
आप हस्ताक्षर सत्यापन के लिए the code from sysinternal का उपयोग करते हैं तो आप सिर्फ लाइन
if (!CryptCATCatalogInfoFromContext(CatalogContext, &InfoStruct, 0))
बयान चौखट मामले में InfoStruct
के क्षेत्र सेट है कि फाइल सिस्टम विंडोज़ फ़ाइल जो हस्ताक्षर सम्मान के साथ सत्यापित किया जाता है के लिए खोज करना चाहिए कुछ .cat फ़ाइल का। क्षेत्र InfoStruct.wszCatalogFile आपको .cat फ़ाइल का नाम प्राप्त करेगा।
उदाहरण के लिए मेरे विंडोज 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
है।
आप 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
तो आप बस .cat फ़ाइल का हस्ताक्षरकर्ता का उपयोग करना चाहिए, क्योंकि वहाँ explorer.exe
का कोई अन्य हस्ताक्षरकर्ता है।
आपको बहुत धन्यवाद और +1, मैं आपके समय की सराहना करता हूं। हालांकि मुझे अभी भी कुछ समस्याएं हैं, धन्यवाद, मुझे लगता है कि मैं पहले से लक्ष्य के करीब हूं :)। जब मैं CryptQueryObject (explorer.exe पर) कहता हूं, तो यह एक त्रुटि कोड 80092009 देता है जिसका अर्थ है "ऑब्जेक्ट को खोजने का प्रयास करते समय कोई मिलान नहीं।" मुझे लगता है कि यह explorer.exe (?) के लिए कैटलॉग नहीं मिला। आपके प्रयास के लिए बहुत बहुत धन्यवाद :) – 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 बताता है कि हस्ताक्षर मान्य है। क्या मुझे कुछ याद आ रहा है या पीई हस्ताक्षर और कैटलॉग फाइलों का अलग-अलग उद्देश्य है? इस बेवकूफ सवाल के लिए खेद है, मुझे वास्तव में यह काम करने की ज़रूरत है :(धन्यवाद फिर से – Davita