2012-08-09 114 views
0

我用我的數字簽名簽名文件,我如何從這個文件讀取這個簽名?如何讀取C++中的嵌入式代碼簽名簽名?

簽名受信任(Globalsign)。加密RSA/SHA1。簽名文件爲.exe

+0

什麼樣的數字簽名?什麼類型的文件? – 2012-08-09 17:01:33

+0

@MatteoItalia謝謝你的回答!我修復了我的主要帖子。 – RomanKarpuk 2012-08-09 17:07:50

回答

0

首先,您需要指定您正在處理的證書類型。如果您正在討論CLI程序集,那麼您可能正在處理StrongName簽名,這是完全不同的野獸,旨在防止CLR全局程序集緩存中的名稱衝突。

聽起來更像是您想要讀取用於本機和CLI應用程序的Authenticode簽名。如果你想讀取證書本身,那麼你需要掌握PE/COFF規範,併爲PE(可執行文件)文件格式實現一個解析器,這是Windows NT及其衍生產品使用的格式。如果您希望能夠實際驗證驗證該證書,則需要調用WinVerifyTrust function,它將爲您執行Authenticode驗證。

當然,如果你只是想檢查您的證書驗證無需處理編寫自己的應用程序來做到這一點,你可以用鼠標右鍵單擊該文件,並選擇屬性...在Windows資源管理器,它應該告訴你該文件的簽名狀態。否則,您可以使用命令行實用程序SigCheck

1

下面的代碼應該做你想做的。它來自安裝程序應用程序以提取自己的證書並將其安裝到本地認證存儲中。

bool driver_setup::install_embeded_cert_to_lm(const std::wstring& filepath) 
{ 

    bool rval = false; 

    DWORD dwEncoding = 0; 
    DWORD dwContentType = 0; 
    DWORD dwFormatType = 0; 
    HCERTSTORE hStore = NULL; 
    HCRYPTMSG hMsg = NULL; 

    // Get message handle and store handle from the signed file. 
    BOOL fResult = CryptQueryObject(CERT_QUERY_OBJECT_FILE, 
     filepath.c_str(), 
     CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, 
     CERT_QUERY_FORMAT_FLAG_BINARY, 
     0, 
     &dwEncoding, 
     &dwContentType, 
     &dwFormatType, 
     &hStore, 
     &hMsg, 
     NULL); 
    if (!fResult) 
    { 
     return false; 
    } 

    DWORD singer_info_size = 0; 
    // Get signer information size. 
    fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, NULL, &singer_info_size); 
    if (!fResult) 
    { 
     CryptMsgClose(hMsg); 
     CertCloseStore(hStore, 0); 
     return false; 
    } 

    // Allocate memory for signer information. 
    std::vector<byte> signer_info_data(singer_info_size); 
    PCMSG_SIGNER_INFO pSignerInfo = reinterpret_cast<PCMSG_SIGNER_INFO>(signer_info_data.data()); 

    // Get Signer Information. 
    fResult = CryptMsgGetParam(hMsg, CMSG_SIGNER_INFO_PARAM, 0, (PVOID)pSignerInfo, &singer_info_size); 
    if(fResult) 
    { 
     CERT_INFO CertInfo = {}; 
     CertInfo.Issuer = pSignerInfo->Issuer; 
     CertInfo.SerialNumber = pSignerInfo->SerialNumber; 

     PCCERT_CONTEXT pCertContext = CertFindCertificateInStore(hStore,dwEncoding,0,CERT_FIND_SUBJECT_CERT,(PVOID)&CertInfo,NULL); 
     if(pCertContext != 0) 
     { 
      // rval = add_cert_to_lm_trustedpublishers(pCertContext); 

      CertFreeCertificateContext(pCertContext); 
     } 
    } 

    CryptMsgClose(hMsg); 
    CertCloseStore(hStore, 0); 
    return rval; 
}