如何防止向全球高分表提交错误的分数报告?


44

浏览器和手机游戏通常具有全球高分表。这些表包含2,147,483,647的分数也是很常见的-人们已经弄清楚了报告分数的Web服务调用并使用它来记录虚拟分数。

对于简单的益智游戏,我们可以通过记录分数报告电话中玩家所做的每一步动作(以及用于生成关卡的任何随机种子)的记录来对此进行防御。然后可以在服务器上复制并验证整个游戏。

但是,对于比吃豆人大的东西,这很快变得不可行。

怎样才能防止这种作弊呢?


对于使用相同技术创建全球高分表的iPhone游戏,我也有同样的问题。
deft_code

确定发送重播不可行吗?
o0'。

是的,我敢肯定。:)
teedyay'2

Answers:


9

我们用于Moblox(后来被OpenFeint取代)的内部系统的工作方式如下:

  • 通过纯HTTP(不是HTTPS)发送JSON消息。包括所有字段的MD5哈希以及魔术字符串。
  • 在服务器上,通过相同的操作检查消息的完整性。

要破解系统,您必须找到此魔术字符串。逆向工程是可能的,但是很痛苦。

OpenFeint,ScoreLoop和CocosLive都使用相同的技巧,但使用HTTPS。非常容易实现。


29
我非常怀疑,进行反向工程来找到您的魔术弦将非常困难。
Kylotan

4
这是本机C ++中的Android应用程序。没有符号,也没有好的调试器。因此,您可以阅读ARM代码,但无法轻松对其进行跟踪。该键由多个操作组成,因此查找所有字符串是不够的。那不是完美的,但很痛苦。
艾利斯(Ellis)2010年

3
至少在美国的大学中,标准的本科实践是通过阅读y86(cgi2.cs.rpi.edu/~hollingd/comporg-spring2007/notes/Y86/…)汇编代码来对您所描述的密码进行逆向工程。

12
这是一种非常薄弱的技术,会给开发人员一种非常错误的安全感。
o0'。


21

没错,对于复杂的游戏,将全部重播发送到服务器并不总是可行的,但可以通过使服务器定期(半随机)向客户端询问其状态的某些部分来使用类似的系统。游戏正在运行。

例如,在FPS中,您每分钟都可以询问“您有多少杀戮?”,“所有敌人都在哪里?”等。在合理的时间内,他们在作弊。

当然,这仅在整个游戏过程中在线游戏时才有效。由于此处的目标是能够上传到在线排行榜,所以我认为这是合理的-如果玩家回答错误,不要将其踢出游戏,只是不要让他们进入得分榜。

我鼓励您重新考虑发送重播。您真正需要的只是初始随机种子和带有时间戳的输入。这实际上最多应该是几百KB。许多街机游戏已经这样做是为了保存重播供玩家查看。让您的服务器验证这些内容可能并非易事,但它可以防止除自动攻击之外的所有欺诈行为。


10

您可以通过监视最高得分表中的最高结果来限制最明显的滥用行为。根据您的游戏,您可能会获得“完美分数”,在该分数之上,任何分数都必须是欺诈性的。如果没有,您可以计算出最低的“不可能的分数”;玩家每秒可以射击10次,游戏持续1分钟,而每个被杀死的敌人都可以得到100分?那么任何高于60,000的分数都必须是欺诈性的。

您还可以通过发送一些元数据来帮助缓解问题。并非如您所描述的那样,而是完整的游戏历史,而是构成得分的组件。说:得分为60000,有500名敌人被杀死,还有一项奖励物品。然后,您可以执行简单的检查。这是“默默无闻的安全性”,因此根本不是安全的,但是它有助于消除最幼稚的攻击者。


如果用户提交的分数与元数据不匹配,您也可以标记用户(可能是通过IP标记)。然后,如果他们尝试再次提交分数,证明DOES具有正确的元数据,则可以对其进行审查,甚至可以完全禁止他们这样做。您也可以从那里发送厚脸皮的消息,提交分数请求:)
Adam Harte 2010年

我认为这个答案比公认的答案更好。只要弄清楚哪个数字是您的玩家可以达到的最大数目。更高的东西,就丢弃。

6
因此,如果一个上大学的球员作弊,那么网络上的每个人现在都是“骗子”
AttackingHobo 2010年

6

最终,您只能排除难以置信的高分,因为(根据定义)其余分数简直难以置信,因此可能是合法的(而且很棒的)玩家。

否则,您必须依靠混淆技术(例如加密,以及发送除得分以外的其他统计信息)。

您还可以在玩游戏时定期发送分数,这会增加作弊的复杂程度-即服务器可以确定游戏是否玩了足够长的时间以保证特定的分数,并确保有足够的中间报告是在游戏期间收到的(只是不要100%做到这一点,否则火车在回家的路上进入隧道会导致我将手机扔出窗外)。

最终,有人会找到一种打破它的方法,所以不要为了阻止他们而自杀。


6

不久前,我在我的一个项目中添加了一个快速/肮脏的高分表,却一点也不精通互联网安全/等,结果发现这确实是有缺陷的。令人惊讶的是,我记录了将近1,200,000的分数,大概只有5或6批明显不正确的分数达到了榜首。大多数分数甚至看起来更像是游戏中的小故障,而不是真正的“骇客”。

