25

我正在玩我正在编写的本地(非网络)单人游戏,我突然想到拥有一个每日/每周/所有时间的在线高分列表(想想 Xbox Live 排行榜)会让游戏更有趣的是,增加了一些(少量)社区和竞争。但是,我担心人们会将这样的功能视为邀请黑客入侵,这会使普通玩家因无法获得的高分而望而却步。

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

您是否曾经实施过在线高分榜或排行榜?您是否找到了一种合理的防黑客方法来实现这一点?如果是这样,你是怎么做到的?您对黑客攻击有什么经验?

4

10 回答 10

42

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

你最好的选择是将作弊的标准提高到玩家认为值得超越的水平之上。为此,您可以使用许多经过验证(但经常未提及)的技术:

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

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

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

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

于 2008-08-25T13:28:20.603 回答
6

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

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

那里有一些非常可悲的人,他们也恰好很聪明,除非你能让他们全部放下,这是一个失败的事业。

于 2008-08-25T13:17:44.717 回答
5

我一直在用我的 Flash 游戏做一些这样的事情,这真的是一场失败的战斗。尤其是对于无需太多努力即可将其反编译成可读性强的代码的 ActionScript。

我一直这样做的方式是一种相当传统的方法,即以纯文本形式发送分数和球员姓名,然后将两者的哈希值(适当加盐)。很少有人有足够的决心去努力解决这个问题,而且很少有人会这样做,否定你投入的所有时间。

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

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

于 2008-08-25T13:22:09.653 回答
5

如果您的游戏内置了回放系统,您可以向服务器提交回放,并让服务器根据回放计算得分。

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

于 2008-08-29T00:00:52.120 回答
3

这真是一个很难的问题。

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

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

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

加密无助于解决问题。您会看到,加密有助于保护传输途中的数据,但在数据加密之前它不能保护交易的任何一方(这可能是主要漏洞所在)。因此,如果您对确定性进行加密,数据将保持私密,但并不安全。

如果您真的担心它,我会建议混淆代码并以一种不完全显而易见的方式设计评分系统。在这里,我们可以从加密协议中借用一些东西。这是一个例子:

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

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

如果您将其与混淆一起使用,我会说这将很难破解。尽管如此,即使这可以被逆向工程,这完全取决于黑客的兴趣和能力,但是......说真的,什么样的怪胎需要如此努力才能改变其在游戏中的结果?(除非是魔兽什么的)

最后一点

.NET 的混淆器

Delphi/C++ 的混淆器

汇编程序的混淆器(x86)

于 2008-08-25T13:45:01.500 回答
2

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

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

最后,这仍然是为了让它变得足够昂贵以阻止在计分板上作弊。您需要一个系统,您可以始终改进(更易于更新)服务器代码以处理对您的验证系统的任何新攻击。

于 2008-08-25T13:36:01.537 回答
2

@马丁。

这就是我相信马里奥赛车 Wii 的工作方式。额外的好处是您可以让所有其他玩家观看高分保持者如何获得高分。有趣的是,如果您查看最快的“ Grumble Volcano ”时间轨迹,您会发现有人找到了一条捷径,可以让您跳过 95% 的轨迹。我不确定他们是否仍然把它作为最快的时间。

于 2008-08-29T00:36:18.507 回答
2

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

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

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


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

于 2008-09-28T08:15:04.610 回答
1

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

The admins must oversee only those scores that get questioned, because there is a small chance that a bunch of users might bandwagon to remove a perfectly hard-earned score. And the admins only have to view the few scores that do get reported, so it's not too much of their time, even less for a small game.

Even just knowing that if you work hard to make a bot, just to be shot down again by the report system, is a deterrent in itself.

Perhaps even encrypting the replay data wouldn't hurt, either. Replay data is often small, and encrypting it wouldn't take too much more space. And to help improve that, the server itself would try out the replay by the control log, and make sure it matches up with the score achieved.

If there's something the anti-cheat system can't find, users will find it.

于 2012-12-23T02:31:33.300 回答