Android板式网络多人游戏反作弊

时间:2013-04-02 09:04:03

标签: android networking client-server multiplayer anti-cheat

TL; DR

  • android,类似棋子的游戏。
  • 延迟不重要。
  • 客户端 - 服务器通过LAN / Global,潜在的高分=>不信任。
  • 未来潜在的蓝牙层=>完全信任。
  • 移动意味着昂贵的流量,上游比下游贵。
  • PRNG使用了很多,必须是确定性的。
  • 用于序列化+传输的kryonet

我&几个好朋友正在构建我们的"端口" /"味道"一个棋盘游戏(具有许多不同的事件类型和各种排列)到Android并添加网络多玩家方面。我们不是加密或网络专家=)

游戏:默认的多人游戏层将基于客户端 - 服务器(服务器是专用主机或在Android设备上运行[以防你和你的朋友和你的朋友一起出现在树林里)没有网络] )。这可能是全局服务器或LAN - 它并不重要。 但可能存在潜在的高分,需要一些反作弊机制 由于它是一种基于回合制的类似于棋盘的游戏,延迟既不是问题。

将来,如果我们有时间 - 我们可能会添加一个基于蓝牙的图层,但在这种情况下,作弊不是问题,因为假设人们彼此了解得很好。

由于我们正在处理上游比下游更昂贵的(最有可能)移动网络,因此从服务器下载比从客户端发送模型便宜。

我们可能会使用kryonet进行序列化和数据传输。

游戏将经常使用PRNG,因此它需要有一些良好的反作弊和验证逻辑,因此经过大量的搜索和阅读gamedev&堆栈溢出,我设计了以下逻辑。我需要一些关于计划的声音的输入。非常感谢所有提示和建议。

假设/考虑因素:

  • PRNG确定性地行事(考虑使用Mersenne Twister)。
  • 由于反作弊措施,正常的游戏不应该受到惩罚。

计划/计划:

  1. On"握手" / first" onResume()" - 从服务器获取PRNG种子并存储它。每个玩家在服务器中都有自己的种子。

    1. 同样在同一请求中将游戏状态的哈希值发送给服务器,如果不同步,  同步游戏状态。
  2. 在操作/用户输入上,获取下一个随机数 - >保存到" randoms" (因此称为存储桶 - 存储桶是一个"陷阱列表"您可以添加但不会删除它。)还将输入ID /类型/枚举保存到列表中。

  3. 累积变化,直到其他玩家必须知道(即下一位玩家转身)/ PNR(不归点)

  4. 达到PNR

    1. 发送模型的更改ID /类型/枚举(约64位)+桶+哈希(更改后)。应该对bucket + hash进行加密,也许AES 256(其他加密技术更适合?)。

    2. 根据N个连续随机数检查桶,其中N =大小(桶)。如果不匹配,请转到6,然后是7。

    3. 暂时更改模型(不提交完整的游戏模型)。

    4. 计算哈希值并检查客户端提供的哈希值。如果无效转到6。

    5. 有效:在服务器上提交游戏模型。

    6. 无效:要求客户端恢复为服务器发回的状态。

    7. 作弊:禁止(不是IP [动态IP ...],而是MAC地址或UID)/从游戏中移除几个作弊。


  5. 编辑:另外 - 关于反作弊的另一个问题......对于2个农业高分榜的机器人团队来说,对于类似棋盘游戏的反制措施有什么好的想法吗?

    EDIT2:以下是我所做的前问题研究的链接:

    查看:

    5)在游戏连接上使用一些轻量级多态编码。

    6)使用一些反调试技术来防止调试器附加到您的进程。谷歌反调试,你应该能找到很多东西。

    7)使用自定义专有的PE打包器来防止对游戏进行有用的反汇编。

    8)使用哈希作为承诺,然后在满足其他玩家行为的条件后揭示哈希承诺的含义。     它很复杂,而且会影响性​​能,但有些想法可能会有用,特别是对等游戏。

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

    与实时FPS相关,与我们的相关性较低:

    关于它,希望您有一些提示!

0 个答案:

没有答案