从零开始摸透“杨过游戏”内部逻辑
最近闲着没事,刷手机的时候看到了那个叫“杨过游戏”的新手游又在推广告。我对这种武侠IP改来改去的游戏兴趣不大,但职业病犯了,我琢磨着,新游戏嘛肯定要用探查器进去遛一圈,看看它到底在后台藏了些什么。
我的分享记录,不是教你咋作弊,是想让你知道,这些看似牛气哄哄的程序,底裤在哪儿。
第一步:抓包和准备“武器”
我立马下载了游戏。这种国产游戏,十有八九都跑在Unity或者Unreal上,探查工具的选择就比较固定了。我没用那些花里胡哨的商业工具,就是我自己平时调教惯了的那个探查器版本。要做的,是把游戏跑起来,然后把探查器以最隐蔽的方式挂上去。
第一次尝试,直接被游戏启动前的反调试保护给拦住了。屏幕一黑,弹出个错误提示,说环境异常。这很正常,现在的新游戏都学精了。
我没费力气去硬破这个初始防护。我直接采取了更粗暴的方法:先暂停掉游戏的启动流程,找到那个校验函数的内存区域,然后强行打了个NOP(空操作)进去。相当于告诉程序:“这个检查步骤,跳过,不用看了。”
成功绕过防护后,游戏顺利进入主界面。
第二步:寻找数值的“老家”
进入游戏后,我得先找个容易下手的东西练练手,通常是金币或者体力值。
我看了下我的体力,是“120/120”。
- 我打开探查器,扫描“120”这个32位整数。
- 然后我在游戏里随便做了个消耗体力的事情,体力降到了“110”。
- 我再次扫描,过滤那些数值发生变化的内存地址。
- 只剩下了两三个结果,我随便挑了一个,把它冻结在了999。
回到游戏,体力果然变成了999,并且用不完。这个是基础操作,没啥技术含量。这说明,他们至少在体力这个地方,没有做客户端与服务器的频繁双向校验,或者说,他们默认相信客户端发来的数值。
第三步:深入探查技能冷却逻辑
体力好找,但我想看的是更复杂的逻辑,比如技能的冷却时间(Cooldown,CD)。这个东西往往不是整数,而是浮点数,而且数值是不断变化的,不太好抓。
我找到我的主角,释放了一个冷却时间是“8.5秒”的技能。
我的流程变复杂了:
- 在探查器里,我选择了“浮点数”扫描,类型设定为“未知初始值”。
- 等待0.5秒后,我立刻选择“数值减少了”进行过滤。
- 我重复了这个过程四次,直到剩下的内存地址数量降到了两位数。
- 我开始一个一个去检查这些地址。我发现其中有一个地址,它的数值是从8.5、8.4、8.3…这样精确地递减的。
Bingo!我找到了技能冷却的计时器。我把这个地址的数值,强制改成了0.001。然后我切回游戏,果然,那个原本还在冷却的技能,图标瞬间变亮了,可以直接释放。
第四步:数据结构与的感想
找到CD地址后,我没急着关工具。我往这个地址的前后内存区域翻了一翻。
我爬梳了附近的数据块,发现了一个很有意思的事情:角色的攻击力、防御力、暴击率等核心属性,它们存储的位置,离那个技能冷却的计时器地址,非常非常近。这说明,这游戏的开发人员在设计角色数据结构的时候,把“状态”(比如冷却时间)和“属性”(比如攻击力)直接一股脑塞在了一起,形成了一个巨大的玩家数据块。
这种结构设计,对于我们这种喜欢探查的来说,简直就是“一锅端”。只要找到一个关键点,你就能顺藤摸瓜,把所有属性都看光光,甚至改掉。
我今天实践的结论是:这个“杨过游戏”,核心架构做得太老实了。他们信任客户端,并且数据存储逻辑非常集中。我不是说这样不但对于一个商业运营的游戏来说,这种结构简直就是敞开大门欢迎大家进来“做客”。搞了半天,我探查到的东西,比我想象中要简单得多,浪费了我半小时调试反作弊的时间。
但实践记录分享完了,开心!