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


Detect a digital signature without WinVerifyTrust

我有大量的EXE文件,需要弄清楚哪些文件有数字签名。有人知道是否有一种方法可以在不访问WinVerifyTrust的情况下进行检查吗(他们都在Unix服务器上)。

我似乎找不到任何关于数字签名在EXE中实际位置的信息。如果我能找到它在哪里,我可能能够打开文件并fseek到一个位置进行测试。我不需要对证书进行"真实"验证,我只想看看数字签名是否存在(或者更重要的是,不存在),而无需使用WinVerifyTrust。

如上所述,IMAGE_DIRECTORY_ENTRY_SECURITY目录的唯一存在是检测PE文件内签名存在的明确指标。如果您有大量的文件要测试,并且想要过滤这些文件,那么只测试这个标准目录的存在性是有效的。你不需要图书馆来做这件事。

我试图在同样的情况下解决这个问题。我推荐osslsigncode。这是使用openssl实现windows authenticode
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]

[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,则存在签名条目(有效与否)。