Обнаружение цифровой подписи без WinVerifyTrust

У меня есть большое количество EXE-файлов, и мне нужно выяснить, какие из них имеют цифровые подписи. Кто-нибудь знает, есть ли способ проверить без доступа к WinVerifyTrust (они все на сервере Unix).

Кажется, я не могу найти никакой информации о том, где на самом деле находится цифровая подпись внутри EXE. Если бы я мог узнать, где он находится, я мог бы открыть файл и найти место для проверки. Мне не нужно делать «настоящую» проверку сертификата, я просто хочу увидеть, присутствует ли цифровая подпись (или, что более важно, НЕ присутствует) без использования WinVerifyTrust.


person Mitchell V    schedule 25.06.2011    source источник
comment
Я не проверял это, но вы можете сделать это с помощью моно и утилиты chktrust.   -  person datasage    schedule 25.06.2011
comment
Спасибо, я думал об этом, но я предпочел бы какой-то способ посмотреть файл напрямую, а не полностью проверять сертификат. Это то, что нужно будет запускать по расписанию для тысяч файлов одновременно, и я боюсь, что chktrust (или даже использование WinVerifyTrust) будет слишком медленным. Если бы я мог понять, где должна быть цифровая подпись внутри EXE, мне кажется, это было бы быстрее всего. Спасибо!   -  person Mitchell V    schedule 25.06.2011


Ответы (3)


Как упоминалось выше, само наличие каталога IMAGE_DIRECTORY_ENTRY_SECURITY является четким индикатором наличия подписи внутри PE-файла. Если у вас есть большое количество файлов для тестирования и вы хотите их отфильтровать, достаточно просто проверить наличие этого стандартного каталога. Для этого вам не нужна библиотека.

person mox    schedule 19.12.2012
comment
именно так PeStudio (winitor.com) определяет этот индикатор при обработке PE-образа. - person mox; 31.12.2012


Вы можете найти эту информацию, используя код из 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, то есть запись подписи (действительная или нет).

person poupou    schedule 07.08.2011