因此,我认为重要的一点是:确保游戏的计分系统是气密的,或者至少进行一些非常好的得分可行性检查;现在,我正在谈论的这款游戏是Ludum Dare 48hr入门游戏,所以它并不是周围最稳定的游戏。.但是总的来说,我认为休闲玩家发现/利用游戏中的故障的可能性通常要大于让某人直接“入侵”排行榜。

就是说,我现在正在对该项目进行重写,并且全力以赴。我不会赘述过多,但基本上所有分数都基于一堆随机值和哈希值以及一个魔术字符串来提交键值,然后所有通过该检查并足以使实际“ “ Top X”排行榜必须通过另一轮验证(这次是在服务器端生成过期的密钥值,并且进行了更彻底的可行性检查)。

我还建议使用某种类型的数据包跟踪器来测试可见的东西(我本来是做一个简单得多的验证,这意味着有人可以使用数据包跟踪器来查找和复制上载乐谱的http请求,而无需知道魔术弦或其他任何东西(这意味着您首先需要合法分数,但是您可以根据需要发送该分数的重复副本。)。我使用Wireshark对此进行了测试。

呵呵,结果有点长,但希望对您有所帮助...


当然是。看起来加盐的哈希是个不错的选择。我没想到他们会多次发送相同的有效分数。数据包(和散列)中包含的GUID和时间戳应该付给它-我可以检查服务器上是否存在重复。谢谢。
teedyay,2010年

3

我不是该领域的专家,但是如果您是我,我将尝试使用嵌入在您的代码中的密钥来加密分数。这些人将需要对您的代码进行逆向工程,而不是对Web服务使用纯文本。


2
我还要再走一遍。通过对exe文件(或其一部分)进行哈希处理,从代码中生成哈希值。发送分数时,发送版本号,服务器可以使用具有简单常量版本号->哈希码的表进行验证。然后,您获得的额外好处是,如果有人通过修改程序作弊,那么他的高分将不会计入。
Configurator

7
如果有人正在修改程序,他们已经可以发送他们想要的任何密钥。

2
@Joe Wreschnig,他们可以发送所需的任何密钥,但应将服务器设置为仅接受有效密钥。
AttackingHobo 2010年

5
我认为Joe的观点是,他们不必使用新修改的程序的哈希,而可以发送任何以前的哈希。
Kylotan

1
@ gd1:这有什么帮助?
Kylotan

1

Speedrun基本上记录了每个按键,并且记录了整个游戏。因此,是的,您可以录制整个游戏,这并非不可行。其他任何方法都可以通过逆向工程来破解(我对此并不足够强调:您未添加安全性,而是添加了模糊性)。

即使您采用这种方式,他们实际上仍可以提交Speedrun。您无能为力。


2
通常,对于服务器而言,回放(而非录制)是不可行的部分。如果客户端已经玩了几个小时,则服务器端的重新模拟可能会花费很多CPU分钟或更长时间。如果您有很多人提交分数,那是不可接受的。

2
数据包的大小将成为手机游戏的一个问题-特别是如果玩家按字节为带宽付费。
teedyay

哦,你们俩说的都是真的。但是,没有其他“真正的”解决方案。
o0'。

11
您不必验证提交的每条录音,只需要验证进入前十名的录音就可以了。成为第11名并没有多大的意义。而且您不必实时进行操作。定期批处理会很好。
灰色

@teedyay假设玩家平均每秒执行5个动作,并且每个动作可以用32位完整描述。那是每秒20个字节或每小时72 kB。在美国,典型的移动数据价格为每GB 10美元,即每1000 kB 1美分。
Damian Yerrick

1

当您使用它时,就会出现一个问题,即高分是否仅仅是发现了漏洞的玩家(例如,如果游戏中的某些情况会给得分带来惩罚,而错误会导致负分“环绕”)变得积极向上...或者只是找到某种游戏条件(例如棋盘上的安全点)的球员,他们可以坐在那里而不必担心无限期地输掉比赛)。

为了说出骇客和游戏漏洞之间的区别,上传至少一些游戏数据会很好。至少可以帮助您修复漏洞。

对于某些游戏(尤其是基于回合制的游戏),您实际上可以通过服务器玩游戏,其中所有游戏逻辑都存在于服务器端,而客户端只是一个接口。这不仅使得分破解变得更加困难,而且还使您可以轻松地在服务器上记录所有玩家的操作,从而可以随时重玩任何游戏。我意识到对于抽搐动作射击游戏来说,这可能是不切实际的。


1

使所有随机性均来自一粒种子,并存储每一帧的输入。每当您获得高分(例如前50名)时,请将种子和完整输入发送到服务器。在服务器上重玩游戏,如果得分很高,请更新排行榜。

如果您由于请求量太大而认为这对于更复杂的游戏不可行,请看以下示例。

假设游戏有8个按钮输入(1个键盘和4个按钮),并以60fps的速度运行。一小时的游戏输入无需压缩即可传输3.6KB。您的会话时间可能少于一小时,而压缩应该使压缩时间缩水很多,因为人工输入有很多冗余。

挑战在于使游戏具有确定性,可根据记录的输入进行游戏并在服务器上执行。


0

以前从未实现过,但是...

随时间推移逐步发送分数。这为您提供了日志,以查看分数多长时间提高一次,以及一种追踪高分“动量”的方式。

然后,您将为分数设置里程碑/标准。

例如:在游戏的前20秒内得分不能超过20,000。如果没有大于200,000的分数,则分数不能超过250,000。

这与发送游戏状态不完全相同,但接近它。

附带好处:考虑一下您将从中获得的所有有用的游戏统计数据。有人愿意为此付出很多钱。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.