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

| 我有大量的EXE文件,需要弄清楚哪些文件具有数字签名。有谁知道是否有一种方法可以检查而不访问WinVerifyTrust(它们都在Unix服务器上)。 我似乎找不到有关EXE内数字签名实际位置的任何信息。如果我可以找到它在哪里,则可以打开该文件并查找要测试的位置。我不需要对证书进行“真实”验证,我只想查看是否存在数字签名(或更重要的是,不存在)而不必使用WinVerifyTrust。     
已邀请:
        如上所述,IMAGE_DIRECTORY_ENTRY_SECURITY目录的唯一存在是明确的指示符,用于检测PE文件中签名的存在。如果您有大量文件要测试并且想要过滤它们,则仅测试此标准目录的存在是有效的。您不需要库即可执行此操作。     
        您可以使用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,则存在一个签名项(有效或无效)。     
        我试图在相同情况下解决问题。 我建议使用osslsigncode。 这是带有openssl的Windows authenticode的实现。 https://github.com/develar/osslsigncode 以下是osslsigncode的代码块摘录。
siglen = GET_UINT32_LE(indata + peheader + 152 + pe32plus*16 + 4);
如果osslsigncode中的siglen为0,则确定没有签名。 如果您只想检查签名,则不需要库。 但是,请参见osslsigncode以获得帮助。     

要回复问题请先登录注册