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

您所在的位置:网站首页 签名校验失败怎么办 如何在.NET中验证DLL的数字签名

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

2024-06-17 20:14| 来源: 网络整理| 查看: 265

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

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

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

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

限制:

导入的DLL不是我开发的,而是外部公司开发的。DLL不是随我的应用程序一起分发的,它在运行我的应用程序之前就已经安装好了。导入的DLL存在于许多不同的版本中(而且还会有更多的版本),所以在导入之前我不能简单地使用验证DLL的MD5校验和。

失败的方法:

微软在防止"DLL预压攻击“上写得很好,但是这个信息不适用于.NET的DllImport。我见过一些人建议使用来自Wintrust.dll的非托管函数Wintrust.dll。这当然是一个愚蠢的解决方案,因为这将使我的应用程序容易通过Wintrust.dll注入DLL。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3