自动化多人游戏中的坑洼,玩家可以使用自己的算法

Ola*_*oja 5 c++ java security networking multiplayer

关于标签

我将其标记为Java C ++问题。这意味着我不是在寻找特定于语言的答案。我只标记了C ++和Java,因为我精通它们,并且如果用这些(或类似)语言编写代码示例,则很可能会理解您的代码示例。

我在找什么

指针洞察力安全性措施,发展软件时,主要是我应该考虑到游戏,如描述的下方。安全是指检查并再次检查用户是否采取了非故意的行为。这可能意味着一些行为,例如将他/她存在的最新恶意病毒更新集发送到服务器/其他客户端,或者通过黑客攻击等方式损害其他玩家的用户体验。


预期的评论和答案

您是否在问如何阻止人们入侵您的游戏?

这是以任何方式,我的问题,因为它的方式过于广泛,这个线程。但是,如果您确实找到了一种简单的方法(通过作弊)来赢得每场比赛,请告诉我。

这个问题更适合X

我已经在CodeReview和程序员中提出了这个问题。在这两个网络中,该职位均受到好评。为了公平起见,这里也很不受欢迎(请参阅ADTC的评论),因此赏金很高。悬赏后,我重写了这篇文章,以更好地满足SO的标准。但是,如果您仍然认为此帖子不太适合此处,请告诉我原因。我很难确定这是否真的更适合SO或Programmers,所以不要以为这只是我一秒钟不考虑之后在这里发布的转储。

要在两台计算机之间创建连接,应使用套接字。去谷歌上查询。

我不是在寻找这种技术帮助。我知道如何实现该软件,这不是我第一次这样做。请看看我问的实际问题。


我为什么要问这个?

有问题的软件

我正在开发类似蛇的多人游戏,玩家可以使用自己的算法来确定蛇的下一步行动。播放器通过客户端-服务器连接彼此连接,即,一个播放器将充当主机。您可以假设服务器代码将等到所有玩家轮到自己,直到更新所有客户端之间的游戏状态为止。

关于游戏

我的游戏在文件夹中搜索任何兼容的.jar文件,这些文件的主类扩展了特定的抽象类。然后,玩家可以通过直接连接到其他玩家或通过在大厅搜索游戏来通过网络连接到其他玩家。

在玩游戏时,每个玩家将使用自己的算法来确定其蛇的下一步动作。每个游戏的持续时间可能会有所不同,具体取决于为游戏指定的更新速率,但是大多数情况下它们的速度很快,并且很可能会在不到30秒的时间内结束。

我还没有实现实际的网络多人游戏。


逻辑的模板源文件如下:

package template

import snake.*;

public class TemplateLogic extends SnakeLogic {

    @Override
    public void onLaunch() {
    }

    @Override
    public String getMove() {
        return "UP";
    }

}
Run Code Online (Sandbox Code Playgroud)

因此,从主机播放器的角度来看,我打算做的是以String格式(“上”,“下”,“左”,“右”)通过网络获取播放器的下一个动作,因此在这方面不会有任何安全问题。每个客户用来确定其下一步行动的实际程序只能在相应客户的计算机上运行。

我希望你到目前为止一直在关注我。无论如何,我现在担心的是我可能忽略的任何其他坑洼。确定所有这些坑洼可能是一件繁琐的工作,因此,我主要不会问这个。我对这件事的见解是我所期望的。理想情况下,我可以从不同的人的多个答案中得到更大的了解。

浮现在其他问题之上的问题是,我可以阻止任何客户端在其程序上使用会损害其他播放器用户体验的方法吗?例如,这样的方法Thread.sleep():如果玩家让他的算法在每次移动之间等待10分钟,那将很烦人。对于这个特殊的问题,我认为应该为每个动作设置一个时间限制,在此之后,落后的/恶意的玩家将被踢出或被分配一个默认的动作,以便游戏可以正常继续。


音符:

@Darinth的回答让我想起了游戏的一个非常重要的方面:允许用户输入,这意味着蛇的下一步可以由人类玩家决定-也就是说,可以使用键盘正常玩游戏。此外,没有任何限制会限制您在纯AI和仅键盘解决方案之间进行选择:您可以将它们混合在一起,例如,自己控制蛇,并在发现自己将自己陷入陷阱时让AI接管。


总结一下

我忽略了大事吗?我已经计划将这作为我和我的朋友一起度过的一个小项目,与他们共度时光,但是我有点发烧友。

无论您的想法有多小,请不要犹豫。如果您想到更多的兴趣点,以后可以编辑答案以更全面。我会定期检查所有答案以进行修改。

感谢您的时间。


我从答案中或自己获得的相关想法

  • 每一步之后,将游戏状态的哈希值与所有客户端进行比较。除具有相同哈希值的所有玩家外,所有其他玩家都将被踢出,并具有将主机保留在游戏中的最低要求(如果有4位玩家,其中2位玩家拥有一个哈希,其他2位玩家拥有另一个哈希,不包含主持人的组将被踢出,依此类推)。我想出了这个,但是要感谢@ToYono,所以功劳归功于他。

  • 在游戏开始之前,比较每个玩家的校验和。与主机的校验和不同的所有玩家将被踢(或什至不允许进入游戏)。归功于@ToYono。

  • 随机化任何排名匹配。阻止有效使用从同一台计算机使用多个连接来玩同一游戏。如果一个玩家在一个游戏中玩多条蛇,他可能会拥有一种试图合法地玩游戏的算法,而两种算法只是在破坏另一名玩家。归功于@Surt。

  • 允许用户输入。从一开始就将其设计为游戏的一部分,但我忘了提及它。感谢@Darinth提出了可能性,因此使我想起了这一重要方面。

