防止自动化

时间:2008-09-27 08:30:18

标签: automation bots protection

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

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

所以我的问题是:我们有什么技术可能来检测机器人活动?我们当然可以跟踪播放的小时数,分析检测异常的策略等等,但就这个问题而言,我会更有兴趣知道像

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

非常感谢您的反馈!

7 个答案:

答案 0 :(得分:7)

我曾经写过d2botnet,一个.net diablo 2自动化引擎,你可以添加到要注意的事项列表中的是畸形/无效/伪造的数据包。我假设这个游戏将通过TCP进行通信。数据包嗅探和锻造通常是游戏(在线无论如何)自动化的第一种方式。我知道暴雪会检测到格式错误的数据包,有些人试图远离d2botnet。

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

答案 1 :(得分:5)

如果'骗子'在虚拟机中运行您的软件(如vmware)并制作该窗口的屏幕截图,那该怎么办?我怀疑你可以为此辩护。

你显然无法抵御'模拟差距',例如:骗子的系统使用高质量的相机制作外部截图 - 我想这只是一个理论问题。

也许你应该调查国际象棋网站。国际象棋中有很多钱,他们也不喜欢机器人 - 也许他们已经提出了解决方案。

答案 2 :(得分:3)

防止自动化的最佳保护措施是不需要磨削任务。

话虽这么说,检测自动化的最佳方法是积极地吸引用户并要求定期进行类似CAPTCHA的测试(除了没有图像等)。我建议使用一个数千个简单的一次性问题的数据库,这些问题经常被提交给用户。

但是,根据您的问题,我认为您最好的选择是不在C#中实现反自动化功能。你很难从托管代码中检测出写得好的hacks / bot,特别是当所有黑客都要做的只是进入ring0以避免通过任何标准方法进行检测时。我建议使用类似Warden的方法(可以随时更新的可下载模块)与内核模式驱动程序相结合,该驱动程序挂钩所有Windows API函数并监视它们“不适当”的调用。但请注意,您将遇到很多误报,因此您不需要将禁止系统基于自动数据。在禁止之前,请始终以人为本。

答案 3 :(得分:2)

在应用程序中监听键盘和鼠标输入的常用方法是使用SetWindowsHookEx设置Windows挂钩。 供应商通常会在安装过程中尝试保护他们的软件,这样黑客就不会自动化并破解/查找应用程序的序列号。 谷歌这个术语:“关键记录器”...... 这是一个article,它描述了防止它的问题和方法。

答案 4 :(得分:1)

我对PunkBuster和这样的软件如何运作没有更深入的了解,但这是我的方式:

Iintercept调用处理内存的API函数,如 ReadProcessMemory WriteProcessMemory 等。

您将检测您的进程是否涉及呼叫,记录并将呼叫蹦到原始功能。

这也适用于屏幕截图,但您可能想截取BitBlt函数。

这是关于函数拦截的基本教程: Intercepting System API Calls

答案 5 :(得分:0)

您应该查看Punkbuster,Valve Anti-Cheat以及其他一些反作弊的内容。

编辑:我的意思是,查看 他们是如何做到的;他们如何发现这些东西。

答案 6 :(得分:0)

我不知道技术细节,但Intenet国际象棋俱乐部的BlitzIn计划似乎已经集成了程序切换检测功能。这当然是为了检测一边运行国际象棋引擎并且不直接适用于你的情况的人,但是你可以将apporach推断为类似于如果进程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)?

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