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