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

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

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

===============>>#1 票数:39 已采纳

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

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

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

===============>>#2 票数:23

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

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

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

===============>>#3 票数:6

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

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

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

===============>>#4 票数:5

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

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

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

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

===============>>#5 票数:5

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

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

===============>>#6 票数:3

这是一个非常难的问题。

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

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

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

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

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

  1. 假设分数是m
  2. 计算一些对得分的检查(例如CRC或你看到的任何其他系统。事实上,如果你只发明一个,不管它有多么蹩脚,它会更好地工作)
  3. 从远程服务器获取用户(D)的私钥(显然通过安全连接)。 你是唯一知道这个钥匙的人。
  4. 计算X = m ^ D mod n(n是您的公钥/私钥算法的公共模块)(即加密它:P)

如你所见,这只是另一种混淆。 只要你愿意,你就可以走这条路。 例如,您可以将最近的两个素数查找到X并使用它们加密CRC并将其发送到服务器,这样您就可以单独使用CRC和分数,并使用不同的加密方案。

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

最后一点

用于.NET的混淆器

Delphi / C ++的混淆器

汇编器的混淆器(x86)

===============>>#7 票数:2

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

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

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


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

===============>>#8 票数:2

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

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

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

===============>>#9 票数:2

@马丁。

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

===============>>#10 票数:1

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

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

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

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

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

  ask by LKM translate from so

未解决问题?本站智能推荐: