在没有WinVerifyTrust的情况下检测数字签名

时间:2011-06-25 01:06:03

标签: php code-signing portable-executable authenticode winverifytrust

我有大量的EXE文件,需要弄清楚哪些文件有数字签名。有没有人知道是否有办法检查无法访问WinVerifyTrust(他们都在Unix服务器上)。

我似乎无法找到有关数字签名实际位于EXE内部的任何信息。如果我能找到它的位置,我可以打开文件,然后到某个位置进行测试。我不需要对证书进行“真正的”验证,我只想查看数字签名是否存在(或者更重要的是,不存在),而不必使用WinVerifyTrust。

3 个答案:

答案 0 :(得分:1)

如上所述,仅存在IMAGE_DIRECTORY_ENTRY_SECURITY目录是检测PE文件内是否存在签名的明确指标。如果您要测试大量文件并想要过滤这些文件,则只测试此标准目录的存在是否有效。您不需要库来执行此操作。

答案 1 :(得分:0)

您可以使用Mono.Security.dll AuthenticodeBase [1]

中的代码找到此信息

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

您的最佳提示(如果存在authenticode签名)是:

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

如果dirSecuritySize大于8,则会有一个签名条目(有效或无效)。

答案 2 :(得分:0)

我试图在相同情况下解决问题。 我建议使用osslsigncode。 这是带有openssl的Windows authenticode的实现。
https://github.com/develar/osslsigncode

下面是osslsigncode的代码块摘录。

siglen = GET_UINT32_LE(indata + peheader + 152 + pe32plus*16 + 4);

如果osslsigncode中siglen为0,则表明没有签名。

如果只想检查签名,则不需要库。
但是,请参见osslsigncode获取帮助。