非网络游戏的安全在线高分列表

时间:2008-08-25 13:10:38

标签: encryption leaderboard

我正在玩我正在编写的本机(非网络)单人游戏,我发现每日/每周/所有在线高分榜 (想想Xbox Live Leaderboard)会让游戏变得更有趣,增加一些(小)社区和竞争。但是,我担心人们会看到这样的功能,如黑客的邀请,这会因为不可能的高分而阻碍普通玩家。

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

您是否曾实施在线高分榜或排行榜?您是否找到了合理的防黑客方式来实现此功能?如果是这样,你是怎么做到的?您对黑客攻击的经历是什么?

10 个答案:

答案 0 :(得分:39)

在一天结束时,您依靠信任客户。如果客户端将重放发送到服务器,则可以轻松地复制或修改成功的游戏并将其发送到服务器。

你最好的选择是提高作弊标准,超出玩家认为值得超越的标准。要做到这一点,您可以使用许多经过验证的(但未提及的)技术:

  1. 将黑名单作弊者留在蜜罐中。他们可以看到自己的分数,但没有其他人可以。除非他们通过使用其他帐户登录进行验证,否则他们认为他们已成功入侵您的游戏。
  2. 当某人被标记为骗子时,将任何帐户影响推迟到将来某个特定点。在一到三天内将这一点随机化。通常情况下,骗子会尝试多种方法并最终成功。通过将帐户状态反馈推迟到以后的日期,他们无法理解是什么让他们被抓住了。
  3. 捕获所有游戏用户命令并将其发送到服务器。根据给定增量内的其他分数验证它们。例如,如果玩家使用了200次射击动作,但获得了200,000的分数,但是游戏中的相邻玩家射击了5000次以获得210,000的分数,则可能触发标记该人的进一步或人类的阈值调查。
  4. 为您的用户帐户添加值和持久性。如果您的用户帐户具有游戏解锁功能,或者您的游戏需要购买,则禁令的权重会更大,因为用户无法通过基于网络的代理创建新帐户来重新获得之前的帐户状态。

答案 1 :(得分:23)

当游戏在用户控制的系统上运行时,任何解决方案都不会是完美的,但是您可以采取一些步骤来使黑客攻击系统更加麻烦。最终,目标只能是让系统遭遇黑客攻击而不是它的价值。

  • 使用高分请求发送一些其他信息以验证服务器端。如果你每X得到5分,并且游戏只包含10个X,那么你就会有一些额外的箍来让黑客跳过来让他们的分数被认为是有效的。
  • 让服务器发送一个随机挑战,必须从该偏移量中获得游戏二进制文件的几个字节。这意味着黑客必须保留二进制文件的原始副本(只是更麻烦)。
  • 如果您拥有许可证密钥,需要高分才能包含许可证密钥,因此您可以禁止黑客攻击系统。这也可以让你跟踪上面定义的无效尝试,禁止人们在提交有效分数之前测试协议。

总而言之,让游戏变得足够流行让人们去关注它可能是一个更大的挑战。

答案 2 :(得分:6)

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

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

有一些非常伤心的人,他们也恰好相当明亮,除非你能把它们全部放在一边,这是一个失败的原因。

答案 3 :(得分:5)

我一直在使用我的Flash游戏进行一些操作,这真的是一场失败的战斗。特别是对于可以反编译成可读代码的ActionScript而不需要太多努力。

我一直在这样做是一种相当传统的方法,用纯文本发送得分和玩家名称,然后是两者的哈希(正确腌制)。很少有人决心做出足够的努力去解决这个问题,而且很少有人会这样做,否则你会把它放进去。

总而言之,我的理念是花时间让游戏变得更好,让它变得更难以作弊。

可能非常有效的一件事是让游戏在玩游戏时多次将分数提交给服务器,每次发送一些游戏信息,让您验证分数是否“真实”。但这可能有点过分了。

答案 4 :(得分:5)

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

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

答案 5 :(得分:3)

