41.【C语言之外】聊聊Cheat Engine官方教程步骤6的思考

0.看前须知

有一定指针概念的基础

推荐阅读前几篇博文:

19.【C语言】指针(重难点)(A) 37.【C语言】指针(重难点)(B)

38.【C语言】指针(重难点)(C) 39.【C语言】指针(重难点)(D)

40.【C语言】指针(重难点)(E)

1.打开官方教程

输入密码098712

官方题目描述:

上一步阐述了如何使用"代码查找"功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,

所以我们需要学习如何利用指针。

在本关的 Tutorial.exe 窗口下面有两个按钮,一个会改变数值,另一个不但能改变数值而且还会改变数值在内存中存储的位置。

这一步,你不需要懂得汇编,但如果懂的话会很有帮助。

首先找到数值的地址,然后再查找是什么改写了这个地址。

再次改变数值,CE 便可以列出找到的汇编代码。 双击一行汇编代码(或选择它并点击"详细信息")并打开"详细信息"窗口以显示详细的信息,用来告诉你当这个指令运行时发生了什么事情。

如果在这条汇编指令中没看到方括号([])的存在,我们就应该查看下一条汇编代码的详细信息,

如果看到了方括号,那很可能表示我们已经找到了需要的指针。

返回到主 cheat engine 窗口 (只要你愿意,你可以保持这个额外的信息窗口为打开状态。如果你要关掉它,那么要记好方栝号中间的代码)并做一次 4 字节的扫描,扫描"详细信息"窗口中告诉你的一串十六进制数值。

扫描完成时它可能返回一个或几百个地址。大多数时候你需要的地址将是最少的一个。现在点击"手工添加地址"按钮,并勾选"指针"选项。

"添加地址"窗口将发生变化,多出了"Address of Pointer(指针地址)"和"Offset (Hex)(偏移量(16进制))"的文本框,以便您键入一个指针的地址和偏移量。

请尽量填入刚才扫描到的地址。

如果汇编指令中的方栝号里存在计算(例如:[esi+12])则把数值部分填在"Offset (Hex)"的文本框中,如果不存在,则让它保持为 0 。

如果看上去是更复杂的计算指令的话(举例说明一下):

EAX\*2+EDX+00000310\] eax=4C 并且 edx=00801234. 这种情况下 EDX 便是数值的指针,而 EAX\*2+00000310 则是它的偏移量, 所以你要填在"Offset (Hex)"的将是 2\*4C+00000310=3A8。(这些都是在十六进制下计算的,你可以使用WINDOWS的计算器,在科学方式下用十六进制计算)。 回到教程,点击"确定"这个地址便会加到 CE 主窗口下方的地址列表中,如果没做错,在地址栏将显示 P-\>xxxxxxxx,而 xxxxxxxx 和你扫描到的地址数值是一致的,如果不一致,那么可能是哪里出错了。 现在, 改变那条指针地址的数值为 5000 并锁定它,然后点击 Tutorial.exe 窗口上的"改变指针"按钮,如果一切正确,"下一步"按钮将变为可点击状态。 备注: 你也可以使用"指针扫描"的方式来查找这个指针地址。

3.精确数值查找

查找100

改变数值再查一次

筛查到一个地址

01914130地址没有用绿色显示,说明不是基址,因此要找指针

3.查找指针

回忆

cpp 复制代码
int a = 653;
int* p = a;

设b变量a存储653,此时&a==01914130

单击改变数值时程序通过改变*p来改变a-->说明指针p改写了a处地址的数据

显然要找出是什么改改写了这个地址

教程中点击

变成

出现了一行汇编代码

解释:mov [edx],eax

把eax的数据移动到[edx]中,这个[edx]含义:把edx寄存器中存储着数据视作地址,把eax的数据移动到这个地址

单击汇编指令查看

发现EDX存储着的值刚好就是01914130

主界面点击查看内存

右击转到地址

填01914130 点确定

发现改地址存储着的数据C2 02刚好是706

所以mov [edx],eax含义 edx==01914130,程序会访问01914130这个地址来改写数据(即把eax的数据覆盖到01914130地址处)

要查edx的位置,先查edx存储着的数据:01914130

(一定要√上HEX,地址都是十六进制显示的)点击新的扫描-->点击首次扫描

筛查到一个结果

右击选

右击选

(00656B0是edx(即指针)所在的地址)

30 41 91 01--倒着写-->01 91 41 30-->刚好是01914130,验证了前面的想法

4.把地址设置为指针

右击00656B0

修改成这样,向Cheat Engine说明是指针,取消十六进制,勾选指针,其余不要动,点确定

变成

P->01914130即指针指向01914130这个地址

注:

0代表edx+0

由于mov [edx],eax中[edx]即[edx+0],所以不用改偏移

这两个数值均为706,指针找的是正确的

原因:

cpp 复制代码
int a = 706;
int* p = a;
printf("%d",*p);
printf("%d",a);

*p和a的打印结果是一样的

5.改变数值为5000

点击改变指针,3s内把指针的数值改为5000

再次点击改变指针

下一步按钮变为可点击状态

相关推荐
forestsea5 分钟前
Java 应用程序CPU 100%问题排查优化实战
java·开发语言
啊阿狸不会拉杆5 分钟前
第十八章:Python实战专题:北京市水资源数据可视化与图书馆书籍管理应用开发
开发语言·python·信息可视化·用户界面
阿ฅ( ̳• ε • ̳)ฅ10 分钟前
C#窗体应用程序连接数据库
开发语言·数据库·c#
学习同学11 分钟前
C++进阶知识复习 1~15
java·开发语言·c++
egoist202327 分钟前
【C++指南】一文总结C++二叉搜索树
开发语言·数据结构·c++·c++11·二叉搜索树
小王努力学编程1 小时前
动态规划学习——背包问题
开发语言·c++·学习·算法·动态规划
f狐0狸x3 小时前
【蓝桥杯每日一题】4.1
c语言·c++·算法·蓝桥杯
ん贤3 小时前
2023第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组(真题&题解)(C++/Java题解)
java·c语言·数据结构·c++·算法·蓝桥杯
满怀10153 小时前
Python扩展知识详解:lambda函数
开发语言·python
佚名涙4 小时前
go中锁的入门到进阶使用
开发语言·后端·golang