Обнаружение цифровой подписи без WinVerifyTrust
У меня большое количество EXE-файлов, и мне нужно выяснить, какие из них имеют цифровую подпись. Кто-нибудь знает, есть ли способ проверить без доступа к WinVerifyTrust (все они на сервере Unix).
Я не могу найти информацию о том, где цифровая подпись на самом деле находится внутри EXE. Если бы я мог узнать, где это, я мог бы открыть файл и найти место для тестирования. Мне не нужно делать "настоящую" проверку сертификата, я просто хочу увидеть, присутствует ли цифровая подпись (или, что более важно, НЕ присутствует) без необходимости использовать WinVerifyTrust.
2 ответа
Пробовал решить проблему в такой же ситуации. Я рекомендую osslsigncode. Это реализация Windows Authenticode с openssl.
https://github.com/develar/osslsigncode
Ниже приведен отрывок блока кода из osslsigncode.
siglen = GET_UINT32_LE(indata + peheader + 152 + pe32plus*16 + 4);
Если siglen равен 0 в osslsigncode, он определяет отсутствие подписи.
Если вы хотите просто проверить подпись, вам не нужна библиотека.
Однако за помощью обратитесь к osslsigncode.
Как упоминалось выше, единственное присутствие каталога IMAGE_DIRECTORY_ENTRY_SECURITY является четким индикатором для обнаружения наличия подписи внутри PE-файла. Если у вас есть большое количество файлов для тестирования и вы хотите отфильтровать их, достаточно проверить наличие этого стандартного каталога. Вам не нужна библиотека, чтобы сделать это.
Вы можете найти эту информацию, используя код из Mono.Security.dll AuthenticodeBase [1]
Ваш лучший совет (если присутствует подпись аутентичного кода):
// 2.2. Locate IMAGE_DIRECTORY_ENTRY_SECURITY (offset and size)
dirSecurityOffset = BitConverterLE.ToInt32 (fileblock, peOffset + 152);
dirSecuritySize = BitConverterLE.ToInt32 (fileblock, peOffset + 156);
если dirSecuritySize больше 8, тогда есть запись подписи (действительная или нет).