如何防止DLL注入

问题描述 投票:32回答:8

所以前几天,我看到了这个:

http://www.edgeofnowhere.cc/viewtopic.php?p=2483118

它涉及三种不同的DLL注入方法。我如何防止这些过程?或者至少,我该如何预防第一个?

我想也许Ring 0的驾驶员可能是阻止这三个人的唯一方法,但我想看看社区的想法。

windows security code-injection
8个回答
33
投票

最好的技术解决方案是执行某些操作,导致加载程序代码在进程初始化后无法正常运行。这样做的一种方法是使用NT加载程序锁定,这将有效地防止任何加载器操作发生。其他选项包括直接在内存中修补加载程序代码以使攻击者对LoadLibrary的调用失败(例如,插入int3断点并自行调试以处理预期的情况)。

但作为一名黑客(实际上是管理您链接的网站的人),您不会阻止人们以某种​​方式将代码放入您的流程中。 LoadLibrary恰好是一个方便的快捷方式,但有许多不同的手动加载代码的方法,你永远不能希望完全停止,缺少一些极其复杂的ring0代码。即使你去了ring0,黑客也会在你旁边。

此外,DLL注入有很多合法用途。主题程序,可访问性工具和扩展OS功能的各种程序都可以使用DLL注入为任何程序提供附加功能。


12
投票

如何防御这三种技术:

CreateRemoteThread

您可以通过挂钩LoadLibrary来阻止第一种技术(CreateRemoteThread调用LoadLibrary)。在您的钩子中,您检查您知道是进程的一部分并且可以加载的DLL名称列表,或者您可以检查您不想加载的已知DLL列表。

当您找到DLL时,您不想加载SetLastError(ERROR_ACCESS_DENIED),然后返回NULL。我设置了最后一个错误,以便编写代码查找错误代码的人得到一个。这似乎工作,也许不同的代码可能更合适。

这将阻止DLL加载。

SetWindowsHookEx

我认为CreateRemoteThread阻塞的相同技术适用于SetWindowsHookEx,但前提是你可以在SetWindowsHookEx技术开始加载代码之前安装钩子(这通常是在应用程序中创建第一个Window时 - 在其生命周期的早期)。

Code Cave

很好的技术。之前没见过。你可以防止这种情况,但你必须挂钩LoadLibrary入口点(而不是IAT表),因为Code Cave直接调用LoadLibrary。

正如文章的作者评论的那样 - 有许多方法可以被攻击,你可能很难将它们全部击败。但通常你只想防御某些DLL加载(例如与你的软件不兼容的特定第三方DLL,因为第三方DLL没有正确编写以容纳另一个钩子也可能存在,所以你阻止它来自装载)。


6
投票

最好的方法是确保没有不受信任的进程获得管理员访问权限,或者作为与应用程序相同的用户帐户运行。如果没有此访问权限,则无法向您的应用程序注入代码;一旦这样的进程获得了访问权限,它就会导致各种恶作剧而无需将自己注入另一个进程 - 注入只会使其更容易隐藏。


4
投票

由于这张海报暗示他正在投资游戏反黑客,所以让我对我的想法有所了解。作为前骗子。

只是一个关于游戏反黑客的指针。

最好的方法是让服务器运行核心游戏逻辑。例如在第一人称射击游戏中,监视客户端发送到服务器的移动。不要让它们随意移动。让服务器告诉客户每个玩家基于自己的逻辑。不要只是转发命令。他们可能是虚假的。

谁在乎黑客攻击他自己的客户?只是拒绝其他的,一切都很好。对于星际地图,解决方案很简单。不要给那些应该是未知的区域提供游戏状态。它也节省了带宽。

我是三角洲部队的一个大骗子(它是一个老游戏)。我使用的主要技巧是通过直接修改进程内存来扭曲游戏中的任何位置。不需要DLL!


2
投票

你在寻找Ring3解决方案吗?如果是这样,你想要在系统中构建额外的功能,这些功能目前(至少据我所知)是开箱即用的,因此需要一些工作。此外,这可以从驱动程序中实现,实际上大多数AV软件都会定期执行此类活动。

至于从用户模式停止上述方法,它会变得有点棘手,因为你不能只将自己注册为回调进程创建或DLL加载。但是,如果您假设您的进程已在他们的进程之前启动,则可以全局挂钩CreateRemoteThread和类似函数,并自行执行此类检查。

因此,实际上您需要检查CreateRemoteThread想要创建线程的位置,如果您对它不满意则返回错误。

这将否定前两种方法。对于第三种方法,如果您在磁盘上有原始程序的有效哈希值,那么您可以在加载之前始终检查哈希值。如果你没有哈希,你至少可以检查一些简单的地方,有人会添加这种类型的代码,并寻找你不希望存在的DLL(例如IAT,或运行字符串)。

它不是万无一失的,但它似乎提供了您所要求的功能。


1
投票

只是简单的讨论想法:)

使用代码洞穴将CRC校验注入到您自己的代码中可能会减慢其他人使用其他代码洞穴的速度。

轮询正在加载的未知dll的进程模块列表可能有助于减慢人们只是使用附加线程和消息挂钩注入任何旧东西。


0
投票

你为什么要阻止这个?这是一个真正的“商业”需求,还是你只是对'黑客'反对'黑客'感兴趣?

如果用户权限允许,则按设计 - 操作系统为您(系统管理员)分配给他们运行的帐户的所有用户提供便利。

雷蒙德陈将很快在这里联系......


0
投票

我并不熟悉Windows API,但我可以给你一些更通用的指针:

  1. 查看您是否可以使用Windows数据执行保护(DEP)。它可能不适用于所有(读取:大多数)情况,因为从操作系统的角度来看,链接中概述的过程是一个有效的过程。虽然深度防守
  2. 确保您的流程方法在整个应用程序中声明安全权限
  3. 静态分配内存空间,以便生成的任何新线程都会失败或覆盖现有的内存空间;你可能需要大量的逻辑来检测并纠正这个问题。
  4. 将您的代码纳入设备驱动程序或其他一些低级别类型的进程,您可以在Windows文件保护伞下进行介绍。

刚看到Cthulon的回答,我担心他可能是正确的:任何想要在你的应用程序上执行代码注入的人都会找到一种方法。上述步骤可能只会让它变得更加困难。

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.