Обнаружение цифровой подписи без 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]

[1] https://github.com/mono/mono/blob/master/mcs/class/Mono.Security/Mono.Security.Authenticode/AuthenticodeBase.cs

Ваш лучший совет (если присутствует подпись аутентичного кода):

 // 2.2. Locate IMAGE_DIRECTORY_ENTRY_SECURITY (offset and size)
 dirSecurityOffset = BitConverterLE.ToInt32 (fileblock, peOffset + 152);
 dirSecuritySize = BitConverterLE.ToInt32 (fileblock, peOffset + 156);

если dirSecuritySize больше 8, тогда есть запись подписи (действительная или нет).

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