木匣子

Web/Game/Programming/Life etc.

iOS 单机游戏改档与防范

最近闲来无事,将 iPad 里一些玩了很久,感觉无法再精进的游戏拿来开开刀——试着修改游戏存档。于是发现了许多 iOS 游戏脆弱的一面,也发现了一些有意义的防御。

在 iOS 环境下,单机游戏储存游戏数据的方式大抵如下几种方法:

NSUserDefaults

许多游戏使用 NSUserDefaults 存放玩家数据。由于 NSUserDefaults 并未使用加密,用户可以通过第三方工具,例如 iTools 访问 APP 的沙盒,在 Library/Preferences/.plist 找到玩家数据,导出后通过编辑器修改相应字段,然后重新导入设备。最终达到改档的效果。

重新导入之前记得先关掉游戏,不然关掉游戏的那一刹那,游戏在内存中的数据会覆盖你的改档。

案例:Kingdom Rush 2 - Frontiers HD、Nimble Quest、RETRY 等

Documents

JSON / XML

一些游戏使用文件 IO 将游戏存档以 JSON 或者 XML 格式存放于 APP 沙盒的 Documents 中。JSON 和 XML 是较容易被程序解析的格式,便于开发者操作。但它们皆为纯文本,也方便了小白玩家找到并篡改金币或经验数据;

2 进制文件

另外一些游戏使用 2 进制文件存放游戏存档,相应的数值以 2 进制形式储存于 Documents 中。虽然 2 进制文件的结构不可知,但并非无法修改。玩家只需要用 16 进制编辑器打开存档,并搜索已有金币的 16 进制,即可找到金币的存放位置进行篡改。

搜索的时候注意使用 little-end 的字节序,例如 12345 金币的 16 进制为 0x3039,搜索时应为 “3930”

案例:Jetpack

魔高一尺,道高一丈。我也发现了一些单机游戏对玩家改档进行了一系列积极的防御。

Hash

为了防止文件被修改,一些游戏使用了简单的保护措施。最容易的方法就是在对游戏数据存档的时候,额外地生成一个 Hash,例如 MD5。该 MD5 由存档文件和一个硬编码的 Salt 生成。只要玩家无法知道这个 Salt,就没办法通过同时修改存档和 Hash 文件来作弊。

案例:Shadow Fighter 2

Encrypt

另外还可以直接对游戏存档进行加密,这样玩家基本上无法作任何改动了。

当然,对于黑客玩家来说,也并非走头无路。强大的反汇编工具 IDA pro 提供了非常高大上的静态分析(支持 Obj-C),可以很快分析出游戏的加密方式。苹果的 DRM 保护在一定程度上增加了反汇编的难度,但是在越狱设备上移除 DRM 保护的方法也早已被公开。国内许多越狱平台发布的游戏几乎不带有 DRM 保护,大大降低了破解难度。

要我说…

这次尝试让我对不少原本很喜欢的游戏完全失去了兴趣。因为我拥有了无限的资源,习得了游戏中最强大的能力,可以为所欲为。在肆意的消遣后,极快地耗尽了这款游戏的生命。

游戏的数据是游戏不可获缺的一部分。游戏通过一定的机制处理数据得以限制玩家的能力,使玩家感受到挑战。并不断通过游戏来提升,最终获得乐趣。可见,适当地对游戏数据进行保护,对延长游戏寿命是有积极意义的。

也有人不喜欢挑战,他们选择通过充值获得更多的游戏币来减少难度。不少不良开发商甚至利用了这一点,将游戏设置得无比困难,迫使玩家消费(如"植物大战僵尸2"中国版),这样的游戏,我只能说……哎。

我不反对玩家去修改数据,因为这是他们自己选择的,以牺牲游戏乐趣为代价的。或者有的人就是喜欢破坏吧。

(网络游戏则另当别论了,一个玩家的过分强大,会成为其它玩家的阻碍,这是必须防止的。)