我正尝试以编程方式验证this question from 2014中所述的代码签名证书。在遵循这些建议后,我仍然无法找到一致的工作解决方案来确定我的.exe何时被篡改(即哈希不再匹配)wintrust.dll
中的WinVerifyTrust
方法是最准确的,但是在我的可执行文件被混淆/虚拟化后,我似乎得到了一个误报。在这种情况下,我得到的结果是(int)2148204800,即使.exe经过有效签名且未被篡改。我也反对使用Windows API调用,因为我希望代码尽可能具有可移植性。
当然,其他方法(如X509Certificate.CreateFromSignedFile().Verify()
和Powershell方法)不会验证exe的散列,因此返回true。
在过去的4年里,有没有新的方法来验证.exe的哈希值,最好是在纯.NET中?我很高兴有一个解决方案,它只验证哈希值,而不是整个证书(如果可能的话)。
2条答案
按热度按时间vwoqyblh1#
如果你从Mono.Security中提取一个Nuget包,那么它有一个很好的
AuthenticodeDeformatter
类,可以验证代码签名证书:xqkwcwgp2#
您可以使用WinVerifyTrust API。
PInvoke.net: WinVerifyTrust提供了一个较大的工作类,其中的PInvoke调用太长,无法在此发布。您可以逐字复制该代码,然后调用
WinTrust.VerifyEmbeddedSignature()
来验证签名和文件哈希。此外,检查证书(首先)以确保它是正确的证书也是一个好主意。有人可能会更改文件,然后使用新证书签名。
把它放在一起: