调试器基础:Cheat Engine 内置调试器的使用、断点类型与单步执行
调试器,说白了就是游戏逆向的「显微镜」。没有它,你只能对着内存瞎猜。Cheat Engine 自带的调试器虽然比不上 x64dbg 那么专业,但对付游戏足够了。我个人习惯是,先拿 CE 调试器快速定位关键代码,再交给专业调试器做深度分析。今天我们就把它彻底搞明白。
一、CE 内置调试器怎么打开?
打开 CE,附加游戏进程后,点击上方那个「调试器」图标(长得像个小虫子)。或者直接按 Ctrl+Alt+D。嗯,这里要注意:调试器模式下游戏会卡住,因为 CE 在等你的指令。我第一次用的时候还以为游戏崩了,其实只是暂停了而已。
核心概念:调试器让你能「冻结」游戏,逐条观察代码的执行。这是逆向工程最强大的武器。
二、断点类型——三种武器,各有千秋
断点就是告诉调试器:「执行到这里,给我停下来!」CE 提供了三种断点,我分别讲清楚。
1. 软件断点(INT3 断点)
这是最常用的断点。原理很简单:CE 会把目标地址的第一个字节替换成 0xCC(也就是 INT3 指令)。CPU 执行到这里就会触发异常,调试器就抓住了它。
怎么用?在反汇编窗口,选中一行代码,按 F2。或者右键 -> 断点 -> 切换断点。
我的经验:软件断点数量没有限制,随便下。但有个坑——游戏可能会检测代码被修改。我曾经逆向一个反外挂游戏,它每隔几秒就校验代码段,发现 0xCC 就直接闪退。这时候就得换硬件断点了。
2. 硬件断点(DR 寄存器断点)
硬件断点不修改代码。它利用 CPU 的调试寄存器(DR0~DR3)来监控地址。CPU 硬件层面支持最多 4 个硬件断点。
怎么用?在内存地址上右键 -> 断点 -> 硬件断点。或者直接在调试器里设置。
| 断点类型 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 软件断点 | 无限数量,简单易用 | 修改代码,易被检测 | 普通逆向,无保护游戏 |
| 硬件断点 | 不修改代码,无法被检测 | 最多 4 个,只能监控执行/读写 | 反外挂游戏,关键地址监控 |
| 内存断点 | 监控大范围内存 | 速度慢,只能监控读写 | 找数据访问来源 |
避坑指南:我曾经在逆向一个网络游戏时,下了 4 个硬件断点还不够用。后来发现可以用条件断点配合软件断点来绕过限制。具体做法是:在循环里下软件断点,然后设置条件「只当 EAX == 0x12345678 时中断」。这样既避免了代码检测,又解决了数量限制。
3. 内存断点
内存断点监控的是「内存页」的访问。CE 会把目标内存页的属性改成 PAGE_NOACCESS,一旦有代码访问这个页,就会触发异常。
怎么用?在内存浏览窗口,选中一段地址,右键 -> 断点 -> 内存断点。可以选择「访问时中断」或「写入时中断」。
说实话,内存断点我用的不多。因为它太慢了——每次触发都要处理整个页的异常。但有个场景它特别有用:你不知道哪段代码在修改某个数据。比如游戏里你的血量突然变了,但找不到是谁改的。这时候下个内存断点,谁碰它谁就暴露。
三、单步执行与跟踪——像放慢镜头一样看代码
断点只是暂停,单步执行才是真正的「慢动作回放」。CE 提供了几个快捷键,我列出来:
- F7:单步步入(Step Into)——进入函数内部
- F8:单步步过(Step Over)——不进入函数,直接执行完
- F9:继续运行(Run)——直到下一个断点
- Ctrl+F9:执行到返回(Run to Return)——快速跳出当前函数
你想想看,单步执行的时候,你就像站在 CPU 旁边,看着它一条一条地干活。每按一次 F7,寄存器、内存、堆栈都在变化。这就是逆向的「微观世界」。
核心技巧:单步执行时,一定要盯着「寄存器窗口」和「堆栈窗口」。我见过太多新手只顾着看代码,忽略了寄存器的变化。其实很多关键信息都在寄存器里——比如函数参数、返回值、循环计数器。
实战案例:跟踪一个 CALL 调用
假设我们找到了一个修改金币的 CALL。怎么分析它?
- 在 CALL 地址下软件断点(F2)
- 游戏里触发金币变化,断点命中
- 按 F7 步入 CALL 内部
- 观察它读取了哪些内存地址(看反汇编里的
mov eax, [ecx+04]这种指令) - 按 F8 步过,看返回值去了哪里
- 按 Ctrl+F9 快速跳出,回到调用点
我曾经用这个方法逆向了一个手游的抽奖逻辑。那个 CALL 内部有个随机数生成器,我单步跟踪了 200 多步,终于找到了它读取「概率表」的地址。嗯,虽然累,但成就感爆棚。
四、知识体系图
下面这张图总结了本章的核心内容,建议保存下来随时回顾:
五、避坑指南与个人经验
最后分享几个我踩过的坑:
- 断点下多了游戏会卡死——尤其是内存断点。我曾经在一个 3D 游戏里下了 5 个内存断点,结果游戏直接蓝屏。后来才知道,内存断点会触发大量异常,CPU 忙不过来。
- 硬件断点不要乱下——DR 寄存器是共享资源。有些反外挂系统也会用 DR 寄存器,冲突了就会崩溃。我建议:先用软件断点,被检测了再换硬件。
- 单步执行时注意超时——有些游戏有反调试机制,检测到长时间暂停会主动退出。解决办法:每单步 10 次就按 F9 跑一下,让游戏喘口气。
- 别忘了保存断点列表——CE 的断点可以导出。我每次逆向完一个游戏,都会把关键断点保存成 .CT 文件。下次更新版本,直接导入就行,不用重新找。
我的小技巧:在分析复杂的 CALL 时,我会先用「记录断点」(Breakpoint Log)功能。它不暂停游戏,只是把每次命中断点时的寄存器值记录下来。然后我再去翻日志,找规律。这样比单步跟踪快多了。
调试器这东西,光看教程没用。你得亲手去试,去踩坑。找个简单的单机游戏,比如《植物大战僵尸》,下几个断点,单步跟踪一下阳光数量的变化逻辑。等你把那个 CALL 彻底搞明白了,调试器就算入门了。
公众号:蓝海资料掘金营,微信deep3321