Answers:
我们用于Moblox(后来被OpenFeint取代)的内部系统的工作方式如下:
要破解系统,您必须找到此魔术字符串。逆向工程是可能的,但是很痛苦。
OpenFeint,ScoreLoop和CocosLive都使用相同的技巧,但使用HTTPS。非常容易实现。
没错,对于复杂的游戏,将全部重播发送到服务器并不总是可行的,但可以通过使服务器定期(半随机)向客户端询问其状态的某些部分来使用类似的系统。游戏正在运行。
例如,在FPS中,您每分钟都可以询问“您有多少杀戮?”,“所有敌人都在哪里?”等。在合理的时间内,他们在作弊。
当然,这仅在整个游戏过程中在线游戏时才有效。由于此处的目标是能够上传到在线排行榜,所以我认为这是合理的-如果玩家回答错误,不要将其踢出游戏,只是不要让他们进入得分榜。
我鼓励您重新考虑发送重播。您真正需要的只是初始随机种子和带有时间戳的输入。这实际上最多应该是几百KB。许多街机游戏已经这样做是为了保存重播供玩家查看。让您的服务器验证这些内容可能并非易事,但它可以防止除自动攻击之外的所有欺诈行为。
您可以通过监视最高得分表中的最高结果来限制最明显的滥用行为。根据您的游戏,您可能会获得“完美分数”,在该分数之上,任何分数都必须是欺诈性的。如果没有,您可以计算出最低的“不可能的分数”;玩家每秒可以射击10次,游戏持续1分钟,而每个被杀死的敌人都可以得到100分?那么任何高于60,000的分数都必须是欺诈性的。
您还可以通过发送一些元数据来帮助缓解问题。并非如您所描述的那样,而是完整的游戏历史,而是构成得分的组件。说:得分为60000,有500名敌人被杀死,还有一项奖励物品。然后,您可以执行简单的检查。这是“默默无闻的安全性”,因此根本不是安全的,但是它有助于消除最幼稚的攻击者。
不久前,我在我的一个项目中添加了一个快速/肮脏的高分表,却一点也不精通互联网安全/等,结果发现这确实是有缺陷的。令人惊讶的是,我记录了将近1,200,000的分数,大概只有5或6批明显不正确的分数达到了榜首。大多数分数甚至看起来更像是游戏中的小故障,而不是真正的“骇客”。
因此,我认为重要的一点是:确保游戏的计分系统是气密的,或者至少进行一些非常好的得分可行性检查;现在,我正在谈论的这款游戏是Ludum Dare 48hr入门游戏,所以它并不是周围最稳定的游戏。.但是总的来说,我认为休闲玩家发现/利用游戏中的故障的可能性通常要大于让某人直接“入侵”排行榜。
就是说,我现在正在对该项目进行重写,并且全力以赴。我不会赘述过多,但基本上所有分数都基于一堆随机值和哈希值以及一个魔术字符串来提交键值,然后所有通过该检查并足以使实际“ “ Top X”排行榜必须通过另一轮验证(这次是在服务器端生成过期的密钥值,并且进行了更彻底的可行性检查)。
我还建议使用某种类型的数据包跟踪器来测试可见的东西(我本来是做一个简单得多的验证,这意味着有人可以使用数据包跟踪器来查找和复制上载乐谱的http请求,而无需知道魔术弦或其他任何东西(这意味着您首先需要合法分数,但是您可以根据需要发送该分数的重复副本。)。我使用Wireshark对此进行了测试。
呵呵,结果有点长,但希望对您有所帮助...
我不是该领域的专家,但是如果您是我,我将尝试使用嵌入在您的代码中的密钥来加密分数。这些人将需要对您的代码进行逆向工程,而不是对Web服务使用纯文本。
Speedrun基本上记录了每个按键,并且记录了整个游戏。因此,是的,您可以录制整个游戏,这并非不可行。其他任何方法都可以通过逆向工程来破解(我对此并不足够强调:您未添加安全性,而是添加了模糊性)。
即使您采用这种方式,他们实际上仍可以提交Speedrun。您无能为力。
当您使用它时,就会出现一个问题,即高分是否仅仅是发现了漏洞的玩家(例如,如果游戏中的某些情况会给得分带来惩罚,而错误会导致负分“环绕”)变得积极向上...或者只是找到某种游戏条件(例如棋盘上的安全点)的球员,他们可以坐在那里而不必担心无限期地输掉比赛)。
为了说出骇客和游戏漏洞之间的区别,上传至少一些游戏数据会很好。至少可以帮助您修复漏洞。
对于某些游戏(尤其是基于回合制的游戏),您实际上可以通过服务器玩游戏,其中所有游戏逻辑都存在于服务器端,而客户端只是一个接口。这不仅使得分破解变得更加困难,而且还使您可以轻松地在服务器上记录所有玩家的操作,从而可以随时重玩任何游戏。我意识到对于抽搐动作射击游戏来说,这可能是不切实际的。
使所有随机性均来自一粒种子,并存储每一帧的输入。每当您获得高分(例如前50名)时,请将种子和完整输入发送到服务器。在服务器上重玩游戏,如果得分很高,请更新排行榜。
如果您由于请求量太大而认为这对于更复杂的游戏不可行,请看以下示例。
假设游戏有8个按钮输入(1个键盘和4个按钮),并以60fps的速度运行。一小时的游戏输入无需压缩即可传输3.6KB。您的会话时间可能少于一小时,而压缩应该使压缩时间缩水很多,因为人工输入有很多冗余。
挑战在于使游戏具有确定性,可根据记录的输入进行游戏并在服务器上执行。