38

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

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

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

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

4

9 回答 9

38

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

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

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

于 2009-05-15T16:18:34.607 回答
14

如何防御这 3 种技术:

创建远程线程

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

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

这将阻止 DLL 加载。

SetWindowsHookEx

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

代码洞穴

不错的技术。以前没见过。您可以对此进行防御,但您必须挂钩 LoadLibrary 入口点(而不是 IAT 表),因为 Code Cave 直接调用 LoadLibrary。

正如文章的作者所评论的 - 有很多方式可以攻击你,你可能很难打败它们。但通常您只想防御某些 DLL 加载(例如与您的软件不兼容的特定 3rd 方 DLL,因为 3rd 方 DLL 没有正确编写以适应另一个钩子也可能存在的事实,所以您阻止它从加载)。

于 2010-04-07T09:40:37.303 回答
6

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

于 2009-05-15T15:49:55.177 回答
6

由于这张海报暗示他正在投资游戏反黑客,让我谈谈我的想法。作为一个前骗子。

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

最好的办法是让服务器运行核心游戏逻辑。例如,在第一人称射击游戏中,监控客户端发送到服务器的动作。不要让他们随意走动。让服务器根据自己的逻辑告诉客户端每个玩家在哪里。永远不要只转发命令。他们可能是假的。

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

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

于 2011-04-11T11:33:18.313 回答
2

您是否正在寻找 Ring3 解决方案?如果是这样,您希望在当前(至少据我所知)未提供开箱即用的系统中构建附加功能,因此需要一些工作。此外,这可以通过驱动程序实现,事实上,您的大多数 AV 软件都会定期执行此类活动。

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

所以实际上你想检查 CreateRemoteThread 想在哪里创建一个线程,如果你不满意它会返回一个错误。

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

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

于 2009-07-16T13:21:54.653 回答
1

只是简短的讨论想法:)

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

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

于 2009-07-01T10:07:22.153 回答
0

为什么要阻止这种情况?这是实际的“业务”需求,还是您只是对“黑客”感兴趣以反对“黑客”

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

Raymond Chen 很快就会链接到这里...

于 2009-05-15T15:50:52.240 回答
0

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

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

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

  3. 静态分配您的内存空间,以便生成的任何新线程都将失败或覆盖现有内存空间;不过,您可能需要大量的逻辑来检测和纠正这一点。

  4. 将您的代码放入设备驱动程序或其他一些低级类型的进程中,您可以在 Windows 文件保护伞下获得这些进程。

刚刚看到 Cthulon 的回答,恐怕他可能是对的:任何想要在您的应用程序上执行代码注入的人都会找到这样做的方法。上述步骤可能只会让它变得更加困难。

希望这可以帮助

于 2009-05-15T16:29:29.370 回答
0

我参加聚会迟到了,但我想我还是应该分享。

应用程序应使用强大的加密算法进行签名。有 3 种不同的技术用于 DLL 注入。要防止 DLL 注入,请执行以下操作:

  1. CreateRemoteThread 您可以通过挂钩 LoadLibrary 来阻止第一种技术(调用 LoadLibrary 的 CreateRemoteThread)。在您的钩子中,您可以检查您知道是进程的一部分并且可能已加载的 DLL 名称列表,或者您可以检查您不想加载的已知 DLL 列表。当您找到不想加载的 DLL 时, SetLastError(ERROR_ACCESS_DENIED)返回 NULL。我设置了最后一个错误,以便编写代码寻找错误代码的人得到一个。这似乎可行,也许不同的代码可能更合适。这将阻止 DLL 加载。

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

  3. Code Cave You can defend against this, but you'll have to hook the LoadLibrary entry point (not the IAT table) as the Code Cave calls LoadLibrary directly. There are many ways you can be attacked and you probably will have a hard time defeating them all. But often you only want to defend against certain DLL loads (such as a particular 3rd party DLL that is incompatible with your software because the 3rd party DLL wasn't written properly to accommodate the fact that another hook may also be present, so you block it from loading). Also, Digitally sign the application. It will ensure the authenticity and the integrity of the executable application.

Link 1 Link 2

于 2022-02-23T11:38:05.360 回答