有什么方法可以防止或减less在线多人游戏中的作弊行为?

Punkbuster的存在只是为了防止作弊,而欺骗在punkbuster的游戏中是常见的。 现代Warefare 2被严重locking在最终用户运行自己的服务器或制作任何MODS,作弊不断发生。

对于每个客户端在PC上运行的多人游戏,可以做些什么来减less或消除作弊?

这取决于他们是如何作弊,专注于创建作弊的主要方式之一,其他进程locking到您的应用程序并修改它 – 您可以枚举所有其他进程,并钩住他们的内存操作方法,他们的键盘/鼠标仿真方法。

Wallhacks通常是通过在你的进程和DirectX / GL库之间注入代码来设置材料的透明度,以便能够看到它们。 你可以添加一些代码到你的scenegraph / culling系统中,如果他们在墙后面(以防止这种方式的作弊),特别不会画出其他玩家/有用的实体。

如果你要去多人游戏,并希望阻止客户端/服务器之间的数据包被修改,那么通过你自己的某种algorithm创建一个你正在发送的数据的校验和,并检查这个数据是否有效。 (无论如何,为了各种质量保证的目的,您最终可能会这样做)。

对于大部分内存资源也是如此,在一帧开始时创建一个校验和,并且在各个阶段进行validation可以在一些非常方便的内存操作检测中产生。

这是一个非常相关的话题,但是希望这会让你有一个模糊的方向。

在最极端的解决scheme,你基本上不信任客户端。 对于像MMO这样的游戏,用户不会运行他们的服务器,任何游戏逻辑都是在服务器端处理的。 切勿给客户说“我有X健康”或“我有X弹药”等的权限。

如果你有一个系统的逻辑是昂贵的,必须在客户端上完成,以节省服务器周期,你可以实现一个概率性的作弊检测系统。 每隔几分钟它就会select一个不同的less数玩家仔细检查和一致性检查服务器。 由于作弊者很less限制他们的作弊行为,所以他们最终被抓获。

另一个好处是,他们不会有快速的周转时间 – 如果服务器平均需要10个小时的游戏时间来关注你,那么每次你想看到的时间是10个小时的周转周期如果有用的话。 而且如果它确实起作用了,甚至会更长,因为他们不知道服务器是否给了他们一个大拇指,或者没有得到他们的帮助。

第一人称射击游戏也有很多types的瞄准辅助攻击,这些射击游戏也是通过挂接graphics库调用来实现的。 OGC反恐精英钩/ HL1除了让墙透明之外还有很多select。

如果敌人的位置信息在某个点被传递到了一个具有广泛可用代码的较低级别的库,那么这些调用可以被钩住,并且位置,比例,旋转等数据可以被用来精确地计算用于触发的最佳向量对那个敌人。 像PunkBuster这样的反作弊系统通常包括启发式检测(除了记忆和过程监控之外,这个玩家多久会获得一个完美的镜头,他们多久会绕180度旋转才能进行一次性杀死等等)。

最终防止多人游戏中作弊的任务是猫捉老鼠游戏。 随着新的作弊技术的发展,新的反作弊方法被创造出来,然后新的作弊被建立起来,以避免新的反作弊技术。

正如Tetrad在回应中所说,“游戏安全”的唯一硬性规定是尽可能less地向客户提供信息,尽可能less地信任客户。 不同types的游戏会有不同的要求,可能会影响你遵守这些规则的程度。

在FPS游戏中,由于游戏速度如此之快,通常不可能仅为客户提供应该知道的确切时刻的数据。 如果你不告诉客户角落里有一个敌人,那么玩家就会绕过这个角落,突然间你必须在几毫秒之内把这些信息发给他们,否则就有可能被一名敌人杀死永远看不到。

对于目前可用的这些问题唯一的“修复”可能是OnLive。 由于该服务只传送来自在数据中心安全运行的客户端的audio和video内容,所以作弊的唯一方法是从本质上创建一个人工智能,以分析传入的videostream,并据此采取行动 – 如果有的话,骗子是最多的。

以上所有的答案都很好,但是我会再添加一个:

有些游戏具有非常稳定的重放function,可以在游戏结束后以紧凑的格式保存每个游戏的重放,并以各种方式观看 – 不同的玩家视角,实时统计界面等等。

我非常熟悉的例子:星际争霸2.暴雪阻止黑客的方式之一是通过作为游戏回放接受作弊证据。

在FPS中使用的一个例子是:如果你玩过一个游戏,而你怀疑另一个人是用黑客入侵作弊的,那么你可以观看重播,然后在他正常的重播视野中看到,他不可能有看到你,把手榴弹扔到角落里,或者其他什么。

然后你重新报告他,如果反对他的证据足够好,他就被禁止了。 据我所知,做这件事情的公司只有拿到严肃的证据,或者在取缔之前就有同样行为的多重证据来源。

所以这不是一个反debugging技术,它是一个用户报告系统,它允许方便的人工辅助作弊certificate。

这可能不是一个完整的答案,但我在这里有一些input。 防止作弊的最好方法之一是混淆或使用C / C ++。 这可以防止人们修改客户端代码。