Cheat Engine 提供了一些简单的 Demo 入门,来玩玩。

第一关

很简单,直接下一步即可。

第二关-精确值扫描

扫描两次数值即可。

第三关-未知的初始值

通过介绍,使用“未知的初始值”和“减少的数值”找到最像的即可通关。

第四关-浮点数

Cheat Engine 把一切都处理好了,按照他的提示,我们查找范围内的数值,并对双精度浮点数关闭快速搜索。事实上,双精度浮点数应当是 8 字节对齐的值。我本以为会用到 IEEE754 的知识,但我想多了。

这两个值都很容易找到:

第五关-代码查找

看起来是这么个意思:在“找出是什么改写了这个地址”之后,我们通过替换功能将这一段代码替换为 nop,然后程序里面判断如果这一段变成了 nop 就可以下一步了。嗯,就是这样。

第六关-指针

按照提示,我们首先可以找到这个位置:

这一段实际上是将 eax 的值放入 [rdx] 中,而 rdx 的值又是 [Tutorial-x86_64.exe+325AD0] 的值,实际上就是:Tutorial-x86_64.exe+325AD0 保存了一个指针,在运行中,首先从 Tutorial-x86_64.exe+325AD0 指向的内存获取地址放入 rdx 中,在从 rdx 指向的地址获取目标值。

点击右侧的详细信息,CE 会提示可能的指针:

为什么这个指针是 0x015660F0 呢?它实际上是 rdx 的值,也就是 [Tutorial-x86_64.exe+325AD0] 的值。接下来我们去查找这个值。

我们可以轻松找到这个值,将其添加进下面的列表中后我们根据这个地址手动添加地址。

这样我们就可以用指针的形式添加了:

修改数值并激活,轻松解决。

第七关-代码注入

通过反汇编程序中工具的自动汇编功能,直接修改原始代码即可:

第八关-多级指针

首先找到一级指针

找到一级指针位置,它是由 rsi+0x18设置的。

总结:一级指针偏移为 0x18,下一个目标地址为 0x0154C620


接下来找第二级指针,去看 rsi 在哪里被赋值的,在内存中搜索 rsi 当前的值 0x0154C620:

找到这个值之后去寻找哪里访问了这个值:

第二条指令就是我们需要的内容。它将 [rsi] 的值放进 rsi 中。

此时 rsi 的值是 0x0154C620,说明 [rsi] 的内容就是 0x0154C620。我们之前在内存中搜索到只有一个地址存放的值是它,就是 0x0154C560:

总结:二级指针偏移为 0,下一个目标地址为 0x0154C560


我们前向搜索 0x0154C560:

这一段能搜到两个结果,但是只有一个地址能在被访问时捕捉到信息(在这里是第二个)

我们仿照之前的结果继续搜索:

找到 0x015B6990。

总结:三级指针偏移为 0x18,下一个目标地址为 0x015B6990


继续搜索全局:

搜索访问:

总结:四级指针偏移为 0x10,下一个目标地址为 0x0154B300。


我们继续搜索 0x0154B300:

好哎,找到了基址,这样就找到整个指针链了:

接下来添加指针,修改值即可通关。

第九关-注入++

尝试自动执行一下,左边健康值少的是玩家,健康值多的是电脑。我们需要让电脑打我们的时候不掉血(甚至自动加血)。由于攻击用的是同一套逻辑,我们需要区分自己与敌人。

先找到玩家们健康的地址(注意,重新启动游戏会让地址变化)

然后找一下攻击的位置:

玩家1的血量位置:

位于 [$rbx+0x8] 也就是 [0x028528B8]

同理,可以找到其他玩家的血量地址:

  • 玩家 1:[0x028528B8]
  • 玩家 2:[0x0286AC78]
  • 玩家 3:[0x028928C8]
  • 玩家 4:[0x028AAX88]

一般来说玩家的信息都是用结构体保存的,因此我们可以看看这些地址附近的信息:

玩家1:

玩家2:

玩家3:

玩家4:

看上去 [$rbx+0x14] 的位置是标记友方和敌人的位置:我方的标记为1,敌人的标记为2。我们可以从这里入手解决问题。我们可以找到改写血量的位置是 0x10002F25D。

那么我们替换该位置的代码即可:如果 [$rbx+0x14] 的值为 1,则不扣血,反之执行正常逻辑:

即可完成。