安全的非网页游戏在线高分榜

时间:2020-03-05 18:42:48  来源:igfitidea点击:

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

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

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

解决方案

回答

老实说,我认为这是不可能的。

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

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

回答

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

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

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

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

回答

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

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

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

回答

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

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

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

回答

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

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

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

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

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

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

  • 比方说分数是m
  • 计算某种对分数的检查(例如CRC或者我们看到的任何其他系统。实际上,如果我们只是发明一个,不管多么me脚,它都会更好地工作)
  • 从远程服务器(显然是通过安全连接)获取用户(D)的私钥。我们是唯一知道此键的人。
  • 计算X = m ^ D mod n(n是公用/专用密钥算法的公用模块)(即,将其加密:P)

如我们所见,这只是另一种混淆。我们可以按照自己的意愿进行下去。例如,我们可以查找最接近X的两个质数,并使用它们对CRC进行加密,并将其也发送到服务器,以便分别使用不同的加密方案来获得CRC和分数。

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

最后一点

NET的混淆器

用于Delphi / C ++的混淆器

汇编器混淆器(x86)

回答

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

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

回答

@马丁

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

回答

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

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

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

回答

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

在一般情况下,主要是修改内存中的变量,因此无法检测到各种攻击。如果我们不信任自己程序的变量,那么我们将无法真正取得很大成就。

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

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