Cheat Engine 进阶教程:从入门到精通

一、指针与基址:解决重启失效的根本方案

1. 为什么需要指针?

普通地址是动态分配的,重启游戏就会变

指针 = 基址 + 偏移链,基址是游戏模块中的静态地址,永远不变

正确指针:[[[[基址]+偏移1]+偏移2]+偏移3],可跨重启稳定访问目标值

2. 手动找指针(适合学习原理)

找到会回弹 / 重启失效的地址(如血量:100)

右键 → Find out what accesses this address(谁访问了这个地址)

游戏中触发数值变化(掉血),记录访问指令(如:mov eax,[esi+0x18])

记下寄存器值(如 ESI=0x0A1B2C3D)和偏移(0x18)

搜索这个寄存器值(0x0A1B2C3D),重复步骤 2-4,直到找到绿色基址(模块地址 + 偏移)

构建指针链:[[[基址+偏移A]+偏移B]+偏移C]

3. 自动指针扫描(效率更高)

在目标地址上右键 → Pointer scanner for this address

首次扫描:

  • 32 位游戏:最大级别 4-5,最大偏移 2048

  • 64 位游戏:最大级别 8-12,最大偏移 10000

保存扫描结果(.ptr 文件)

重启游戏,重新找到数值地址

再次打开 Pointer scanner → Refresh pointer,加载.ptr 文件

筛选出唯一有效指针,添加到地址列表并锁定

提示:绿色地址是基址,蓝色是动态地址,红色是无效地址


二、汇编指令修改:解决 90% 回弹问题的核心技巧

1. NOP 屏蔽改写指令(万能方案)

当数值改完就回弹,本质是游戏有 “改写指令” 在强制改回原值:

目标地址右键 → Find out what writes to this address

游戏中触发数值变化(掉血 / 花钱),获取改写指令

选中指令 → Show disassembler(显示反汇编)

反汇编窗口中,右键指令 → Replace with NOP(s)(替换为空指令)

保存为 CT 脚本,锁定数值,彻底解决回弹

NOP = 空操作,让游戏不再执行 “改写数值” 这行代码

2. 指令修改(进阶)

不仅能屏蔽,还能反向修改游戏逻辑:

把减血指令(sub eax,0x5)改成加血(add eax,0x5)

把扣钱指令(dec [esi+0x20])改成加钱(inc [esi+0x20])

操作步骤:

  1. 找到改写指令,进入反汇编窗口

  2. 右键指令 → Assemble(汇编)

  3. 输入新指令,点击 OK


三、代码注入:实现复杂功能(无限子弹 / 秒杀 / 自动回血)

1. 基本注入流程

当需要添加新逻辑(如 “开枪不消耗子弹”)时使用:

找到子弹地址,确定改写指令(如:sub [edi+0x0C],1)

反汇编窗口中,选中指令 → 工具 → Auto Assembler(自动汇编)

模板 → CT 表框架代码 → 模板 → 代码注入

在注入代码中添加逻辑:

// 原指令:sub [edi+0x0C],1
// 修改为:不消耗子弹
mov eax,[edi+0x0C]  // 读取当前子弹数
cmp eax,1           // 如果只剩1发
jne original_code   // 不是就执行原代码
mov [edi+0x0C],100  // 是就重置为100发
original_code:
sub [edi+0x0C],1    // 执行原代码

保存到 CT 表,锁定生效

2. AOB 注入(解决动态地址问题)

当地址每次都变,用特征码定位指令:

反汇编窗口中,选中指令 → 右键 → Copy to clipboard → AOB pattern

自动汇编中使用 AOB 注入模板:

[ENABLE]
aobscanmodule(INJECT,game.exe,8B 45 08 83 EC 08) // 特征码
alloc(newmem,$1000)
label(returnhere)

newmem:
// 注入代码
jmp returnhere

INJECT:
jmp newmem
returnhere:
[DISABLE]
INJECT:
db 8B 45 08 83 EC 08 // 恢复原代码
dealloc(newmem)

保存脚本,适用于任何版本游戏


四、自动汇编脚本(CT 表制作):让修改自动化

1. 脚本基础结构

[ENABLE]  // 启用时执行
// 代码段
[DISABLE] // 禁用时执行
// 恢复代码段

2. 常用脚本功能

无限生命:NOP 掉减血指令

无限金钱:把扣钱指令改成加钱

快速升级:修改经验值获取倍数

物品不减:屏蔽物品消耗指令

3. CT 表保存与分享

地址列表中右键 → New Cheat Table

添加指针、汇编修改、代码注入等项目

保存为.ct 文件,可分享给其他玩家

加载 CT 表:文件 → 加载,勾选启用


五、高级技巧:解决复杂问题

1. 处理共享代码(一个指令影响多个数值)

当一个指令同时控制血量、魔法、耐力时:

找到访问指令,分析寄存器值区分不同数值

注入代码中添加判断:

cmp esi,0x12345678  // 判断是否是血量地址
je handle_health    // 是就处理血量
jmp original_code   // 不是就执行原代码
handle_health:
// 处理血量逻辑

2. 浮点数与特殊类型数值修改

小数数值(如速度、伤害):用Float/Double类型搜索

布尔值(开关):用1 字节搜索,值为 0 或 1

字符串(如名称):用字符串类型搜索

3. 解决内存保护问题

当 CE 无法修改地址时:

地址列表中右键 → Change memory protection

设置为可读写(Read/Write),绕过内存保护机制


六、避坑指南:这些情况不要碰

网游 / 联机游戏:数据在服务器,修改本地内存没用,还会被封号

强反作弊:EAC、BE、VAC、TP 等会检测 CE 进程,直接封禁

云存档游戏:修改可能导致存档损坏、成就锁定

数值实时计算:如伤害 = 攻击力 × 系数,不是固定存储值,改了也会回弹


七、实战演练:制作无限子弹脚本

搜索子弹数(如 10),找到地址

右键 → 找出是什么改写了这个地址

记录指令:sub [ebx+0x08],1

反汇编窗口中,选中指令 → 自动汇编 → 代码注入

编写脚本:

[ENABLE]
alloc(newmem,$1000)
label(return)

newmem:
// 原指令:sub [ebx+0x08],1
// 修改为:不减子弹
jmp return

"game.exe"+123456:
jmp newmem
return:

[DISABLE]
"game.exe"+123456:
sub [ebx+0x08],1
dealloc(newmem)

保存 CT 表,启用后子弹永远不减


扫一扫关注微信