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,则不扣血,反之执行正常逻辑:
即可完成。