Мне было поручено определить, была ли подделана конкретная 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, ошибки поступают от предоставленного поставщика доверия. Я действительно не знаю, что такое поставщик доверия или какие сообщения об ошибках он может вернуть.
Заранее спасибо.
РЕДАКТИРОВАТЬ: я с тех пор выяснил, что эта библиотека использует коды ошибок, предоставленные 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
Похоже, мне нужно сменить поставщика доверия, которым я пользуюсь. После обсуждения с производителем программного обеспечения задача отбрасывается в пользу другого подхода.
В соответствии с MSDN кажется, что вы должны установить
dwStateAction = WTD_STATEACTION_VERIFY;
Также я бы попробовал установку
wtfi.hFile = NULL;
или при указании настройки дескриптора файла
wtfi.pcwszFilePath = NULL;
(Мне не совсем понятно, предоставляете ли вы hFile или нет. И я бы не стал устанавливать для hFile и pcwszFilePath допустимые значения.)
Еще один момент, который нужно проверить: если вы компилируете для Windows 8 или Windows Server 2012, у вас будет элемент struct pSignatureSettings
и нужно будет его инициализировать. Позаботьтесь, чтобы установить cbStruct
чтобы pSignatureSettings
не входит или правильно инициализировать pSignatureSettings
,