如何保护.NET应用程序免受DLL劫持?
我们有一个注册了扩展名的.NET3.5应用程序。我们如何保护它免受DLL劫持攻击 由于遗留问题和设计问题,目前无法选择强命名/签名 如果您不知道DLL劫持是什么,请提供额外信息:如何保护.NET应用程序免受DLL劫持?,.net,security,dll,.net,Security,Dll,我们有一个注册了扩展名的.NET3.5应用程序。我们如何保护它免受DLL劫持攻击 由于遗留问题和设计问题,目前无法选择强命名/签名 如果您不知道DLL劫持是什么,请提供额外信息: 看看这个……它可能会帮助您并让您了解……另一件事,您当然可以签出并截获API createRemoteThread,并找出DLL是否是未经授权的DLL之一。。。。看看这篇文章,它解释了如何阻止dll注入如果你有文件夹/数据访问权限,你可以编写代码,在调用你自己的.dll(或搜索整个驱动器)之前,主动去Window
- 在开发应用程序时,创建dll的MD5校验和,并对应用程序中的哈希进行硬编码
- 每次启动应用程序时,都使用相同的逻辑生成dll文件的MD5校验和,并将其与硬编码文件进行比较
- 您可能已经知道了,但下面是如何高效地生成文件的校验和(请参阅答案:)
- 生成dll的哈希,具有强哈希算法和salt
- 生成RSA密钥-值对(私钥和公钥)
- 使用私钥加密dll的哈希
- 在应用程序中嵌入公钥、“加密哈希”和salt
- 应用程序启动后,使用公钥解密“加密哈希”
- 在运行时使用相同的salt再次生成哈希,并与使用公钥解密的哈希进行比较
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必须由