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分析
物理读写/无附加读写实验

球分享 球点赞球在看点击阅读原文查看更多阅读原文
跳转微信打开