Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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
如何保护.NET应用程序免受DLL劫持?_.net_Security_Dll - Fatal编程技术网

如何保护.NET应用程序免受DLL劫持?

如何保护.NET应用程序免受DLL劫持?,.net,security,dll,.net,Security,Dll,我们有一个注册了扩展名的.NET3.5应用程序。我们如何保护它免受DLL劫持攻击 由于遗留问题和设计问题,目前无法选择强命名/签名 如果您不知道DLL劫持是什么,请提供额外信息: 看看这个……它可能会帮助您并让您了解……另一件事,您当然可以签出并截获API createRemoteThread,并找出DLL是否是未经授权的DLL之一。。。。看看这篇文章,它解释了如何阻止dll注入如果你有文件夹/数据访问权限,你可以编写代码,在调用你自己的.dll(或搜索整个驱动器)之前,主动去Window

我们有一个注册了扩展名的.NET3.5应用程序。我们如何保护它免受DLL劫持攻击

由于遗留问题和设计问题,目前无法选择强命名/签名

如果您不知道DLL劫持是什么,请提供额外信息:


看看这个……它可能会帮助您并让您了解……另一件事,您当然可以签出并截获API createRemoteThread,并找出DLL是否是未经授权的DLL之一。。。。看看这篇文章,它解释了如何阻止dll注入

如果你有文件夹/数据访问权限,你可以编写代码,在调用你自己的.dll(或搜索整个驱动器)之前,主动去Windows查找你的.dll的同一个地方,并且你可以为你的合法dll计算CRC检查,或其他模式匹配,以比较找到的、匹配的DLL文件上的legit.DLL,从而确保没有其他人劫持您(将文件放置在您自己的位置或任何位置之前将被搜索的位置)。这可能需要对不同版本的Windows下针对不同搜索顺序的方法进行一些研究。然后,如果你发现有人试图劫持你的DLL,你可以采取一些行动,这取决于你是否确定有人试图劫持你的DLL。。。重命名faker.DLL、删除它、通知用户、通知管理员、不要调用您的DLL等等。

我遇到了类似的问题,我最终编写了自己的逻辑来验证DLL。对我来说,我只是以LGPL的方式使用那个dll(我不能修改dll),但我想确保我的应用程序使用的是真正的dll(不是hi-jacked的那个)

简单解决方案:

  • 在开发应用程序时,创建dll的MD5校验和,并对应用程序中的哈希进行硬编码
  • 每次启动应用程序时,都使用相同的逻辑生成dll文件的MD5校验和,并将其与硬编码文件进行比较
  • 您可能已经知道了,但下面是如何高效地生成文件的校验和(请参阅答案:)
更好的解决方案:

  • 生成dll的哈希,具有强哈希算法和salt
  • 生成RSA密钥-值对(私钥和公钥)
  • 使用私钥加密dll的哈希
  • 在应用程序中嵌入公钥、“加密哈希”和salt
  • 应用程序启动后,使用公钥解密“加密哈希”
  • 在运行时使用相同的salt再次生成哈希,并与使用公钥解密的哈希进行比较
如果您有任何来自可信CA(如verisign)的证书,则可以使用该证书,而不是使用RSA密钥-值对

这样,即使有人用破解的dll替换您的dll,哈希也不会匹配,您的应用程序也会知道劫持企图

这种方法可能比只给dll一个强名称要好,因为可以通过运行

SN -Vr HijackedAssembly

希望这对您或希望了解数字签名如何在内部工作的人有所帮助。

您能否将dll作为一种资源包括在内,并在运行时将其写入所需位置,然后将dll加载到程序集中?我这样做过一次,因为我们想作为一个.exe分发,但我认为它也能解决这个问题,不是吗?

罗伯特

公平地说,吉姆的问题是“那会是什么样的设计”。通过回答,而不是简单地说“就是这样”,您可以让我们深入了解我们的建议/解决方案必须满足的约束条件

换句话说,在不知道为什么遗留代码会阻止您以“正确的方式”进行操作的情况下,很难为您的问题提供理想的解决方法

除非您的体系结构阻止了Vishalgiri建议的MD5校验和思想,否则我建议采纳他的建议。尽管如此,如果不知道这些DLL被什么应用程序调用以及为什么它们不能被签名,很难知道这是否适用于您

我的想法可能简单得多,但是您不能调整应用程序以从预定义位置预加载DLL吗?例如,只允许它从主应用程序的BIN文件夹加载,如果失败,请不要重试

有关如何从不同路径加载的信息,请参见此链接:


这可能比编写所有MD5校验和代码要快。尽管我也喜欢这个想法。

如果你的应用程序注定要被混淆,在混淆之前首先使用ILMerge将DLL与EXE合并将提供绝对的保护,防止DLL劫持,同时消除未使用的代码并提供独立的EXE。

由于设计的原因,强命名/签名不是一个选项-那么您的设计会使程序集容易被DLL劫持。什么样的设计那会是,不允许签名或强命名程序集吗?Jim这是一个糟糕的设计,遗留原因,插件系统问题等。就像其他一百万个真实世界的应用程序一样。Darin,有很多C/C++应用程序在没有签名/强命名的情况下保护自己,所以强命名或签名不是强制性的。如果你不知道答案,你就不必发表评论。你是说保护客户端计算机上已安装的应用程序实例免受恶意攻击吗?如果是这样的话,那么你的程序集是否被签名就无关紧要了。整个应用程序可以使用ildasm反编译,无论是否已签名,您在其中放置的任何保护都可以删除,然后应用程序可以重新编译。签名程序集也是如此。程序集签名不是一种安全措施。CRC的设计没有考虑到安全性,它不是该作业的正确工具。像SHA这样的东西会更好。这种技术实际上违背了LGPL的本质。LGPL要求加载的任何dll必须由