2017-09-04 6 views
2

J'utilise Windows WinVerifyTrust fonctionne sur Windows 10 pro, pour vérifier les signatures dll. lorsque j'active cette fonction pour la première fois, il faut 4 secondes pour que la fonction s'exécute et renvoie l'état de vérification pour la première DLL. pour les autres dll en cours, la fonction revient à vitesse rapide. Quelqu'un peut-il m'aider à comprendre la raison possible de ce temps de latence?Fonction WinVerifyTrust prend beaucoup de temps à s'exécuter

l'appel qui prend 4 secondes est cet appel:

lStatus = WinVerifyTrust(
     NULL, 
     &WVTPolicyGUID, 
     &WinTrustData); 

La fonction wraper que je utilise ressemble à ceci:

#define _UNICODE 1 
#define UNICODE 1 

#include <tchar.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <windows.h> 
#include <Softpub.h> 
#include <wincrypt.h> 
#include <wintrust.h> 

// Link with the Wintrust.lib file. 
#pragma comment (lib, "wintrust") 

BOOL VerifyEmbeddedSignature(LPCWSTR pwszSourceFile) 
{ 
    LONG lStatus; 
    DWORD dwLastError; 

    // Initialize the WINTRUST_FILE_INFO structure. 

    WINTRUST_FILE_INFO FileData; 
    memset(&FileData, 0, sizeof(FileData)); 
    FileData.cbStruct = sizeof(WINTRUST_FILE_INFO); 
    FileData.pcwszFilePath = pwszSourceFile; 
    FileData.hFile = NULL; 
    FileData.pgKnownSubject = NULL; 


    GUID WVTPolicyGUID = WINTRUST_ACTION_GENERIC_VERIFY_V2; 
    WINTRUST_DATA WinTrustData; 

    // Initialize the WinVerifyTrust input data structure. 

    // Default all fields to 0. 
    memset(&WinTrustData, 0, sizeof(WinTrustData)); 

    WinTrustData.cbStruct = sizeof(WinTrustData); 

    // Use default code signing EKU. 
    WinTrustData.pPolicyCallbackData = NULL; 

    // No data to pass to SIP. 
    WinTrustData.pSIPClientData = NULL; 

    // Disable WVT UI. 
    WinTrustData.dwUIChoice = WTD_UI_NONE; 

    // No revocation checking. 
    WinTrustData.fdwRevocationChecks = WTD_REVOKE_NONE; 

    // Verify an embedded signature on a file. 
    WinTrustData.dwUnionChoice = WTD_CHOICE_FILE; 

    // Verify action. 
    WinTrustData.dwStateAction = WTD_STATEACTION_VERIFY; 

    // Verification sets this value. 
    WinTrustData.hWVTStateData = NULL; 

    // Not used. 
    WinTrustData.pwszURLReference = NULL; 

    // This is not applicable if there is no UI because it changes 
    // the UI to accommodate running applications instead of 
    // installing applications. 
    WinTrustData.dwUIContext = 0; 

    // Set pFile. 
    WinTrustData.pFile = &FileData; 

    // WinVerifyTrust verifies signatures as specified by the GUID 
    // and Wintrust_Data. 
    lStatus = WinVerifyTrust(
     NULL, 
     &WVTPolicyGUID, 
     &WinTrustData); 

    switch (lStatus) 
    { 
     case ERROR_SUCCESS: 
      /* 
      Signed file: 
       - Hash that represents the subject is trusted. 

       - Trusted publisher without any verification errors. 

       - UI was disabled in dwUIChoice. No publisher or 
        time stamp chain errors. 

       - UI was enabled in dwUIChoice and the user clicked 
        "Yes" when asked to install and run the signed 
        subject. 
      */ 
      wprintf_s(L"The file \"%s\" is signed and the signature " 
       L"was verified.\n", 
       pwszSourceFile); 
      break; 

     case TRUST_E_NOSIGNATURE: 
      // The file was not signed or had a signature 
      // that was not valid. 

      // Get the reason for no signature. 
      dwLastError = GetLastError(); 
      if (TRUST_E_NOSIGNATURE == dwLastError || 
        TRUST_E_SUBJECT_FORM_UNKNOWN == dwLastError || 
        TRUST_E_PROVIDER_UNKNOWN == dwLastError) 
      { 
       // The file was not signed. 
       wprintf_s(L"The file \"%s\" is not signed.\n", 
        pwszSourceFile); 
      } 
      else 
      { 
       // The signature was not valid or there was an error 
       // opening the file. 
       wprintf_s(L"An unknown error occurred trying to " 
        L"verify the signature of the \"%s\" file.\n", 
        pwszSourceFile); 
      } 

      break; 

     case TRUST_E_EXPLICIT_DISTRUST: 
      // The hash that represents the subject or the publisher 
      // is not allowed by the admin or user. 
      wprintf_s(L"The signature is present, but specifically " 
       L"disallowed.\n"); 
      break; 

     case TRUST_E_SUBJECT_NOT_TRUSTED: 
      // The user clicked "No" when asked to install and run. 
      wprintf_s(L"The signature is present, but not " 
       L"trusted.\n"); 
      break; 

     case CRYPT_E_SECURITY_SETTINGS: 

      wprintf_s(L"CRYPT_E_SECURITY_SETTINGS - The hash " 
       L"representing the subject or the publisher wasn't " 
       L"explicitly trusted by the admin and admin policy " 
       L"has disabled user trust. No signature, publisher " 
       L"or timestamp errors.\n"); 
      break; 

     default: 

      wprintf_s(L"Error is: 0x%x.\n", 
       lStatus); 
      break; 
    } 

    // Any hWVTStateData must be released by a call with close. 
    WinTrustData.dwStateAction = WTD_STATEACTION_CLOSE; 

    lStatus = WinVerifyTrust(
     NULL, 
     &WVTPolicyGUID, 
     &WinTrustData); 

    return true; 
} 

Répondre

0

S'il vous plaît voir MSDN documentation on WinVerifyTrust, il semble que vous devrez éviter récupération des listes de révocation également:

// Use only the local cache for revocation checks. Prevents revocation checks over the network. 
WinTrustData.dwProvFlags = WTD_CACHE_ONLY_URL_RETRIEVAL;