冒险岛079

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1|回复: 0

Day 8 -- 多级指针:俄罗斯套娃式的内存寻址

[复制链接]

701

主题

13

回帖

2235

积分

管理员

积分
2235
发表于 3 小时前 | 显示全部楼层 |阅读模式
Day 8 -- 多级指针:俄罗斯套娃式的内存寻址
Cheat Engine 从入门到住院 · Day 8

Day 6 我们学了指针:一个固定地址里存着目标数据的动态地址。一级指针,简洁明了。

但现实世界没这么简单。很多游戏的数据结构是这样的:
  1. 固定地址 → 指针A → 指针B → 指针C → 血量
复制代码

就像你想找一个人,先打电话给他妈妈,他妈妈说"去问他老婆",他老婆说"去问他同事",同事终于告诉你他在哪。

这就是多级指针,CE Tutorial 的 Step 8 就是来折磨你这个的。

━━━━━━━━━━━━━━━━━━━━

本文你将学到

  • 多级指针的结构和原理
  • 如何手动追踪多级指针链
  • CE 中添加多级指针的方法
  • 追踪指针链的系统化流程
    阅读时间:15 分钟 | 实操时间:40 分钟 | 难度:进阶偏难

    ━━━━━━━━━━━━━━━━━━━━

    CE Tutorial Step 8:多级指针

    进入 Step 8。血量、Change value、Change pointer 按钮。

    这一步的指针不是一级的,而是四级。你需要找到一条从静态地址(绿色)出发,经过四级指针最终到达血量的完整路径。

    ━━━━━━━━━━━━━━━━━━━━

    多级指针的结构

    一级指针:
    1. [基址] + 偏移量 = 目标地址
    复制代码

    四级指针:
    1. [[[[基址] + 偏移1] + 偏移2] + 偏移3] + 偏移4 = 目标地址
    复制代码

    用具体数字举例:
    1. 基址 0x00400000 里存的值 = 0x0A000000
    2.   0x0A000000 + 0x10 = 0x0A000010
    3.   0x0A000010 里存的值 = 0x0B000000
    4.     0x0B000000 + 0x14 = 0x0B000014
    5.     0x0B000014 里存的值 = 0x0C000000
    6.       0x0C000000 + 0x0C = 0x0C00000C
    7.       0x0C00000C 里存的值 = 0x0D000000
    8.         0x0D000000 + 0x18 = 0x0D000018
    9.         0x0D000018 = 血量(100)
    复制代码

    每一层都是"读取当前地址的值,加上偏移量,得到下一层的地址"。

    ━━━━━━━━━━━━━━━━━━━━

    手动追踪多级指针

    追踪多级指针的方法就是把 Day 6 学的流程重复多次。

    第一步:找到血量地址

    老方法,快速找到血量的动态地址,假设是
    1. 0x0D000018
    复制代码


    第二步:找到什么代码在写入这个地址

    右键 → Find out what writes to this address。

    点 Hit me,看到指令类似:
    1. mov [rsi+18], eax
    复制代码

    Extra info 显示:
    1. RSI = 0x0D000000
    复制代码

    这告诉我们:
  • 偏移量 =
    1. 0x18
    复制代码
  • 上一级指针指向
    1. 0x0D000000
    复制代码

    第三步:找到谁存了 0x0D000000

    现在搜索值为
    1. 0x0D000000
    复制代码
    的地址(十六进制,8 Bytes)。

    找到一个地址,比如
    1. 0x0C00000C
    复制代码


    第四步:对 0x0C00000C 做同样的事

    右键 → Find out what accesses this address。

    在另一个操作中触发对这个地址的访问,看到指令:
    1. mov rdi, [rcx+0C]
    复制代码

    Extra info:
    1. RCX = 0x0C000000
    复制代码

  • 偏移量 =
    1. 0x0C
    复制代码
  • 上一级指向
    1. 0x0C000000
    复制代码

    第五步:继续向上追溯

    搜索
    1. 0x0C000000
    复制代码
    ,找到地址
    1. 0x0B000014
    复制代码


    对这个地址做代码查找,发现指令:
    1. mov rbx, [rdx+14]
    复制代码

  • 偏移量 =
    1. 0x14
    复制代码
  • 上一级指向
    1. 0x0B000000
    复制代码

    第六步:再上一层

    搜索
    1. 0x0B000000
    复制代码
    ,找到地址
    1. 0x0A000010
    复制代码


    代码查找发现:
    1. mov rax, [rcx+10]
    复制代码

  • 偏移量 =
    1. 0x10
    复制代码
  • 上一级指向
    1. 0x0A000000
    复制代码

    第七步:搜索 0x0A000000

    搜索这个值,如果找到一个绿色地址(比如
    1. Tutorial-x86_64.exe+1A2B3C
    复制代码
    ),恭喜,你到达了指针链的起点。

    基址偏移 =
    1. 0x00
    复制代码
    (如果绿色地址里直接存的就是
    1. 0x0A000000
    复制代码


    第八步:在 CE 中添加多级指针

    点击 Add Address Manually,勾选 Pointer,然后:
    1. 基址:Tutorial-x86_64.exe+1A2B3C
    2.   偏移 0: 10
    3.   偏移 1: 14
    4.   偏移 2: 0C
    5.   偏移 3: 18
    复制代码

    点击 "Add Offset" 按钮来添加多层偏移。注意偏移量的顺序是从基址到目标,也就是你追溯路径的反序。

    添加完成后,CE 会自动解析整条指针链,显示出当前的血量值。

    点击 Change pointer 验证——指针条目自动更新,值仍然正确。改成 5000,通关。

    ━━━━━━━━━━━━━━━━━━━━

    追踪流程总结

    把整个流程系统化:
    1. 1. 找到目标数据的动态地址
    2. 2. 对该地址做代码查找(writes/accesses)
    3. 3. 从指令中提取偏移量和上一级指针的值
    4. 4. 搜索上一级指针的值
    5. 5. 如果找到绿色地址 → 完成,记录整条链
    6.    如果找到黑色地址 → 回到步骤 2,对这个地址继续追溯
    复制代码

    每一轮追溯得到一个偏移量,多轮追溯得到完整的偏移量序列。

    ━━━━━━━━━━━━━━━━━━━━

    记录指针链的方法

    追踪过程中,建议用笔记记录每一层的信息,避免搞混:
    1. 目标:血量 = 100
    2. Level 4: 地址 0x0D000018 = [RSI+18],    RSI = 0x0D000000,  偏移 = 0x18
    3. Level 3: 地址 0x0C00000C = [RCX+0C],    RCX = 0x0C000000,  偏移 = 0x0C
    4. Level 2: 地址 0x0B000014 = [RDX+14],    RDX = 0x0B000000,  偏移 = 0x14
    5. Level 1: 地址 0x0A000010 = [RCX+10],    RCX = 0x0A000000,  偏移 = 0x10
    6. Level 0: 基址 = Tutorial-x86_64.exe+1A2B3C, 偏移 = 0x00
    7. 指针链: [[[[ 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,我们要面对另一个经典难题:当你和敌人共享同一段代码时,怎么只让自己不掉血而敌人正常掉血。

    这就像在手术室里,你要给自己打麻药,但不能影响隔壁床的病人。
  • 您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    果子博客
    扫码关注微信公众号

    Archiver|手机版|小黑屋|风叶林

    GMT+8, 2026-3-29 20:23 , Processed in 0.195557 second(s), 20 queries .

    Powered by 风叶林

    © 2001-2026 Discuz! Team.

    快速回复 返回顶部 返回列表