关于加密:保护非网络游戏的在线高分榜

关于加密:保护非网络游戏的在线高分榜

Secure Online Highscore Lists for Non-Web Games

我正在玩我正在编写的本机(非网络)单人游戏,但我发现拥有每日/每周/全天候在线高分榜(例如Xbox Live排行榜)将使该游戏成为现实 更有趣的是,增加了一些(少量)社区和竞争。 但是,恐怕人们会看到诸如黑客邀请之类的功能,由于分数过高而使常规玩家望而却步。

我想到了防止此类尝试的明显方法(例如,公钥/私钥加密),但是我已经找到了合理的简单方法,黑客可以绕开我的所有想法(从二进制文件中提取公钥,然后发送伪造的加密文件 分数)。

您是否实施过在线高分榜或排行榜? 您是否找到实现此目的的合理的防黑客方式? 如果是这样,您是如何做到的? 您对骇客入侵有什么经验?


归根结底,您要依靠信任客户。如果客户端将重播发送到服务器,则很容易复制或修改成功的播放并将其发送到服务器。

最好的选择是提高作弊标准,超越球员认为值得超越的标准。为此,可以使用许多行之有效的(但经常未提及)的技术:

  • 将列入黑名单的作弊者放在蜜罐中。他们可以看到自己的分数,但是没有其他人可以看到。除非他们通过使用其他帐户登录进行验证,否则他们认为他们已经成功入侵了您的游戏。
  • 当某人被标记为作弊者时,请不要将任何帐户影响转移到将来的某个特定点。在1-3天内随机分配这一点。通常,作弊者会尝试多种方法并最终成功。通过将帐户状态反馈推迟到以后,他们无法理解导致他们陷入困境的原因。
  • 捕获所有游戏用户命令,并将其发送到服务器。根据给定增量内的其他分数来验证它们。例如,如果玩家使用射击动作200次,但获得200,000分,但游戏中的相邻玩家射击5,000次以获得210,000分,则可能会触发一个阈值,该阈值将人标记为进一步或人类调查。
  • 为您的用户帐户增加价值和持久性。如果您的用户帐户具有游戏的可解锁功能,或者您的游戏需要购买,则禁令的权重更大,因为用户无法通过基于Web的代理简单地创建新帐户来重新获得其先前的帐户状态。

  • 当游戏在用户控制下的系统上运行时,没有任何解决方案会是完美的,但是您可以采取一些步骤来增加对系统的黑客攻击。最后,目标只能是使系统遭受更多的麻烦而不是值得的。

    • 发送一些带有高分请求的其他信息,以验证服务器端。如果您每X获得5分,并且游戏仅包含10 X,那么您将获得一些额外的收益,使黑客能够跳过以使其分数被接受为有效。
    • 让服务器发送随机挑战,必须从该偏移量中获取游戏二进制文件的几个字节。这意味着黑客必须保留二进制的原始副本(只是麻烦一点)。
    • 如果您具有许可证密钥,则要求很高的分数才能将其包括在内,这样就可以禁止被黑客入侵系统的人。这也使您可以跟踪如上定义的无效尝试,以禁止人们在提交有效分数之前就对协议进行测试。

    总而言之,要使游戏足够流行以使人们能够关心它,这可能是一个更大的挑战。


    老实说,我认为不可能。

    在使用非常简单的带有加密二进制文件的密钥加密之前,我已经做到了这一点,对于我需要的安全性来说,它已经足够好了,但老实说,如果有人认为破解您的在线高分表会被黑客破解。

    那里有一些很伤心的人,他们碰巧也很聪明,除非你能把他们全都放在这是一个失败的原因。


    如果您的游戏内置了重播系统,则可以将重播提交到服务器,并让服务器从重播中计算分数。

    这种方法并不完美,您仍然可以通过放慢游戏速度(如果它是基于动作的)或编写机器人来作弊。


    我在Flash游戏中一直在做这些事情,这确实是一场失败的战斗。特别是对于无需过多努力即可将其反编译为可读代码的ActionScript。

    我这样做的方式是一种比较传统的方法,即以纯文本形式发送得分和玩家名称,然后将两者的哈希值发送(适当加盐)。很少有人有足够的决心去努力解决这个问题,而很少有人愿意这样做,而您一直都在否定它。

    总而言之,我的理念是花时间使游戏变得更好,并且使其难以欺骗。

    可能非常有效的一件事是,让游戏在您玩游戏时多次将分数提交到服务器,每次发送一点游戏信息,从而使您可以验证分数是否"真实"。但这确实有点过头了。


    这是一个非常棘手的问题。

    我从未实现过这种东西,但是这里有一个简单的替代方法。

    您最主要的担心是由于黑客猜测您的应用程序正在做什么,然后发送自己的结果。

    好吧,首先,除非您的应用程序取得了巨大的成功,否则我不会担心。这样做非常困难。

    加密不会解决问题。您会看到,加密有助于按途保护数据,但在加密数据之前(这可能是主要漏洞所在),它并不能保护事务的任何一方。因此,如果您对密钥进行加密,则数据将保持私有,但并不安全。

    如果您真的对此感到担心,我建议您以一种不太明显的方式来混淆代码并设计评分系统。在这里,我们可以从加密协议中借用一些东西。这是一个例子:

  • 比方说分数是m
  • 计算某种对分数的检查(例如CRC或您看到的任何其他系统。实际上,如果您只发明一种,无论多么la脚,它都会更好地工作)
  • 从远程服务器(显然是通过安全连接)获取用户(D)的私钥。您是唯一知道此键的人。
  • 计算X = m ^ D mod n(n是您的公用/专用密钥算法的公用模块)(即,将其加密:P)
  • 如您所见,这只是另一种混淆。您可以根据需要随意走下去。例如,您可以查找最接近X的两个质数,并使用它们对CRC进行加密,并将其也发送到服务器,以便分别使用不同的加密方案来获得CRC和得分。

    如果您将其与混淆结合使用,我会说很难破解。尽管如此,即使这种情况可能会被逆转,这完全取决于黑客的兴趣和能力,但是……严重的是,什么样的怪胎需要花费大量的精力才能改变游戏的结果? (除非是魔兽世界之类的)

    最后一点

    NET的混淆器

    Delphi / C ++的混淆器

    汇编器混淆器(x86)


    您不能在不受信任的客户端平台上执行此操作。实际上,甚至有可能击败某些"受信任"的平台。

    在一般情况下,有多种无法检测的攻击-主要是修改内存中的变量。如果您不信任自己程序的变量,那么您将无法真正实现很大目标。

    上面概述的其他技术可能有所帮助,但不能解决在不受信任的平台上运行的基本问题。

    出于兴趣,您确定人们会尝试破解高分表吗?我在网上玩了两年多的比赛,其中有一个琐碎的克拉克贝高分桌。很多人演奏过它,但我没有证据表明有人试图破解高分。


    @马丁

    我相信这就是Mario Kart Wii运作的方式。额外的好处是您可以让所有其他玩家观看高分持有者如何获得高分。有趣的是,如果您查看最快的"火山爆发"时间踪迹,您会发现有人找到了一条捷径,可以让您跳过95%的轨道。我不确定他们是否仍将其作为最快的时间。


    就像另一个答案所说的那样,您被迫信任一个潜在的恶意客户端,简单的威慑力加上一点点人工监控就足以构成一个小游戏。

    如果您想花哨的话,则必须在分数数据中查找欺诈行为,这种欺诈行为与信用卡公司查看费用数据相同。客户端与服务器通信的状态越多,通过代码查找正确或错误行为模式的可能性就越大。例如。假设客户必须上传基于时间的比分审核日志(也许您也可以使用该日志来让其他客户观看热门游戏),然后服务器可以验证比分日志是否违反了任何游戏规则。

    最后,这仍然是使其昂贵到足以阻止欺骗计分板。您需要一个始终可以改进(更易于更新)服务器代码以应对验证系统上任何新攻击的系统。


    通常,防止欺诈和黑客入侵的最大防御者是社区监视。如果分数看起来相当可疑,则用户可以报告分数以作弊。如果有足够多的人报告该分数,则管理员可以检查重播的有效性。如果已经有很多玩家完全合法地玩游戏,那么很容易看出机器人与实际玩家之间的区别。

    管理员只能监督那些受到质疑的分数,因为一小部分用户可能会大肆删除一个辛苦赚来的分数。管理员只需查看确实得到报告的一些分数,就可以节省很多时间,甚至对于小型游戏来说也更少。

    即使只是知道如果您努力制作一个机器人,而被报表系统再次击倒,这本身也是一种威慑力。

    甚至加密重放数据也不会受到损害。重播数据通常很小,并且对其进行加密不会占用太多空间。为了改善这一点,服务器本身将尝试通过控制日志重播,并确保它与所获得的分数相匹配。

    如果有一些反作弊系统找不到的东西,用户会找到的。


    推荐阅读