防止自动化
我们的下一个项目应该是为希望将奖品赠送给最佳玩家的客户提供基于MS Windows的游戏(用C#编写,带有winform GUI和集成的DirectX显示控件)。这个项目计划运行几年,包括锦标赛,阶梯赛,锦标赛,玩家对玩家的动作等等。
这里最主要的担忧之一就是作弊,因为如果玩家能够(例如)让定制的bot为他玩游戏(从策略决定上而不是在玩多个小时上),他将获得巨大收益。
所以我的问题是:检测机器人活动必须具备哪些技术可能性?我们当然可以跟踪所玩的小时数,分析策略以检测异常等,但是就这个问题而言,我对了解诸如此类的详细信息会更感兴趣。
- 如何检测其他应用程序是否进行定期截图?
- 如何检测另一个应用程序是否扫描了我们的进程内存?
- 有什么好的方法来确定用户输入(鼠标移动,键盘输入)是否是人工生成的,而不是自动生成的?
- 是否有可能检测到另一个应用程序是否请求有关我们应用程序中控件的信息(控件的位置等)?
- 作弊者还可以通过哪些其他方式收集有关当前游戏状态的信息,将其提供给机器人,并将确定的动作发送回客户端?
非常感谢反馈!
解决方案
我们应该研究Punkbuster,Valve Anti-Cheat和一些其他防作弊的内容,以获取一些指针。
编辑:我的意思是,调查他们是如何做到的;他们如何发现这些东西。
只是一个想法,如果"骗子"在虚拟机(例如vmware)中运行软件并制作该窗口的屏幕快照,该怎么办?我怀疑你能为之辩护。
我们显然无法抵御"模拟差距",例如作弊者的系统使用高品质的摄像头制作外部屏幕截图,我想这只是一个理论问题。
也许我们应该调查国际象棋场所。国际象棋有很多钱,他们不喜欢机器人,也许他们已经提出了解决方案。
我不知道具体的技术细节,但是Intenet Chess Club的BlitzIn程序似乎集成了程序切换检测功能。当然,这是为了检测在侧面运行象棋引擎的人,而不是直接适用于情况,但是我们可以将方法推断为类似以下情况:如果下一个Y周期中进程X占用的CPU时间超过Z%,一个正在运行的机器人。
作为竞赛规则的一部分,除了"我们在玩游戏时不得运行其他任何东西以符合获得奖品的资格"之外,这可能还会奏效。
此外,严厉的"我们可能会出于任何原因在任何时候决定使用机器人并取消资格"的规则也有助于上述启发式方法(用于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)?
我认为让破解者更难解决的一个好方法是在服务器中拥有游戏状态的唯一权威副本,仅向客户端发送和接收更新,这样我们就可以嵌入通信协议本身中进行客户端验证(尚未破解,因此检测规则仍然存在)。这样,并积极监视发现的新怪异行为,可能会使我们接近想要的位置。
防止自动化的最佳方法是不要执行需要磨削的任务。
话虽如此,检测自动化的最佳方法是积极吸引用户并需要定期进行类似于CAPTCHA的测试(除非没有图像等)。我建议利用包含数千个简单的一次性问题的数据库,这些数据库每隔一段时间就会摆在用户面前。
但是,根据问题,我想我们最好的选择是不要在C#中实现反自动化功能。我们几乎没有机会从托管代码中检测到编写良好的hack / bot,尤其是当黑客要做的只是进入ring0以避免通过任何标准方法进行检测时,就没有什么机会了。我建议使用类似Warden的方法(可随时下载可下载的模块),并结合一个可挂接所有Windows API函数并监视它们的"不适当"调用的内核模式驱动程序。但是请注意,我们将遇到许多误报,因此我们无需将禁止系统基于自动数据。禁止之前,请务必对其进行人工检查。
我对PunkBuster和这种软件战争的工作方式没有更深入的了解,但这就是我要走的路:
Iintercept调用用于处理诸如ReadProcessMemory,WriteProcessMemory等内存内容的API函数。
我们将检测到进程是否包含在调用中,将其记录下来,然后将调用蹦蹦床返回原始功能。
这也适用于截图,但是我们可能想要拦截BitBlt函数。
这是有关函数拦截的基本教程:
拦截系统API调用
我写了d2botnet,这是前一段时间的.net暗黑破坏神2自动化引擎,我们可以添加到要注意的事情列表中的是格式错误/无效/伪造的数据包。我认为该游戏将通过TCP进行通信。数据包嗅探和伪造通常是自动进行游戏(无论如何都是在线的)的第一种方式。我知道暴风雪会检测到格式错误的数据包,这在某种程度上让我试图远离d2botnet。
因此,请确保我们检测到无效的数据包。加密它们。哈希它们。尽力确保它们是有效的。如果我们考虑一下,如果有人可以确切地知道每个数据包来回发送的含义,他们甚至不需要运行客户端软件,这将使任何基于进程的检测成为问题。因此,我们还可以添加一些基于数据包的质询响应,工作人员必须知道该响应如何响应。
侦听应用程序中键盘和鼠标输入的常用方法是使用SetWindowsHookEx设置Windows挂钩。
供应商通常会在安装过程中尝试保护其软件,以使黑客不会自动为他们的应用程序破解序列号。
Google的术语:" Key Loggers" ...
这是一篇文章,介绍了该问题和预防此问题的方法。