一、指针与基址:解决重启失效的根本方案
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])
操作步骤:
找到改写指令,进入反汇编窗口
右键指令 → Assemble(汇编)
输入新指令,点击 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 表,启用后子弹永远不减
扫一扫关注微信