Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 验证Windows应用程序上的代码签名证书_C#_.net - Fatal编程技术网

C# 验证Windows应用程序上的代码签名证书

C# 验证Windows应用程序上的代码签名证书,c#,.net,C#,.net,我正在尝试以编程方式验证代码签名证书,如中所述。在遵循这些建议之后,我仍然无法找到一致的工作解决方案来确定我的.exe何时被篡改(即哈希不再匹配) 来自wintrust.dll的WinVerifyTrust方法是最准确的,但是在我的可执行文件被混淆/VM'd之后,我似乎得到了一个假阳性。在这个场景中,我得到的结果是(int)2148204800,即使.exe已有效签名且未被篡改。我也反对使用Windows API调用,因为我希望代码尽可能可移植 其他方法,例如X509Certificate.Cr

我正在尝试以编程方式验证代码签名证书,如中所述。在遵循这些建议之后,我仍然无法找到一致的工作解决方案来确定我的.exe何时被篡改(即哈希不再匹配)

来自
wintrust.dll
WinVerifyTrust
方法是最准确的,但是在我的可执行文件被混淆/VM'd之后,我似乎得到了一个假阳性。在这个场景中,我得到的结果是(int)2148204800,即使.exe已有效签名且未被篡改。我也反对使用Windows API调用,因为我希望代码尽可能可移植

其他方法,例如
X509Certificate.CreateFromSignedFile().Verify()
和Powershell方法当然不会验证exe的哈希,因此返回true


在过去的4年里,有没有新的方法来验证.exe的哈希值,最好是在纯.NET中?我很高兴有一个解决方案可以简单地验证哈希而不是整个证书(如果可能的话)。

如果您将Mono.Security作为一个Nuget包,那么他们有一个很好的
AuthenticodeDeformatter
类来验证代码签名证书:

var authenticode = new AuthenticodeDeformatter(Filename);
authenticode.IsTrusted(); //Should return False if tampered with.

这实际上验证了Authenticode签名吗?看起来它所做的只是验证可执行文件中的证书,而不是验证可执行文件是否用证书正确签名。抱歉,我选择了错误的例程。请参阅更新的回复。感谢更新的代码。现在就开始吧,很快就会更新你。更新:我刚刚安装了Mono.Security NuGet软件包,并尝试了你的代码。尽管Windows属性清楚地告诉我指定文件上存在SHA1和SHA265有效数字签名,但我始终在IsTrusted(原因代码1,无数字签名)上获得“false”。令人困惑的是,如果我放置一个不存在的文件名,代码将返回相同的结果。我确信指定的路径名是正确的(包括匹配的大小写)。不确定我可能做错了什么?更新#2:在相同的测试代码中,我输入了X509Certificate.CreateFromSignedFile(filename).Verify()并可以查看证书。当AuthenticodeDeformatter(filename)在同一代码块中执行时,我看不到加载的任何证书(仍然是Result=1)。作为记录,这段代码是在有问题的可执行文件之外运行的,我没有混淆生成的.exe,只是对其进行了签名。我正在尝试从其源代码构建Mono Security dll,以查看是否可以跟踪问题,但是尝试这样做似乎是另一个StackOverflow问题;)“在过去的4年里,有没有什么新的方法来验证.exe的哈希值,最好是在纯.NET中?”-不幸的是,没有。你能发布你的C代码吗?我假设它正在执行平台调用?我正在逐字使用这篇文章中的代码:“在我的可执行文件被混淆/VM'd之后,我似乎得到了一个假阳性。”这是一个没有足够细节的声明。@LexLi我不希望混淆方法成为讨论的焦点。我看到的要点是,WinVerifyTrust正在返回一个通用错误代码,即使1)该.exe已完全签名且未与之匹配,2)该.exe完全可读/可访问,3)Windows“属性”->数字签名显示签名有效。4) X509Certificate.Verify方法也仍在工作。我绝对需要这个方法返回的确定性,因为如果签名不正确,它将用于停止应用程序。