安全的在线高分表为非networking游戏

我正在玩一个我正在编写的本地(非networking)单人游戏游戏,而且发生在我身上的是每天/每周/所有的在线高分榜 (想想Xbox Live Leaderboard)会让游戏更有趣的是,增加了一些(小)的社区和竞​​争。 但是,恐怕人们会看到这样一个特征,就是对黑客的邀请,这会让普通玩家感到不可思议的高分。

我想到了防止这种尝试的明显方法(例如公钥/私钥encryption),但是我已经想出了合理简单的方法,黑客可以绕过我的所有想法(从二进制文件中提取公钥,从而发送伪造的encryption分数,例如)。

你有没有实施在线高分榜或排行榜? 你有没有find一个合理的黑客的方法来实现呢? 如果是这样,你是怎么做到的? 你有什么黑客攻击的经验?

在一天结束的时候,你依靠信任客户。 如果客户端向服务器发送重播,很容易复制或修改成功的游戏并将其发送到服务器。

你最好的办法就是提高欺骗的水平,超过玩家认为值得超越的地步。 要做到这一点,可以使用许多已经certificate(但未提及的)技术:

  1. 将黑名单作弊者留在蜜jar中。 他们可以看到他们自己的分数,但没有其他人可以。 除非他们通过login其他帐户进行validation,否则他们认为他们已经成功破解了您的游戏。
  2. 当有人被标记为骗子时,推迟任何帐户影响发生,直到将来的一个特定点。 在一到三天内随意设定这一点。 通常情况下,一个骗子会尝试多种方法,并最终成功。 通过推迟帐户状态反馈,直到晚些时候,他们不明白是什么让他们被抓到。
  3. 捕获所有游戏用户命令并将其发送到服务器。 在给定的三angular洲内对其他分数进行validation。 例如,如果玩家使用了200次射门动作,但获得了20万分数,但是游戏中的邻近玩家射击了5000次以获得21万分数,则可能触发标志人为进一步或人的阈值调查。
  4. 为您的用户帐户添加价值和持久性。 如果您的用户帐户对您的游戏具有解锁function,或者您的游戏需要购买,则禁止的权重会更大,因为只需通过基于Web的代理创build新帐户,用户就无法重新获得以前的帐户状态。

当游戏在用户控制的系统上运行时,没有任何解决scheme是完美的,但是有几个步骤可以使系统更麻烦。 最终,目标只能是使系统更加麻烦而不是值得。

  • 发送一些额外的信息与高分请求validation一个服务器端。 如果每X都得到5分,而且这个游戏只包含10个X,那么你就有一些额外的箍让黑客跳过来让他们的分数被接受为有效。
  • 让服务器发送一个随机的挑战,必须满足游戏二进制数字的偏移量。 这意味着黑客必须保留二进制文件的原始副本(稍微麻烦一点)。
  • 如果您拥有许可证密钥,则需要高分才能包含这些密钥,因此您可以禁止被黑客入侵的系统。 这也可以让你跟踪上面定义的无效尝试,在甚至提交有效分数之前禁止人们testing协议。

总而言之,让游戏足够受欢迎让人们去关注它,这可能是一个更大的挑战。

我真的不认为这是可能的。

我已经使用了非常简单的密钥encryption和压缩的二进制文件,这对我所需要的安全性来说足够好,但是我真的认为如果有人认为破解你的在线高分表将会造成破解。

那里有一些相当悲伤的人,除非你能把他们全部弄清楚,否则他们会变得非常光明。

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

这种方法并不完美,你仍然可以通过减慢游戏速度(如果是基于动作的)或通过编写一个僵尸程序来作弊。

我一直在用我的Flash游戏做这些事情,这真是一场失败的战斗。 特别是对于ActionScript,可以反编译成有点可读的代码,没有太多的努力。

我一直这样做的方式是用普通的文本发送得分和玩家的名字,然后把这两个(适当地腌制)的散列。 很less有人有足够的决心去努力弄清楚,而less数人会这样做,否定所有的时间。

