如何针对DLL劫持来检测我的.NET应用程序?

Rob*_*Shu 8 .net security dll

我们有一个带注册扩展的.NET 3.5应用程序.我们如何保护它免受DLL劫持攻击?

由于传统和设计问题,强大的命名/签名现在不是一种选择

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

小智 6

我遇到了类似的问题,最终我写了自己的逻辑来验证dll。对我来说,我只是以LGPL方式使用了该dll(我无法修改该dll),但想确保我的应用程序使用的是真正的dll(而不是被劫持的dll)。

简单的解决方案:

  • 在开发应用程序时,创建dll的MD5校验和并在应用程序中对哈希进行硬编码
  • 每次启动应用程序时,都使用相同的逻辑来生成dll文件的MD5校验和并将其与硬编码的文件进行比较。
  • 您可能已经知道了,但这是如何有效地生成文件的校验和(请参阅答案:https : //stackoverflow.com/a/1177744/392850

更好的解决方案:

  • 使用强大的哈希算法和盐生成dll哈希
  • 生成RSA密钥值对(私钥和公钥)
  • 用您的私钥加密dll的哈希
  • 在您的应用程序中嵌入公钥,“加密的哈希”和盐
  • 应用程序启动后,用您的公共密钥解密“加密的哈希”
  • 在运行时使用相同的盐再次生成哈希,然后与使用公钥解密的哈希进行比较

如果您有来自受信任CA的任何证书(如verisign),则可以使用该证书而不是使用RSA密钥值对。

这样,即使有人用破解的dll替换了您的dll,哈希也将不匹配,并且您的应用程序将知道劫持尝试。

这种方法可能比只给dll一个强名称更好,因为强名称验证可能会因运行而被禁用

SN -Vr HijackedAssembly
Run Code Online (Sandbox Code Playgroud)

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


t0m*_*13b 0

看看这个线程......它可能会帮助你并给你洞察......另一件事,你当然可以查看EasyHook,并拦截 API createRemoteThread 并查明该 DLL 是否是未经授权的DLL之一。 ...看看这个线程,它解释了如何阻止 dll 注入