|
|
Day 8 -- 多级指针:俄罗斯套娃式的内存寻址
Cheat Engine 从入门到住院 · Day 8
Day 6 我们学了指针:一个固定地址里存着目标数据的动态地址。一级指针,简洁明了。
但现实世界没这么简单。很多游戏的数据结构是这样的:
- 固定地址 → 指针A → 指针B → 指针C → 血量
复制代码
就像你想找一个人,先打电话给他妈妈,他妈妈说"去问他老婆",他老婆说"去问他同事",同事终于告诉你他在哪。
这就是多级指针,CE Tutorial 的 Step 8 就是来折磨你这个的。
━━━━━━━━━━━━━━━━━━━━
本文你将学到
多级指针的结构和原理
如何手动追踪多级指针链
CE 中添加多级指针的方法
追踪指针链的系统化流程
阅读时间:15 分钟 | 实操时间:40 分钟 | 难度:进阶偏难
━━━━━━━━━━━━━━━━━━━━
CE Tutorial Step 8:多级指针
进入 Step 8。血量、Change value、Change pointer 按钮。
这一步的指针不是一级的,而是四级。你需要找到一条从静态地址(绿色)出发,经过四级指针最终到达血量的完整路径。
━━━━━━━━━━━━━━━━━━━━
多级指针的结构
一级指针:
四级指针:
- [[[[基址] + 偏移1] + 偏移2] + 偏移3] + 偏移4 = 目标地址
复制代码
用具体数字举例:
- 基址 0x00400000 里存的值 = 0x0A000000
- 0x0A000000 + 0x10 = 0x0A000010
- 0x0A000010 里存的值 = 0x0B000000
- 0x0B000000 + 0x14 = 0x0B000014
- 0x0B000014 里存的值 = 0x0C000000
- 0x0C000000 + 0x0C = 0x0C00000C
- 0x0C00000C 里存的值 = 0x0D000000
- 0x0D000000 + 0x18 = 0x0D000018
- 0x0D000018 = 血量(100)
复制代码
每一层都是"读取当前地址的值,加上偏移量,得到下一层的地址"。
━━━━━━━━━━━━━━━━━━━━
手动追踪多级指针
追踪多级指针的方法就是把 Day 6 学的流程重复多次。
第一步:找到血量地址
老方法,快速找到血量的动态地址,假设是。
第二步:找到什么代码在写入这个地址
右键 → Find out what writes to this address。
点 Hit me,看到指令类似:
Extra info 显示:
这告诉我们:
偏移量 =上一级指针指向
第三步:找到谁存了 0x0D000000
现在搜索值为的地址(十六进制,8 Bytes)。
找到一个地址,比如。
第四步:对 0x0C00000C 做同样的事
右键 → Find out what accesses this address。
在另一个操作中触发对这个地址的访问,看到指令:
Extra info:
偏移量 =上一级指向
第五步:继续向上追溯
搜索,找到地址。
对这个地址做代码查找,发现指令:
偏移量 =上一级指向
第六步:再上一层
搜索,找到地址。
代码查找发现:
偏移量 =上一级指向
第七步:搜索 0x0A000000
搜索这个值,如果找到一个绿色地址(比如- Tutorial-x86_64.exe+1A2B3C
复制代码 ),恭喜,你到达了指针链的起点。
基址偏移 =(如果绿色地址里直接存的就是)
第八步:在 CE 中添加多级指针
点击 Add Address Manually,勾选 Pointer,然后:
- 基址:Tutorial-x86_64.exe+1A2B3C
- 偏移 0: 10
- 偏移 1: 14
- 偏移 2: 0C
- 偏移 3: 18
复制代码
点击 "Add Offset" 按钮来添加多层偏移。注意偏移量的顺序是从基址到目标,也就是你追溯路径的反序。
添加完成后,CE 会自动解析整条指针链,显示出当前的血量值。
点击 Change pointer 验证——指针条目自动更新,值仍然正确。改成 5000,通关。
━━━━━━━━━━━━━━━━━━━━
追踪流程总结
把整个流程系统化:
- 1. 找到目标数据的动态地址
- 2. 对该地址做代码查找(writes/accesses)
- 3. 从指令中提取偏移量和上一级指针的值
- 4. 搜索上一级指针的值
- 5. 如果找到绿色地址 → 完成,记录整条链
- 如果找到黑色地址 → 回到步骤 2,对这个地址继续追溯
复制代码
每一轮追溯得到一个偏移量,多轮追溯得到完整的偏移量序列。
━━━━━━━━━━━━━━━━━━━━
记录指针链的方法
追踪过程中,建议用笔记记录每一层的信息,避免搞混:
- 目标:血量 = 100
- Level 4: 地址 0x0D000018 = [RSI+18], RSI = 0x0D000000, 偏移 = 0x18
- Level 3: 地址 0x0C00000C = [RCX+0C], RCX = 0x0C000000, 偏移 = 0x0C
- Level 2: 地址 0x0B000014 = [RDX+14], RDX = 0x0B000000, 偏移 = 0x14
- Level 1: 地址 0x0A000010 = [RCX+10], RCX = 0x0A000000, 偏移 = 0x10
- Level 0: 基址 = Tutorial-x86_64.exe+1A2B3C, 偏移 = 0x00
- 指针链: [[[[ base+0x00 ]+0x10]+0x14]+0x0C]+0x18 = 血量
复制代码
━━━━━━━━━━━━━━━━━━━━
常见问题
Q:追踪到某一层发现搜索不到上级指针怎么办?
A:可能偏移量不对,或者你搜索的值已经过时(内存被重新分配了)。解决办法:重新从头开始追踪,速度要快,尽量在内存不变的情况下完成整条链。或者用 Day 10 要学的"指针扫描"功能自动化这个过程。
Q:游戏的指针有多少级?
A:不一定。简单的独立游戏可能只有 1-2 级。复杂的 3A 大作可能有 5-7 级甚至更多。级数越多,追踪越困难,但方法是一样的。
Q:偏移量的顺序总是搞混怎么办?
A:记住一个规则——你追踪的顺序是从目标到基址(反向),在 CE 中添加指针时填写的顺序也是从最里层到最外层(从上到下)。最后一个偏移量(最靠近目标的)填在最下面。
━━━━━━━━━━━━━━━━━━━━
小结
今天我们攻克了 CE 学习中公认的最大难关——多级指针:
多级指针是指针的指针的指针,像俄罗斯套娃
追踪方法是把单级指针的流程重复多次
每层记录偏移量,直到找到绿色基址
在 CE 中添加多级指针时,按层级填写偏移量
如果你成功完成了 Step 8,给自己鼓个掌。很多人学 CE 就卡在这一步放弃了。你没有。
明天 Day 9,我们要面对另一个经典难题:当你和敌人共享同一段代码时,怎么只让自己不掉血而敌人正常掉血。
这就像在手术室里,你要给自己打麻药,但不能影响隔壁床的病人。 |
|