Sur*_*urt 3

如果一个玩家可以作弊,那么有些玩家就会作弊。那么最容易作弊的方法有哪些呢?

1)改变游戏状态,有效撤销之前的动作。

  • 所有其他玩家和/或服务器应该验证更新,因为它是谨慎的值,您处理它应该不是问题。客户端检查可能就足够了,但是敏锐的黑客可以通过将检查更改为类似的内容来破解检查

    bool allowedMove() { 返回 true; ...此处保留原始检查代码}

那么必须通过代码 SHA3 的校验和来抵消哪个?MD5 的安全时代即将结束。

示例:WoW teleport hack,x,y,z 在客户端计算并发送到主机。

  • 作弊者侵入客户以获得想要的结果。
  • Bliz 在客户端上进行校验和。
  • 作弊者只是插入一个新的网络包,其中包含 x、y、z 来传送到他们想要的地方。
  • Bliz 检查执行此操作的外部程序。
  • 作弊者随机化他们的外部程序。
  • Bliz 通过服务器端距离检查进行反击。
  • 作弊者反击,将传送限制在允许的距离内,结果人们在空中行走而没有飞行。
  • Bliz 进行了进一步的服务器端健全性检查,显然解决了大部分问题。

2)非人性的反应速度,有效消除人为延迟。在你的游戏中这不是问题,除非速度更快可以提供更多的动作,但这是在程序之间,所以......它们可能总是比人类更快。

  • 如果反应时间通常比人类快,则另一端可能是作弊者。回复和 ping 时间的差异不够大。

3)自动瞄准确保非人性的高命中率。

  • 该玩家的命中率比第二好的人类玩家要高得多。

示例:射击游戏 XXX

  • 外部程序捕获玩家坐标并通过 Windows API 将修正后的目标反馈给游戏。

4) 使用其他外部帮助程序

  • 比其他玩家更好的人工智能

示例:在线国际象棋游戏,作弊者使用国际象棋程序来帮助走棋。

  • 您的玩家可以编写一个程序来保存游戏状态,并使外部程序处理数据并进行下一步,然后由作弊程序加载并作为下一步发送。
  • 检查程序中的任何负载,玩家可能希望进行保存来分析其程序的有效性。
  • 使用优化的多芯片多线程矢量化算法,作弊者可以探索大多数或所有游戏状态。
  • 几乎不可能检查外部程序是否有帮助,您可以检查外部 Windows 事件生成,但会有很多误报。您可以尝试阻止任何加载/保存作弊行为,但作弊者可以在 IP 级别进行攻击。
  • 最大的保护是,实现这一目标的努力可能超过任何收益。

5) 多方拳击,有些玩家可能有多台电脑合作取胜

  • 使用多台计算机或程序实例可以增加作弊者主实例获胜的机会,因为其他实例会破坏其他玩家。

示例:可能发生在射击游戏中吗?

  • 作弊者派遣诱饵或压制单位吸引火力或阻碍敌人移动,而真实玩家则射击对方玩家或以其他方式得分。
  • 很难检查,因为 2 个人可以在同一地点合法地玩游戏。
  • 如果多个玩家的计算机 MAC 地址相同,则可能表明存在作弊行为,因为他们将在同一台 PC 上进行游戏。但即使这样也不可能是作弊者,因为他们可能是在封闭的虚拟机上玩游戏。

6)预先计算所有游戏状态,以便作弊者可以使用最优策略。

  • 不这样做的玩家将会选择次优的起始动作。

示例:井字游戏

  • 可以计算所有游戏状态。(你可以在头脑中做井字游戏)。
  • 对玩家进行评分应该会有所帮助,但作弊者仍然可以轻松获胜。
  • 例如,预编译打开序列通常用于国际象棋程序。
  • 解决这个问题的唯一方法是非常随机的地图和起始位置,其状态如此之大以至于无法预先计算。

7)创造新的身份来击败收视率。

  • 作弊者因获胜而兴奋,他们会以低评级为自己创造新的“玩家”,以再次“获胜”。
  • 即使玩家不作弊,这种情况也会发生,他们会创建新的身份,这样他们就可以击败容易的受害者。

8) 赢得交易

  • 2 个作弊者互相交易胜利

示例:魔兽世界战场

  • 使用外部程序来增加找到合适对手的机会。
  • 如果未与正确的对手配对,请断开连接以避免其注册。即使没有作弊,断开连接也经常发生(如果你想减少这种情况,请不要玩无线或手机)。

  • 检测 2 个 Mac 地址是否以不同的身份进行多次比赛,并且每台 Mac 上只有一个获胜。

9) 失败时请断开连接。

X)未知的未知(相对于已知的已知、未知的已知、已知的未知)

  • 总是有人发明一些我们没有想到的新作弊方法。

示例:逃税

  • 总是存在漏洞、漏报或虚假收入报告、欺诈性的新扣除等。

  • 幸运的是,总有一种方法可以找出某人是否作弊到最高位置,您可以检查他们提交给程序的算法并查看其作弊情况。请注意,您将检索到的程序可能是假的,但测试它是否可以赢得这么多可能是微不足道的。

  • 聪明的作弊者会保持在雷达之下。