在这个有关DLL注入的问题中,有多个答案提到DLL注入可以用于修改游戏,也许出于编写机器人的目的。似乎希望能够检测DLL注入以防止这种情况发生。这可能吗?

评论

有很多方法可以检测注入的DLL,甚至可以避免被检测到。在简单的情况下,您可以遍历流程中的所有模块,并查找不应该存在的所有内容。有时您可能想挂载LoadLibrary,以防注入的DLL从模块列表中将其自身删除。但是,仅检测注入的DLL是检测作弊或攻击的非常糟糕的方法。许多无害的程序,例如流行的视频捕获软件Fraps,都会向程序注入DLL。不幸的是,我对实际检测DLL的了解不多。我只是注入它们。 :)

游戏作弊应在服务器端进行检测。总是可以绕过客户端检测。

#1 楼

您可以使用多种方法进行操作(可能无法使用的原因,请参阅下文)。这是两个:


一个进程可以调试自己,然后它将接收DLL加载的通知。
一个进程可以承载TLS回调,然后它将接收通知创建线程。这样可以拦截线程的创建,例如CreateRemoteThread生成的线程。如果线程的起始地址是LoadLibrary(),则表明您有人将要强制加载DLL。

除此之外,您可以定期枚举DLL名称列表,但是所有这些技术可以被坚定的攻击者击败(调试可以暂时停止;线程通知可以关闭;注入的DLL可能无法保持足够长的加载时间,因为它可能使用动态分配的内存来承载自身,然后卸载文件,等)。

评论


快速提问,过去我使用了一种非常古老的技术,称为dll加载顺序劫持。即使是最近,这种技术也无法被大多数游戏反作弊技术成功地击败。您知道有什么方法可以避免这种情况吗?我使用winsock dll作为游戏加载的代理dll,然后我的dll将必要的功能传递给了真正的winsock dll。用宠物小精灵的话来说。 “非常有效!”

– Gandolf
2014年8月6日在1:25



#2 楼

如果攻击者是经验丰富的游戏黑客,并且作弊行为的具体细节未知,那么您尝试做的事情将非常困难。

通常,如果您想注入一个难以检测和发现的DLL,您使用称为手动映射的内容不会显示在流程的模块列表中。这是因为它模拟了LoadLibrary的行为,而没有将DLL放入进程模块列表中。我个人是MemoryModule的粉丝。如果您想了解一种非常常见的隐藏技术,请进行研究。即使您的黑客从未公开,也建议确保您的DLL永远不会出现在崩溃报告或类似内容中。

问题是,一旦您知道要注入到进程中的事实,您要攻击的模块就可以访问您的代码。正确实现的客户端防作弊操作将枚举所有映射的内存区域,并将所有映射的内存段的各种偏移量的哈希集发送到服务器。然后,服务器会存储这些哈希集,这样,如果您公开的作弊行为便会被追溯禁止。

如果要避免该过程无法检测到代码,则必须将所有内容包装在虚拟机中,然后从虚拟机外部与进程进行交互。其他较弱的选择是编写驱动程序并尝试隐藏在环0中,以简单地创建与流程进行交互的调试器或使用断点以及某种进程内调试器来处理硬件断点事件,从而避免检测到钩子。

正确实施的游戏将不会在乎客户端是否受到威胁,因为一旦您信任玩家,就会遇到问题。理想情况下,游戏客户端将仅呈现状态,对服务器的输出做出反应,并将输入与所有逻辑服务器端一起发送到服务器。不幸的是,由于延迟和性能原因,这并非总是可能的。对于客户做出的每一个决定,都要问自己:承担这种责任的客户最糟糕的后果是什么。因为它会发生。

#3 楼

修补游戏的可执行文件+使用加载顺序技巧


您应该在加载之前检查游戏可执行文件的完整性,因为可以通过修补它来加载恶意的Dll文件,如果添加了覆盖(如病毒)
检查游戏目录中是否存在未知的dll文件-奇怪的名称,模仿系统库文件的dll
另一件事是-某些加载程序将与原始文件的名称一起放置,这会引起注意对于所有事物,最后将加载实际的游戏-因此,请监视整个游戏目录的完整性。

进程注入-它不一定是dll,而是某些任意代码


通过修补
来监视“入侵” API调用(例如)。 WriteProcessMemory
b。 VirtualAlloc(Ex)
c。 VirtualProtect
d。 ZwWriteProcessMemory
e。 NtMapViewOfSection
f。 CreateRemoteThread
g。 CreateProcess-带有挂起状态的标志
h。 OpenProcess
创建看门狗线程以监视敏感游戏内存区域的完整性


#4 楼

对的,这是可能的。您可以采用两种通用方法来检测注入的进程(不仅仅是dll)。首先是枚举操作系统通过注册表项注入的DLL。两个已知的键/值是AppCertDLL和AppInitDLL。第二种是搜索标记为RWX的所有内存,然后解析内存以获取可执行文件或注入代码的线索。第三是搜索包含可执行文件或注入代码的私有内存。另一种方法是搜索API的内联挂钩。解析处理程序地址,然后查询处理程序的内存地址。处理程序可能是一个注入过程。

过去几周我一直在这方面进行研究。我的主要重点是检测注入的恶意软件。这是我本周发布的名为injdmp的工具,用于检测注入的进程。