7

我们的下一个项目应该是一个基于 MS Windows 的游戏(用 C# 编写,带有一个 winform GUI 和一个集成的 DirectX 显示控件),供想要将奖品赠送给最佳玩家的客户。这个项目打算运行几年,包括锦标赛、阶梯、锦标赛、玩家对玩家行动等等。

这里的一个主要问题是作弊,因为如果玩家能够 - 例如 - 让定制的机器人为他玩游戏(更多地是在策略决策方面,而不是在玩很多小时方面),他将会受益匪浅.

所以我的问题是:我们有哪些技术可能性来检测机器人活动?我们当然可以跟踪播放的小时数,分析检测异常的策略等等,但就这个问题而言,我更感兴趣的是了解详细信息,例如

  • 如何检测另一个应用程序是否定期截屏?
  • 如何检测另一个应用程序是否扫描我们的进程内存?
  • 有什么好方法可以确定用户输入(鼠标移动、键盘输入)是否是人工生成的而不是自动化的?
  • 是否可以检测另一个应用程序是否请求有关我们应用程序中控件的信息(控件的位置等)?
  • 还有哪些其他方法可以让作弊者收集有关当前游戏状态的信息,将这些信息提供给机器人并将确定的操作发送回客户端?

非常感谢您的反馈!

4

7 回答 7

7

不久前,我编写了 d2botnet,一个 .net 暗黑破坏神 2 自动化引擎,您可以添加到需要注意的事项列表中的是格式错误/无效/伪造的数据包。我假设这个游戏将通过 TCP 进行通信。数据包嗅探和伪造通常是游戏(无论如何在线)自动化的第一种方式。我知道暴雪会检测到格式错误的数据包,我试图避免在 d2botnet 中这样做。

因此,请确保您检测到无效数据包。加密它们。哈希它们。做一些事情以确保它们是有效的。如果您考虑一下,如果有人可以确切地知道来回发送的每个数据包的含义,他们甚至不需要运行客户端软件,这使得任何基于进程的检测都成为争议点。因此,您还可以添加某种基于数据包的质询响应,您的客户必须知道如何响应。

于 2008-09-27T09:29:50.460 回答
5

只是一个想法,如果“骗子”在虚拟机(如 vmware)中运行您的软件并制作该窗口的屏幕截图怎么办?我怀疑你可以防御这一点。

您显然无法抵御“模拟差距”,例如作弊者的系统使用高质量相机制作外部屏幕截图 - 我想这只是一个理论问题。

也许你应该调查国际象棋网站。国际象棋有很多钱,他们也不喜欢机器人——也许他们已经想出了解决办法。

于 2008-09-27T08:39:54.840 回答
3

对自动化的最佳保护是没有需要磨削的任务。

话虽如此,检测自动化的最佳方法是积极吸引用户并要求定期进行类似 CAPTCHA 的测试(除非没有图像等)。我建议使用包含数千个简单的一次性问题的数据库,这些问题每隔一段时间就会向用户提出。

但是,根据您的问题,我想说您最好的选择是不要在 C# 中实现反自动化功能。您几乎没有机会从托管代码中检测到编写良好的黑客/机器人,尤其是当黑客所要做的只是进入 ring0 以避免通过任何标准方法检测时。我推荐一种类似于 Warden 的方法(可下载的模块,您可以随时更新)结合内核模式驱动程序,该驱动程序挂钩所有 Windows API 函数并监视它们是否存在“不适当的”调用。但是请注意,您会遇到很多误报,因此您不需要将您的禁令系统建立在您的自动化数据上。在禁止之前,请始终对其进行人工检查。

于 2008-09-27T09:17:44.170 回答
2

在应用程序中侦听键盘和鼠标输入的常用方法是使用 SetWindowsHookEx 设置窗口挂钩。供应商通常会在安装过程中尝试保护他们的软件,这样黑客就不会为他们的应用程序自动化和破解/找到序列号。谷歌这个词:“Key Loggers”......这是一篇描述问题和防止它的方法的文章。

于 2008-09-27T09:40:16.160 回答
1

我对 PunkBuster 和此类软件的工作原理没有更深入的了解,但这是我要走的路:

Iintercept 对处理诸如ReadProcessMemoryWriteProcessMemory等内存内容的 API 函数的调用。

您将检测您的进程是否参与调用,记录它,然后将调用跳回原始函数。

这也适用于截屏,但您可能想要拦截 BitBlt 函数。

这是关于函数拦截的基本教程: 拦截系统 API 调用

于 2008-09-27T09:23:29.820 回答
0

你应该研究一下 Punkbuster、Valve Anti-Cheat 和其他一些反作弊的东西,以获得一些指导。

编辑:我的意思是,看看他们是怎么做的;他们是如何检测到这些东西的。

于 2008-09-27T08:35:30.683 回答
0

我不知道技术细节,但是 Intenet Chess Club 的 BlitzIn 程序似乎集成了程序切换检测。这当然是为了检测在侧面运行国际象棋引擎的人,并不直接适用于您的情况,但是您可以将方法推断为如果进程 X 在下一个 Y 周期占用超过 Z% CPU 时间,它可能一个机器人正在运行。

作为竞赛规则的一部分,除了“您在玩游戏时不得运行任何其他东西以获得奖品”之外可能会起作用。

此外,严苛的“我们可能会出于任何原因随时决定您一直在使用机器人并取消您的资格”规则也有助于上述启发式方法(用于珍贵的 ICC 国际象棋锦标赛)。

所有这些问题都可以通过上面的规则 1 轻松解决:

* how to detect if another application makes periodical screenshots?
* how to detect if another application scans our process memory?
* what are good ways to determine whether user input (mouse movement, keyboard input) is human-generated and not automated?
* is it possible to detect if another application requests informations about controls in our application (position of controls etc)?

我认为让破解者更难解决问题的一个好方法是在您的服务器中拥有游戏状态的唯一权威副本,仅向客户端发送和接收更新,这样您就可以嵌入通信协议本身客户端验证(它没有被破解,因此检测规则仍然存在)。那,并积极监控发现的新奇怪行为可能会让你更接近你想去的地方。

于 2008-09-27T08:59:54.697 回答