Возникла задача проверки подписи драйверов в Windows XP.
Конкретно меня интересуют haspnt.sys, hardlock.sys — это драйверы аппаратного ключа защиты от копирования HASP (эмуляторы ключа заменяют эти файлы неподписанными версиями, таким образом, их можно проверить).
Неожиданно столкнулся с трудностями при решении этой задачи.
В Windows 7 драйвера имеют электронную подпись. Это можно проверить, щёлкнув правой кнопкой мыши на системном файле EXE, DLL или SYS и выбрав в выпавшем меню "Свойства" — появится окно свойств с вкладкой "Цифровые подписи". Я научился проверять такие файлы с помощью функции WinVerifyTrust из wintrust.dll, она прекрасно работает (ActionID = WINTRUST_ACTION_GENERIC_VERIFY_V2).
Однако в Windows XP такой вкладки у файлов драйверов, как правило, нет, соответственно, WinVerifyTrust возвращает ошибку проверки на любом таком файле. Несмотря на это, стандартные средства Windows (например, Verifier.exe, Process Explorer Марка Руссиновича) каким-то образом видят, подписан файл или нет. Какими средствами они для этого пользуются, никак не могу понять!
Анализ Verifier.exe показывает, что он импортирует из wintrust.dll вышеупомянутую функцию WinVerifyTrust, а также функции CryptCATAdminAcquireContext, CryptCATAdminCalcHashFromFileHandle, CryptCATAdminEnumCatalogFromHash, CryptCATCatalogInfoFromContext. Я нашёл пример использования последних четырёх функций:
https://rsdn.ru/forum/winapi/3143959.all, однако у меня на любом файле функция CryptCATAdminEnumCatalogFromHash возвращает false (остальные функции из примера, которые до неё вызываются, срабатывают нормально).
Функцию WinVerifyTrust тоже пробовал с различными ActionID, которые смог нарыть на просторах интернета: WINTRUST_ACTION_GENERIC_CERT_VERIFY, WINTRUST_ACTION_GENERIC_VERIFY_V2, WIN_TRUST_SUBJTYPE_RAW_FILE, WIN_TRUST_SUBJTYPE_PE_IMAGE, WINTRUST_ACTION_GENERIC_CHAIN_VERIFY и даже WIN_TRUST_SUBJTYPE_JAVA_CLASS, WIN_TRUST_SUBJTYPE_CABINET — всё без толку, работает только с файлами, подписанными "по-взрослому", на остальных возвращает TRUST_E_NOSIGNATURE.
Может, у кого-нибудь есть опыт работы в этой области? Интересует Windows XP, но было бы интересно проверять аутентичность дрейверов и в более ранних версиях, вплоть до Windows 98.