【问题标题】:How can you prevent bogus high scores from appearing on a global high score list?如何防止虚假高分出现在全球高分榜上?
【发布时间】:2009-05-08 02:01:11
【问题描述】:

假设您正在设计一款记录高分的 PC 游戏。除了保持本地分数外,还设置了一个全球高分服务器,游戏可以通过互联网访问该服务器。玩家应该能够在完成游戏后立即将他们的高分提交到全球高分列表,或者稍后从他们的本地高分列表中提交。这一定是一个普遍的问题;现代游戏机上的街机游戏通常具有这样的全球高分榜。

我的问题归结为:如何防止某人提交虚假的高分? 或者,换一种说法,全球高分服务器如何确定提交的分数确实是由通关游戏?

我越想这个,我就越觉得这可能是一个无法解决的问题。

验证消息是否来自某个来源的通常做法是让该来源对消息进行数字签名。在这种情况下,您当然可以这样做,但真正的问题是玩家拥有该软件,也拥有该软件的私钥。不管它多么模糊,它都可以被逆向工程,甚至只是从记忆中提取出来。

另一种选择是将玩家游戏的回放发送到高分服务器,该服务器将快速运行回放并验证提交的分数是否与回放的结果相匹配。这并不能解决问题,但如果您还必须制作一个非常复杂的回放来“证明”它,那么它肯定会使伪造高分变得更加困难。

这是一个有解决方案的问题,还是真的无法解决?家用游戏机开发人员是否使用了一些技术来防止这种漏洞利用,或者他们只是依靠控制台来防止未经授权的代码运行?

【问题讨论】:

  • 虚假分数的存在是人们在既定规则之外玩的结果。所以,从某种意义上说,这是一个人的问题,而不是一个系统问题(或者可以在系统层面解决的问题)。

标签: security networking


【解决方案1】:

对于由客户端生成分数的 PC 游戏,这不是一个可解决的问题,因为客户端本质上是不可信的。

你唯一能做的就是让别人更难提交假分数。

一些想法:

  • 保护内存中的分数。 您可以使用CryptProtectMemory 之类的 API 将分数隐藏在内存中 - 简单的内存写入将不起作用。但是,使用附加的调试器或通过将代码注入您的进程,他们仍然可以修改分数。您可以研究各种尝试击败调试器的方案。

  • 在通往服务器的途中保护分数。 您可以按照您的建议对发送到服务的数据进行加密,但由于不受信任的一方可以控制密钥,这只是一种混淆,并不能提供可靠的保护。

  • 在服务中验证分数。 除了非常简单的检查之外,我不愿意这样做。此处的错误将导致您拒绝有效分数。将无法区分作弊者和强者。

此时,您真的需要问问自己,工程上的努力是否真的值得。如果有人发布无效分数怎么办?你实际上失去了什么?我会做最起码的事情来用一个简单的脚本来保护一个孩子。即,不要让你的分数提交只是:

http://myservice.com/submitscore.aspx?PlayerName=Michael&Score=999999999

我会在内存中使用简单的保护来防止随意窥探,在网络上进行一些简单的混淆(使用服务器 cookie 对分数进行散列)并完成。

【讨论】:

    【解决方案2】:

    据我所知,这是无法解决的。

    我见过很多人试图混淆加密密钥。我见过一些人包括其他健全性检查,例如经过的时间或剩余的敌人。我从来没有见过发送重播的,当然这是可能的。

    在一个未命名的网站中,他们设置了一个很容易找到的虚假发送高分例程。如果犯罪者使用它,他们的 IP 地址将被自动禁止未来更新。

    【讨论】:

      【解决方案3】:

      “另一种选择是发送玩家游戏的回放……这并不能解决问题,”

      真的吗?为什么不呢?

      “你还必须制作一个非常复杂的回放来“证明”[分数]。”

      你是在暗示有人可以伪造回放吗?在没有实际玩游戏的情况下推理出一个超高分的解决方案?伪造时间戳和一切?拉Donald Crowhurst

      为什么不只是玩游戏而不是试图伪造玩游戏的日志?

      或者...如果很容易伪造导致超高分的游戏历史,那么游戏可能设计错误。如果游戏是“硬”的,那么这个人必须做出所有正确的选择。如果游戏很简单,那么分数并不能反映玩家的选择,是可以伪造的。

      这样想。选择任何游戏或运动。有人说——比如说——瑞士在游艇比赛中击败了新西兰。你会通过寻找关于场地、船只、团队和个人比赛的详细信息来挑战他们,以说服自己这是真的。当然,他们可以伪造,但如果他们掌握了丰富的比赛细节,那么……那不是“证据”吗?

      【讨论】:

      • 你的观点是绝对有效的。在实践中,我只是发送回放数据并用它来验证分数。我之所以问,主要是因为我有兴趣了解其他有用的技术辅助方法来防止这种滥用。
      • 我完全不同意一个很容易创建代表游戏状态的动作序列的游戏一定是“设计错误”。以国际象棋为例。
      • @John Feminall:不是“容易创建一系列动作”而是“容易伪造导致超高分的游戏历史”如果您可以伪造超高分,那么游戏设计错误。如果你能简单地宣称胜利,那就不好了。您必须通过能够取得胜利的决定来支持这一主张。
      • @S.Lott 您的论点对于思考游戏很有意义,但对于计时游戏则不然。例如,很容易伪造吉他英雄的游戏历史以获得满分,这不会导致游戏设计错误
      【解决方案4】:

      忘记密码问题;如果您的代码可以在本地机器上被黑客入侵,您如何防止有人人为设置疯狂的高分,然后使用现有的可信机制进行传输?

      在您可以建立对代码本身的信任之前,用于通信的加密机制不会成为真正的问题。

      【讨论】:

        【解决方案5】:

        将(软件 + 随机盐)的哈希值与分数一起发送。使用服务器检查此哈希。如果匹配(意味着软件未更改)接受它。否则,分数来自游戏的“修改”版本。拒绝它。每次生成哈希时随机盐应该改变(当前系统时间或类似的时间)

        查看 Quake III Arena 源代码。他们的版本非常简单。不幸的是,我现在不记得链接了。

        【讨论】:

        • 这很容易逆转,而且根本不是万无一失的。
        猜你喜欢
        • 2021-03-03
        • 2023-04-05
        • 2018-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多