如何防止DLL注入

时间:2009-05-15 15:21:20

标签: windows security code-injection

所以有一天,我看到了这个:

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

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

我在想,也许Ring 0驱动程序可能是阻止这三者的唯一方法,但我想看看社区的想法。

8 个答案:

答案 0 :(得分:32)

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

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

此外,DLL注入有很多合法用途。主题程序,辅助功能工具和扩展操作系统功能的各种程序都可以使用DLL注入为任何程序提供附加功能。

答案 1 :(得分:12)

如何防御这三种技术:

CreateRemoteThread的

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

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

这将阻止DLL加载。

和SetWindowsHookEx

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

Code Cave

很棒的技巧。之前没见过。您可以对此进行辩护,但您必须挂钩LoadLibrary入口点(而不是IAT表),因为Code Cave直接调用LoadLibrary。

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

答案 2 :(得分:6)

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

答案 3 :(得分:4)

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

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

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

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

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

答案 4 :(得分:2)

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

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

所以实际上你想要检查CreateRemoteThread想要创建一个线程的位置,如果你对它不满意就会返回一个错误。

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

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

答案 5 :(得分:1)

只是简短的讨论想法:)

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

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

答案 6 :(得分:0)

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

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

Raymond Chen将很快联系到这里......

答案 7 :(得分:0)

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

  1. 查看您是否可以使用Windows数据执行保护(DEP)。它可能不适用于所有(读取:大多数)情况,因为从操作系统的角度来看,链接中概述的过程是一个有效的过程。深入防御

  2. 确保您的流程方法在整个应用程序中声明安全权限

  3. 静态分配内存空间,以便生成的任何新线程都会失败或覆盖现有内存空间;你可能需要一大笔钱     用于检测和纠正此问题的逻辑。

  4. 将您的代码纳入设备驱动程序或其他一些低级别类型的进程,您可以在Windows文件保护伞下进行介绍。

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

    希望这有帮助