【问题标题】:Detect a digital signature without WinVerifyTrust检测没有 WinVerifyTrust 的数字签名
【发布时间】:2011-06-25 01:06:03
【问题描述】:

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

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

【问题讨论】:

  • 我还没有测试过这个,但你可以用单声道和chktrust 实用程序来测试。
  • 谢谢,我想过这一点,但我宁愿通过某种方式直接查看文件,而不是完全验证证书。它必须按计划一次运行数千个文件,我担心 chktrust(甚至使用 WinVerifyTrust)会太慢。如果我能弄清楚数字签名应该在 EXE 中的哪个位置,那似乎是最快的。谢谢!

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


【解决方案1】:

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

【讨论】:

  • 这是 PeStudio (winitor.com) 在处理 PE 图像时检测此指示器的方式。
【解决方案2】:

我试图在同样的情况下解决问题。 我推荐 osslsigncode。 这是一个用 openssl 实现的 windows 验证码。
https://github.com/develar/osslsigncode

以下是 osslsigncode 的代码块摘录。

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

如果osslsigncode中siglen为0,则判断没有签名。

如果您只想检查签名,则不需要库。
但是,请参阅 osslsigncode 以获得帮助。

【讨论】:

【解决方案3】:

您可以使用 Mono.Security.dll AuthenticodeBase [1] 中的代码找到此信息

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

您最好的提示(如果存在验证码签名)是:

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

如果 dirSecuritySize 大于 8,则存在签名条目(有效或无效)。

【讨论】:

    猜你喜欢
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    相关资源
    最近更新 更多