这是一个非常难的问题。

我从来没有实现过这样的东西,但这是一个简单的过程。

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

嗯,首先,除非您的申请获得巨大成功,否则我不会担心。做这样的事情非常困难。

加密无助于解决问题。您可以看到,加密有助于保护数据,但在数据加密之前它不会保护事务的任何一方(这可能是主要漏洞)。因此,如果您加密肯定,数据将保持私密,但不安全。

如果你真的很担心,我会建议混淆代码并设计得分系统的方式并不是完全明显的做法。在这里,我们可以从加密协议中借用一些东西。这是一个例子:

  1. 假设分数是m
  2. 计算对分数的某种检查(例如CRC或你看到的任何其他系统。事实上,如果你只发明一个,不管它有多么蹩脚,它会更好地工作)。
  3. 从远程服务器获取用户(D)的私钥(显然是通过安全连接)。你是唯一知道这把钥匙的人。
  4. 计算X = m ^ D mod n(n是您的公钥/私钥算法的公共模块)(即加密它:P)
  5. 正如你所看到的那样只是另一种混淆。只要你愿意,你就可以走这条路。例如,您可以将最近的两个素数查找到X并使用它们加密CRC并将其发送到服务器,这样您就可以单独使用CRC和分数,并使用不同的加密方案。

    如果你将它与模糊处理结合使用,我会说很难破解。尽管如此,即使这可能是反向工程,这一切都取决于黑客的兴趣和能力,但是......严肃地说,什么样的怪物需要付出那么大的努力来改变它在游戏中的结果? (除非是魔兽或其他什么)

    最后一个注意事项

    Obfuscator for .NET

    Obfuscator for Delphi/C++

    Obfuscator for assembler (x86)

答案 6 :(得分:2)

正如另一个答案所说,你被迫信任一个潜在的恶意客户端,一个简单的控制者加上一点点人工监控对于一个小游戏就足够了。

如果您想获得幻想,那么您必须在分数数据中查找欺诈模式,与信用卡公司类似,查看费用数据。客户端与服务器通信的状态越多,通过代码找到正确或错误行为的模式就越容易。例如。假设客户必须上传基于时间的分数审核日志(也许您也可以用来让其他客户观看热门游戏),服务器可以验证分数日志是否违反了任何游戏规则。

最后,这仍然是为了让它足够昂贵以阻止欺骗记分牌。您可能需要一个系统,您可以随时改进(更容易更新)服务器代码,以处理验证系统上的任何新攻击。

答案 7 :(得分:2)

@马丁。

这就是我相信Mario Kart Wii的作用。额外的好处是,您可以让所有其他玩家观看高分持有者如何获得高分。有趣的是,如果你查看最快的“Grumble Volcano”时间路线,你会发现有人发现了一个快捷方式,让你跳过95%的音轨。我不确定他们是否还有最快的时间。

答案 8 :(得分:2)

您无法在不受信任的客户端平台上执行此操作。在实践中,甚至有可能打败一些“可信赖的”平台。

在一般情况下,有各种攻击是无法检测的 - 主要是修改内存中的变量。如果你不能相信你自己的程序的变量,你就无法真正实现它。

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


出于兴趣,您确定人们会试图破解高分榜吗?我已经在网上玩了两年多的游戏,现在有一个非常简单的高分表。很多人都玩过,但我没有证据表明有人试图破解高分。

答案 9 :(得分:1)

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

管理员必须只监督那些被质疑的分数,因为很多用户可能会花时间去除一个非常来之不易的分数。管理员只需要查看报告的几个分数,所以这不是太多的时间,甚至更少的小游戏。

即使只知道如果你努力制造机器人,只是被报告系统再次击落,本身就是一种威慑。

或许甚至加密重放数据也不会受到伤害。重放数据通常很小,加密它不会占用太多空间。为了帮助改善这一点,服务器本身将通过控制日志尝试重播,并确保它与达到的分数相匹配。

如果反作弊系统无法找到,用户就会找到它。