我编写了一个C# .NET应用程序,它的部分功能使用了一个流行的非托管DLL文件。DLL是使用标准DllImport从System.Runtime.InteropServices导入的。
然而,不幸的是,我的应用程序(以及大多数使用.NET的DllImport应用程序)容易受到DLL劫持的攻击。也就是说,攻击者可以将导入的DLL的恶意副本放置在与我的应用程序打开的任何文件相同的目录中。这可能使攻击者完全控制用户的计算机。
为了减轻此漏洞,我希望在导入DLL文件之前验证它是否正确地签名(使用默认的Authenticode)。我知道可以使用像sigcheck.exe这样的工具来验证签名,但是这对我来说不是一个可行的解决方案,因为我需要在我的C#代码中进行验证。
因此,我的问题很简单:在加载DLL之前,如何从托管C#代码中验证DLL是否具有有效的Authenticode签名?
限制:
失败的方法:
发布于 2013-07-21 05:50:28
您需要使用Authenticode验证器。这个问题的答案提供使用P/Invoke,如果您需要托管解决方案,您可能会对我们的SecureBlackbox库感兴趣,该库提供了Authenticode签名和签名验证等功能。
但是,虽然您可以保护自己不加载假DLL,但您不能保护应用程序本身不被破解。当然,签名验证只保护您不受一个攻击矢量的攻击。
让我指出,替换WinTrust.dll取决于另一个需要访问计算机的攻击向量。在这种情况下,攻击者可以完全修补您的应用程序。
https://stackoverflow.com/questions/17766592
复制相似问题