我正在进行多人游戏,我需要验证玩家不是速度黑客

时间:2010-12-15 20:20:24

标签: network-programming

出于安全考虑,我觉得应该在服务器端进行测试。尽管如此,这对服务器来说是相当沉重的,对吧?鉴于玩家佩戴的装备和buff会有更高的移动速度,因此每次移动时我都需要计算新的常数,看看他们的动作是否合法(使用TCP所以不必担心丢失,无序数据包)。我意识到我可以只保存最后的移动速度,只有在他们改变影响速度的东西时才重新计算它,但即便如此,那也是另一种检查。

我的另一个想法是服务器随机选择客户端发送数据并验证它并为每个客户端提供信任评级。足够低的信任评级意味着将检查来自客户端的每条消息,并且将以更详细的方式记录它们的所有操作。然后我会通过检查日志知道他们是黑客,并且可以禁止/暂停它们以及撤消它们可能通过黑客传播的任何好处。

感谢您的任何建议,谢谢。

编辑:我刚刚意识到,黑客也可以在非常高的连续性中发送微小的动作(在常规速度范围内)。每个单独的运动本身就是精英,但累积的影响将是速度黑客。有什么方法可以解决这个问题?

4 个答案:

答案 0 :(得分:6)

处理此问题的标准方法是让服务器计算所有移动。客户端应该发送给服务器的唯一事情是命令,例如“向左移动”然后服务器应该计算玩家移动的速度等,然后最终将更新的位置发送回客户端。

如果你在客户端留下任何计算,很可能迟早会有人找到作弊的方法。

答案 1 :(得分:3)

  

[...]测试应该在服务器端完成。尽管如此,这对服务器来说是相当沉重的,对吧?

不。这是做到这一点的方法。这是唯一的方法。所有关于检查信任或其他任何内容的讨论本身都存在缺陷。

如果你让玩家发送职位:

  • 检查某人声称他们的位置。
  • 将它与不久之前的位置进行比较。允许一点点偏差来解决网络滞后问题。
  • 如果他们移动太快,请将它们重新定位在更合理的位置。小错误可能是由于长时间滞后造成的,因此客户应使用插值来消除这些修正。
  • 如果他们移动得太快,请断开连接。并检查代码中的错误。
  • 不要忘记长距离处理合法的遍历,例如。传送点。

答案 2 :(得分:2)

解决这个问题的方法是所有操作都在服务器上完成。永远不要相信来自客户的任何信息。如果有人真正玩你的游戏,有人会对与服务器的通信进行反向工程,并弄清楚如何利用它。

您无法指定随机信任评级,因为谨慎的作弊者只有在真正需要时才会作弊。这给他们带来了相当大的优势,被发现作弊的可能性很小。

而且,是的,这意味着您无法使用低级服务器,但实际上没有其他方法可以阻止客户端作弊。

答案 3 :(得分:1)

如果您使用可以访问Windows API函数调用的语言进行开发,我从自己的速度黑客研究中发现,您可以通过调用两个函数并比较结果来轻松识别速度黑客。

TimeGetTime

和...

GetTickCount

这两个函数都将返回自系统启动以来的秒数。但是,TimeGetTime比GetTickCount准确得多,而TimeGetTime准确度高达〜1ms而不是GetTickCount,准确度约为50ms

即使这两个函数之间有一个小的延迟,如果你打开一个速度黑客应用程序(选择你的毒药),你应该看到两个结果集之间有很大的差异,有时候甚至长达几秒钟。差异非常明显。

编写一个简单的应用程序,在没有运行速度黑客应用程序的情况下返回GetTickCountTimeGetTime结果,并使其保持运行状态。比较结果并显示差异 - 您应该看到两者之间的差异非常小。然后,在应用程序仍在运行的情况下,打开速度黑客应用程序,您将看到两个结果集中的巨大差异。

诀窍在于确定构成可疑活动的阈值。