我正在玩我正在编写的本机(非网络)单人游戏,我突然想到每天/每周/所有时间 在线高分榜 (想想 Xbox Live 排行榜)将使游戏变得更加有趣,增加一些(少量)社区和竞争。然而,我担心人们会把这样的功能视为黑客邀请,这会因为高得离谱的分数而让普通玩家望而却步。

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

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

有帮助吗?

解决方案

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

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

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

其他提示

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

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

总而言之,让这款游戏足够流行,让人们愿意破解它可能是一个更大的挑战。

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

我之前已经使用过非常简单的密钥加密和压缩的二进制文件来完成此操作,该加密方式足以满足我所需的安全性,但老实说,我认为如果有人考虑破解您的在线高分表,那么它就会完成。

那里有一些非常悲伤的人,但他们也恰好很聪明,除非你能让他们都安定下来,否则这是一个失败的事业。

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

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

我已经在我的 Flash 游戏中做了一些这样的事情,但这确实是一场失败的战斗。特别是对于 ActionScript,无需太多努力就可以反编译成可读的代码。

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

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

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

这是一个非常难的问题。

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

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

嗯,首先,除非你的申请非常成功,否则我不会担心。做这样的事情是极其困难的。

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

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

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

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

如果你将其与混淆结合使用,我会说这将很难破解。尽管如此,即使这可以被逆向工程,这一切都取决于黑客的兴趣和能力,但是......说真的,什么样的怪物需要付出如此多的努力来改变比赛的结果?(除非是魔兽什么的)

最后一点

.NET 混淆器

Delphi/C++ 混淆器

汇编器混淆器 (x86)

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

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

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

@马丁。

我相信《马里奥赛车 Wii》就是这样运作的。额外的好处是,你可以让所有其他玩家观看高分持有者如何获得高分。有趣的是,如果你检查最快“格朗布尔火山“时间轨迹,你会发现有人找到了一条捷径,可以让你跳过95%的轨道。我不确定他们是否仍将其视为最快时间。

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

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

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


出于兴趣,你确定人们会尝试破解高分表吗?我玩一款在线游戏已经两年多了,高分表简直就是破烂不堪。很多人都玩过,但我没有证据表明有人试图破解高分。

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

管理员必须只监督那些受到质疑的分数,因为一小群用户可能会跟风删除来之不易的分数。管理员只需查看报告的少数分数,因此他们的时间不会太多,对于小型游戏来说更是如此。

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

也许甚至对重放数据进行加密也不会造成什么影响。重放数据通常很小,对其进行加密不会占用太多空间。为了帮助改进这一点,服务器本身将尝试通过控制日志进行重播,并确保其与所获得的分数相匹配。

如果反作弊系统找不到某些东西,用户会找到它。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top