我有大量的 EXE 文件,需要找出哪些有数字签名。有谁知道是否有一种方法可以在不访问 WinVerifyTrust 的情况下进行检查(它们都在 Unix 服务器上)。
我似乎找不到任何有关数字签名在 EXE 中实际位置的信息。如果我能找到它在哪里,我可能能够打开文件并 fseek 到一个位置进行测试。我不需要对证书进行“真实”验证,我只想查看是否存在数字签名(或者更重要的是,不存在)而无需使用 WinVerifyTrust。
我有大量的 EXE 文件,需要找出哪些有数字签名。有谁知道是否有一种方法可以在不访问 WinVerifyTrust 的情况下进行检查(它们都在 Unix 服务器上)。
我似乎找不到任何有关数字签名在 EXE 中实际位置的信息。如果我能找到它在哪里,我可能能够打开文件并 fseek 到一个位置进行测试。我不需要对证书进行“真实”验证,我只想查看是否存在数字签名(或者更重要的是,不存在)而无需使用 WinVerifyTrust。
如上所述,仅存在 IMAGE_DIRECTORY_ENTRY_SECURITY 目录是检测 PE 文件中是否存在签名的明确指标。如果您有大量文件要测试并想要过滤这些文件,则只需测试此标准目录的存在即可。你不需要图书馆来做到这一点。
我试图在同样的情况下解决这个问题。我推荐 osslsigncode。这是一个带有 openssl 的 windows 验证码的实现。
https://github.com/develar/osslsigncode
下面是 osslsigncode 的代码块摘录。
siglen = GET_UINT32_LE(indata + peheader + 152 + pe32plus*16 + 4);
如果osslsigncode中siglen为0,则判断没有签名。
如果您只想检查签名,则不需要库。
但是,请参阅 osslsigncode 以获得帮助。
您可以使用 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 则存在签名条目(有效与否)。