WinVerifyTrust обработка кода ошибки

Мне было поручено определить, была ли подделана конкретная DLL сторонней компании после установки в системе пользователя. Я никогда не делал ничего, связанного с цифровой подписью. Я пытаюсь настроить тест на моей собственной системе, используя WinVerifyTrust.

{
    WINTRUST_FILE_INFO wtfi;
    wtfi.cbStruct = sizeof(WINTRUST_FILE_INFO);
    wtfi.pcwszFilePath = TEXT("*****.dll");
    //wtfi.hFile = DllHandle;
    wtfi.pgKnownSubject = NULL;

    GUID wtvPolicyGUID = DRIVER_ACTION_VERIFY;

    WINTRUST_DATA wtd;
    wtd.cbStruct = sizeof(WINTRUST_DATA);
    wtd.pPolicyCallbackData = NULL;
    wtd.pSIPClientData = NULL;
    wtd.dwUIChoice = WTD_UI_NONE;
    wtd.fdwRevocationChecks = WTD_REVOKE_NONE;
    wtd.dwUnionChoice = WTD_CHOICE_FILE;
    wtd.pFile = &wtfi;
    wtd.dwStateAction = WTD_STATEACTION_IGNORE;
    wtd.pwszURLReference = NULL;
    wtd.dwProvFlags = WTD_REVOCATION_CHECK_NONE;
    //wtd.pSignatureSettings = NULL;            // Win8 and Server2012 only?

    LONG result = WinVerifyTrust( NULL, &wtvPolicyGUID, &wtd);
    debugf(TEXT("Validation result: 0x%08x"), result);
}

Это возвращает 0x57. Исходя из того, что я получил из MSDN, ошибки поступают от поставляемого поставщика доверия. Я действительно не знаю, что такое поставщик доверия или какие сообщения об ошибках он может вернуть.

  1. Я связал в WinTrust.dll и WinTrust.lib, поэтому я предполагаю, что это означает, что я использую Microsoft "Software Publisher Trust Provider". Это рекомендуется, или есть лучшие? Должны ли вы использовать один конкретный / предоставленный издателем программного обеспечения, чей продукт вы анализируете?
  2. SoftPub.h содержит входное значение GUID, но, похоже, не предоставляет выходные коды ошибок. Любая помощь в отслеживании их списка кодов ответа приветствуется.

Заранее спасибо.

РЕДАКТИРОВАТЬ: С тех пор я выяснил, что эта библиотека использует коды ошибок, предоставленные winerror.h. 0x57 - это "ERROR_INVALID_PARAMETER", поэтому я проверяю, на что он может жаловаться. Я также попытался переключить GUID политики на WINTRUST_ACTION_GENERIC_VERIFY_V2, что привело к ошибке TRUST_E_SUBJECT_FORM_UNKNOWN. Ни один из кодов ошибок не особенно освещает, в чем заключается основная проблема.

РЕДАКТИРОВАТЬ 2: Я также запустил Microsoft SignTool.exe на DLL, о которой идет речь, и получил следующий вывод:

SignTool Error: A certificate chain processed, but terminated in a root
        certificate which is not trusted by the trust provider.

Number of errors: 1

Похоже, мне нужно сменить поставщика доверия, которым я пользуюсь. После обсуждения с производителем программного обеспечения задача отбрасывается в пользу другого подхода.

1 ответ

В соответствии с MSDN кажется, что вы должны установить

dwStateAction = WTD_STATEACTION_VERIFY;

Также я бы попробовал установку

wtfi.hFile = NULL;

или при указании настройки дескриптора файла

wtfi.pcwszFilePath = NULL;

(Мне не совсем понятно, предоставляете ли вы hFile или нет. И я бы не стал устанавливать для hFile и pcwszFilePath допустимые значения.)

Еще один момент, который нужно проверить: если вы компилируете для Windows 8 или Windows Server 2012, у вас будет элемент struct pSignatureSettings и нужно будет его инициализировать. Позаботьтесь, чтобы установить cbStruct чтобы pSignatureSettings не входит или правильно инициализировать pSignatureSettings,

Другие вопросы по тегам