首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在.NET中验证DLL的数字签名

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

Stack Overflow用户
提问于 2013-07-20 20:52:43
回答 1查看 11K关注 0票数 12

我编写了一个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。
EN

回答 1

Stack Overflow用户

发布于 2013-07-21 05:50:28

您需要使用Authenticode验证器。这个问题的答案提供使用P/Invoke,如果您需要托管解决方案,您可能会对我们的SecureBlackbox库感兴趣,该库提供了Authenticode签名和签名验证等功能。

但是,虽然您可以保护自己不加载假DLL,但您不能保护应用程序本身不被破解。当然,签名验证只保护您不受一个攻击矢量的攻击。

让我指出,替换WinTrust.dll取决于另一个需要访问计算机的攻击向量。在这种情况下,攻击者可以完全修补您的应用程序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17766592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档