相关疑难解决方法(0)

从.NET中的Authenticode签名文件中获取时间戳

我们需要验证二进制文件是否使用数字签名(Authenticode)正确签名.这可以通过signtool.exe轻松实现.但是,我们需要一种自动方式来验证签名者名称和时间戳.这在使用CryptQueryObject()API的本机C++中是可行的,如以下精彩示例所示:如何从Authenticode签名的可执行文件获取信息

然而,我们生活在一个托管的世界:)因此寻找相同问题的C#解决方案.直接的方法是pInvoke Crypt32.dll,一切都完成了.但是System.Security.Cryptography.X509CertificatesNamespace中有类似的托管API .X509Certificate2类似乎提供了一些信息但没有时间戳.现在我们来到原始问题,我们如何才能在C Sharp中获得数字签名的时间戳?

.net c# certificate signature authenticode

21
推荐指数
3
解决办法
1万
查看次数

在没有CAPICOM的EXE - C++上验证Authenticode签名

我正在为安装程序DLL编写一个函数来验证已安装在系统上的EXE文件的Authenticode签名.

该功能需要:

A)验证签名是否有效.
B)验证签名者是我们的组织.

因为这是在安装程序,因为这需要运行在旧的Win2k设施,我想要依靠的CAPICOM.dll,因为它可能不是在目标系统上.

的WinVerifyTrust API的伟大工程,以解决(A).

我需要找到一种方法来比较已知证书(或其中的属性)与签署有问题的EXE的证书.

c++ winapi cryptography authenticode

15
推荐指数
1
解决办法
1万
查看次数

检查给定的可执行文件是否经过数字签名且有效?

在我的C#/ .NET应用程序中,我必须检查给定的可执行文件是否经过数字签名 (最好不Exception进行测试).

然后我需要检查其证书是否有效 (基于已安装的根证书)以及文件内容是否对签名有效.

这里有很多课程BCL,我不知道从哪里开始和使用什么,到目前为止我发现的任何东西并没有消除我的困惑......

如果没有 P/Invoke可能,我想做这样的事情:

bool IsSignedFile(string path);  
Cert GetCertificateFromSignedFile(string path);
bool IsValidCertificate(Cert cert)
Sig GetSignatureFromSignedFile(string path);
bool IsValidSignature(string path, Sig sig, Cert cert);  
Run Code Online (Sandbox Code Playgroud)

补充说明:

我目前遇到的一个大问题是,我找不到一种方法来轻松获取此类文件的签名.仍然希望有一个提供的,可管理的BCL解决方案,因为如果缺少这一部分,我会感到惊讶.(对于证书,这可以通过公正的方式完成,也可以进行X509Certificate.CreateFromSignedFile验证)
我不希望将50%的工作与P/Invoke代码或大型不同的库混合使用.

我找到了一个AuthenticodeSignatureInformation类,但没有关于为给定的可执行文件使用它的信息.

.net c# cryptography code-signing authenticode

12
推荐指数
1
解决办法
4843
查看次数

如何在.NET中验证DLL的数字签名

我编写了一个C#.NET应用程序,它使用流行的非托管DLL文件来实现其部分功能.使用System.Runtime.InteropServices中的标准DllImport导入DLL.

但是,遗憾的是,我的应用程序(以及大多数使用DllImport的.NET应用程序)容易受到DLL劫持攻击.即攻击者可以将导入的DLL的恶意副本放在与我的应用程序打开的任何文件相同的目录中.这可以使攻击者完全控制用户的计算机.

为了缓解此漏洞,我想在导入之前验证DLL文件是否已正确签名(使用默认的Authenticode).我知道签名可以使用像sigcheck.exe这样的工具进行验证,但这对我来说不是一个可行的解决方案,因为我需要在我的C#代码中完成.

所以我的问题很简单:在加载DLL之前,如何从我的托管C#代码中验证DLL是否具有有效的Authenticode签名?

限制:

  • 导入的DLL不是由我开发的,而是来自外部公司.
  • DLL不随我的应用程序一起分发,预计在运行我的应用程序之前已经安装了.
  • 导入的DLL存在于许多不同的版本中(甚至会有更多版本),因此我无法在导入之前简单地 验证DLL的MD5校验和.

失败的方法:

  • 微软有一个关于防止"DLL预加载攻击"的好文章,但是,这个信息不适用于.NET的DllImport.
  • 我见过一些人建议使用Wintrust.dll中的非托管函数WinVerifyTrust.这当然是一个愚蠢的解决方案,因为这会使我的应用程序容易受到Wintrust.dll的DLL注入.

.net c# security dll dllimport

8
推荐指数
1
解决办法
6075
查看次数