总而言之,我的理念是把时间花在让游戏变得更好,并使其足够努力的情况下作弊。

有一件事可能相当有效,就是让游戏在玩游戏的时候多次向服务器提交分数,每次发送一些游戏信息,让您validation分数是否“真实”。 但是,这可能有点过分了。

这是一个很难的问题。

我从来没有实现这样的事情,但这是一个简单的aproximmation。

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

那么首先,除非你的申请取得了很大的成功,否则我不会担心。 做这样的事情是非常困难的。

encryption不会帮助解决问题。 您会发现,encryption有助于保护数据,但在数据encryption之前(这是主要的漏洞可能出现的地方),encryption不能保护交易双方。 所以如果你encryption的话,数据将保持私密,但是不安全。

如果你真的担心,我会build议混淆代码和devise分数系统的方式,这是不完全明显的在做什么。 在这里我们可以从一个encryption协议中借用一些东西。 这里是一个例子:

  1. 比方说分数是m数
  2. 计算某种检查分数(例如CRC或任何其他你看到的系统)。实际上,如果你只是创造一个,不pipe它多么蹩脚,它会更好地工作)
  3. 从远程服务器获取用户(D)的私钥(显然,通过安全连接)。 你是唯一知道这个钥匙的人。
  4. 计算X = m ^ D mod n(n是公钥/私钥algorithm的公共模块)(即encryption:P)

如你所见,这只是另一种混淆。 只要你愿意,你可以这样下去。 例如,您可以查找与X最接近的两个素数,并使用它们来encryptionCRC并将其发送到服务器,以便分别使用不同的encryptionscheme来获得CRC和分数。

如果你把这个和混淆结合起来使用,我会说这很难被破解。 但即使这样也可能是逆向工程,这一切都取决于黑客的兴趣和能力,但是……严重的是,什么样的怪胎需要付出这么大的努力来改变游戏的结果呢? (除非是魔兽什么的)

最后一个音符

.NET的混淆器

Delphi / C ++混淆器

汇编器混淆器(x86)

正如另一个答案所说,你不得不相信一个潜在的恶意客户,一个简单的侦测器加上一点点的人工监控对于一个小型游戏就足够了。

如果你想要得到幻想,那么你必须寻找得分数据中的欺诈模式,类似于一家看着收费数据的信用卡公司。 客户端通信到服务器的状态越多,通过代码查找正确或不正确行为的模式就越容易。 例如。 假设客户端必须上传基于时间的分数审计日志(也许您可以使用其他客户端观看顶级游戏),然后服务器可以validation分数日志是否违反任何游戏规则。

最后,这还是要让它足够昂贵来阻止作弊记分牌。 您需要一个系统,您可以随时改进(更容易更新)服务器代码,以处理validation系统上的任何新攻击。

@马丁。

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

你不能在不受信任的客户端平台上进行。 在实践中,甚至可以击败一些“可信”的平台。

在一般情况下,不可能检测到各种各样的攻击 – 主要是修改内存中的variables。 如果你不能相信你自己的程序的variables,你不能真正达到很多。

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


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

通常,作弊和黑客的最大防御者是社区手表。 如果分数看起来相当可疑,则用户可以报告作弊分数。 如果有足够的人报告该分数,重播可以由pipe理员检查有效性。 如果已经有一大堆玩家以完全合法的方式玩游戏,那么很容易看出机器人和实际玩家之间的区别。

pipe理员只能监督那些受到质疑的分数,因为很多用户可能会花钱去除一个非常难得的分数。 而且pipe理员只需要查看几个得到报告的分数,所以没有太多的时间,更不是一个小游戏。

即使只知道如果你努力工作制造一个机器人,只是被报告系统重新击落,本身也是一种威慑。

也许即使encryption重放数据也不会伤害。 重播数据通常很小,encryption并不会占用太多的空间。 为了改善这一点,服务器本身会通过控制日志尝试重播,并确保它与所获得的分数相匹配。

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

Interesting Posts