看雪学院 09月20日
逆向攻防:塔防游戏中的金币无限化技术探讨
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文作者ranshaodexia分享了其在塔防游戏逆向研究中的实践经验。作者以一款塔防游戏为对象,通过Cheat Engine和x64dbg工具,深入分析了游戏金币系统的运作机制。文章详细阐述了从定位金币显示地址到追踪修改金币数值的代码,并最终通过修改内存指令,实现了金币的无限化。作者强调,此研究仅用于学习交流,请勿用于违法用途,并鼓励技术探讨。

💰 **金币地址定位与识别**:文章首先介绍了使用Cheat Engine搜索金币内存地址的方法。作者发现直接搜索到的地址仅为显示值,而非实际存储位置,并推测实际金币值可能并非直接写在内存中,而是通过修改其他地址来影响显示。这一步是后续深入分析的基础。

🔍 **代码追踪与函数定位**:通过Cheat Engine的“找出是什么改写了这个地址”功能,作者成功定位到修改金币显示地址的代码片段,并获取了其在GameAssembly.dll中的偏移地址。随后,利用x64dbg附加游戏进程,精确地定位到该代码位置,为进一步分析提供了上下文。

💡 **指令修改与功能实现**:在x64dbg中,作者进一步分析了减金币的代码逻辑,发现通过修改`subsd xmml0, xmml6`为`addsd xmml0, xmml6`,可以将金币减少的操作变为增加,从而变相实现了金币无限化的目标。最后,作者使用x64dbg制作了补丁文件,替换了原有的DLL。

⚠️ **研究目的与免责声明**:作者明确指出,本研究仅用于学习交流目的,严禁用于任何违法用途。同时,作者也幽默地表示,破解游戏会使其失去乐趣,并邀请技术大佬进行指教,体现了对技术研究的严谨态度和开放心态。

ranshaodexia 2025-09-19 17:59 上海

看雪论坛作者ID:ranshaodexia

研究仅供学习交流目的,请勿用于任何违法用途

有一群小猴子喜欢打气球,打到第6代了,我也喜欢打气球。新手刚开始接触逆向,就拿我喜欢的这款游戏来练手吧,新人技术有限,请轻喷。

我们知道,塔防游戏每一局放置的塔都是受局内的金币限制的,开局初始金币,放置塔,然后打怪获得金币,然后继续放置塔或者升级塔。本局游戏结束后,局内的金币作废,下局开局时还是初始金币。

那么我们就围绕金币来做个逆向,看看如何让局内的金币无限。

传统单机游戏修改金币,我小时候都是用金山游侠,现在开始学习逆向了,就学着用Cheat Engine和x64dbg吧。

第一步,用金山游侠的方法,在CE中搜索到金币所在的内存地址A。

修改内存地址A中的值,发现游戏实际并没有修改金币,但该值确实在反映金币的当前值,也就是说,这个地址A只是显示当前的金币值,并不是金币值的实际存储位置,而实际的存储位置在CE中直接搜索是搜不到的。

推测:实际的金币值没有直接写在内存中,当实际的金币在被修改之后,会相对应的修改地址A的值。那么找到修改地址A的值的代码,看看有什么线索。

在CE中对右键单击地址A,点击“找出是什么改写了这个地址”

然后在游戏中消耗一下金币,就发现了这段代码

movsd [rbx+28], xmm6

这句话的意思是将xmm6寄存器中的数值的低64位赋值给内存地址[rbx+28],这个地址就是刚才搜到的地址A。

这段代码出现在地址为0x7FF9A2BB797D的位置,而该位置位于文件GameAssembly.dll的基地址加上0xA1797D偏移。

第二步,使用x64dbg找到0x7FF9A2BB797D的位置。先关闭CE,释放CE对游戏进程的附加,然后打开x64dbg,附加该游戏进程,定位到0x7FF9A2BB797D,注意,这个过程中游戏不要关闭,否则游戏加载到内存的基址会发生变化。

定位到0x7FF9A2BB797D,这一段上下文的代码如下。

从代码中可以看到,xmm6在复制到[rbx+28]前,先由xmm1复制到的xmm6,那么就需要找出xmm1的值是怎么来的。

查看该段代码的函数是谁调用的,点击函数头的位置,查看函数调用

发现有太多函数来调用这个函数了,不好排查。

由于本人经验有限,此时陷入了僵局。

只能再从头来,看看有什么可以突破的地方。再次使用CE搜索到地址A,找出是什么改写了这个地址,双击打开找到的这条记录,发现了[rbx+28]中的基地址rbx为0x1F8AAD604B0

再次搜索内容为十六进制1F8AAD604B0的内存地址,发现有两个地址的存储内容为1F8AAD604B0

分别对这两个地址进行跟踪(找出是什么访问了这个地址),发现当游戏金币变化时,只有第二个地址B被访问过。

这里有3处代码访问过地址B,通过不断的放置塔和卖出塔,发现:1、当塔在被点击的时候第一条指令的计数就会增加,每次增加很多2、当塔被放置时,即金币减少时,第二条指令的计数就会增加13、当塔被卖出时,即金币增加时,第三条指令的计数就会增加1

那么我们就看第二条指令,只要分析出这一段代码的作用,就有机会能做到无限金币了。

这条指令所在的位置信息如下

用x64dbg定位到该位置查看代码如下

这段代码就是减金币的那段代码,黄色框的内容显示的是调用修改地址A的函数,白色框的内容显示的是寄存器xmm1在复制给xmml6之前,是由xmml0复制过来的,而xmml0在复制给xmml6之前,又是通过减去xmml6再复制给自己的,通过设置断点运行观察寄存器的值,确认了自己的推测,这个xmml0存储的就是当前的金币值。

那么这里就将代码

subsd xmml0, xmml6

修改为

addsd xmml0, xmml6

运行一下,发现每次在放置塔时,不再减少金币了,反而增加金币了,这就变相达到无限金币的目标了。

最后用x64dbg制作一个补丁,替换原来的文件,注意这段代码不是在主程序中,而是在dll文件中,制作的补丁也得是dll文件。

(PS:游戏还是不要这样作弊的好,破解了瞬间就没意思了,本文仅供技术讨论,请大佬指教!)

*本文为看雪论坛优秀文章,由 ranshaodexia 原创,转载请注明来自看雪社区

1.25折门票开售!

看雪·第九届安全开发者峰会(SDC 2025)

# 往期推荐

无"痕"加载驱动模块之傀儡驱动 (上)

为 CobaltStrike 增加 SMTP Beacon

隐蔽通讯常见种类介绍

buuctf-re之CTF分析

物理读写/无附加读写实验

球分享

球点赞

球在看

点击阅读原文查看更多

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

逆向工程 塔防游戏 金币修改 Cheat Engine x64dbg 内存分析 DLL破解 ranshaodexia 看雪论坛
相关文章