Cheat Engine Tutorial(1-7)

最近在玩一个游戏,发现不修改数据,很难让我过关,所以我想到了CE, 虽然很多年前用过,属于基本应用,没有特别深入,这次为了游戏,系统的学习一下,做个教程,留住记忆吧。

这篇主要是练习 Cheat Engine 帮助部分的 Check Engine Turtorial 部分, 主要使用的CE 为最新的7.5版本, 如下图:

主界面

本身英文也不是很好,所以通过机翻的方式翻译题目,离谱的地方会尽量手翻修正,希望能更好的让大家理解。

1. Welcome to the Cheat Engine Tutorial (v3.6)

如图:

Cheat-Engine-Tutorial-1

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
欢迎使用 Cheat Engine 教程(版本 3.6)。

本教程将教您如何在视频游戏中进行作弊。它还将向您展示使用 Cheat Engine(简称 CE)的基础知识。按照下面的步骤开始操作。

1:如果尚未运行 Cheat Engine,请打开它。
2:点击“打开进程”图标(在“文件”下方,最左边的一个带有电脑图标的图标)。
3:现在打开了进程列表窗口,请在列表中寻找本教程的进程。它可能类似于“00001F98-Tutorial-x86_64.exe”或“0000047C-Tutorial-i386.exe”(前8个数字/字母可能会不同)。
4:找到进程后,点击选择它,然后点击“打开”按钮(现在不用担心其他按钮,如果有兴趣的话,以后可以了解更多)。

恭喜!如果您一切操作正确,进程窗口应该消失,Cheat Engine 现在已经连接到教程(您将在 CE 的顶部中心位置看到进程名称)。

点击下方的“下一步”按钮继续,或填写密码并点击“确定”按钮继续下一步。

如果遇到问题,您可以前往 forum.cheatengine.org,然后点击“教程”查看面向初学者的指南!

按步骤附加到进程,如下图:

CE-Tutorail-1-1

然后点击 Tutorail-i386 上的 Next 或是 OK 进入到 Step 2(这一步我是没找到相关需要操作的地方,所以直接进入到 Step2)。

2. Step2

如图:

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
第2步:精确值扫描(密码=090453)
现在您已经使用 Cheat Engine 打开了教程,我们继续下一步。

您可以在窗口底部看到文本“Health: xxx”。每次点击“Hit me”按钮时,您的生命值都会减少。

为了进行下一步操作,您需要找到这个值并将其更改为1000。

有不同的方法可以找到这个值,但我将告诉您最简单的一种方法,即“精确值”:
首先确保值类型至少设置为2字节或4字节。1字节也可以工作,但当您找到地址并想要更改它时,可能会遇到一个容易解决的问题。如果地址后面的字节是0,8字节也可能起作用,但我不会赌这个。
单精度、双精度和其他扫描方法都不起作用,因为它们以不同的方式存储值。

当值类型正确设置后,确保扫描类型设置为“精确值”。
然后在值框中填入您的生命值,并点击“首次扫描”。
经过一段时间(如果您的计算机非常慢),扫描就完成了,并且结果会显示在左侧的列表中。

如果找到的地址不止一个,您不确定哪个地址是正确的,请点击“Hit me”按钮,将新的生命值填入值框中,然后点击“下一次扫描”。
重复此过程,直到确定找到为止(这包括列表中只有一个地址)。

现在在左侧的列表中双击地址。这会使地址在底部的列表中弹出,并显示当前值。
双击该值(或选择它并按回车键),将值更改为1000。

如果一切顺利,下一步按钮将变为可用状态,您已准备好进行下一步操作。

注意:
如果在扫描过程中出现任何错误,请点击“新扫描”并重新进行扫描。
另外,尝试调整值并点击“Hit me”按钮。

首先,如上图显示 Health: 100 根据提示,我们使用 精确值 Exact Value 和 选择 4 Bytes 的值大小,在值得输入框中输入: 100 , 然后点击 First Scan, 如下图:

然后点击 Hit me 更改 Health 得值,如下:

然后重新回到 CE 窗口,在 Value 中输入 98, 然后 Next Scan 一下,就能得到:

我们看到得到一个地址值,我们选中这个值到地址栏,然后修改题目要求,为1000, 如下:

然后确定,我们就能看到 Next 已经变成 Enable 了,如下:

3. Step3

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
第3步:未知初始值(密码=419482)
好的,既然您已经知道如何使用精确值找到一个值,我们继续下一步。

首先,请确保您正在进行新的扫描。因此,您首先需要点击“新扫描”以开始新的扫描。(您可能认为这很简单,但会有许多人在这一步卡住)我不会再解释这一步,所以记住这一点。
现在,您已经开始了新的扫描,我们继续。

在上一次测试中,我们知道了初始值,所以我们可以进行精确值搜索,但现在我们有一个状态栏,我们不知道初始值是多少。
我们只知道该值介于0和500之间。每次点击“Hit me”按钮,您都会失去一些生命值。每次失去的数量显示在状态栏上方。

同样,有几种不同的方法可以找到该值(例如通过减小的值进行扫描),但我只解释最简单的方法,“未知初始值”和“减小的值”。
因为您不知道当前值是多少,精确值不会起作用,所以选择扫描类型为“未知初始值”,值类型仍然是4字节(大多数 Windows 应用程序使用4字节)。点击“首次扫描”并等待扫描完成。

当扫描完成后,点击“Hit me”按钮。您会失去一些生命值(失去的数量会在几秒钟内显示,然后消失,但您不需要关注这个)。
现在回到 Cheat Engine,选择“减小的值”并点击“下一步扫描”。
当扫描完成后,再次点击“Hit me”按钮,并重复上述步骤,直到只找到几个地址为止。

我们知道该值介于0和500之间,所以选择最有可能是我们需要的地址,并将其添加到列表中。
现在将生命值更改为5000,以继续进行下一步操作。

我们首先重新开一个 New Scan ,然后选择 Value Between4 Bytes, 然后填入 0500 ,如下图:

然后 First Scan, 如下图:

完成了第一次扫描之后,因为每次点击都是减小值,所以我们重新设定 Scan Type 为 Decreased Value ,如下图:

然后点击程序中得 Hit Me 然后再CE中点击 Next Scan:

我们发现也没什么变化,那么重复几次这个过程,就能得到改变得地址,如下:

然后修改为 5000 就会是 Next 按钮变成可用状。

4. Step4

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
第4步:浮点数(密码=890124)
在上一个教程中,我们使用了字节进行扫描,但一些游戏会将信息存储为所谓的“浮点数”表示法。
(可能是为了防止简单的内存扫描器轻易找到它)
浮点数是带有小数点后面一些数字的值(例如5.12或11321.1)。

下面您可以看到您的生命值和弹药。它们都以浮点数表示,但生命值以float存储,而弹药以double存储。
点击“Hit me”按钮失去一些生命值,并点击“Shoot”按钮将您的弹药减少0.5。

您必须将这两个值都设置为5000或更高才能继续进行。

在这里,精确值扫描将工作得很好,但您也可以尝试其他类型的扫描。

提示:double类型得建议禁用快速扫描:Fast Scan

有上面的基础,我们直接略过一些步骤,扫描类型选择 float ,第二个值一会选择 double 类型,因为可以用 Exact Value,目前没有问题,等遇到了其他情况可以具体分析。如下图:

然后修改地址栏中得两个值都为 5000 即可进入到下一步。

5. Step5

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
第5步:代码查找器(密码=888899)
有时候,一个值的位置在重新启动游戏时或者在游戏过程中可能会发生变化。在这种情况下,您可以使用两个方法来创建一个仍然有效的表格。在本步骤中,我将尝试描述如何使用“代码查找器”功能。

下面的值每次开始教程时都会位于不同的位置,因此普通的地址列表中的条目将不起作用。
首先,尝试找到该地址(假设您已经知道如何进行这个操作)。
当找到地址后,在 Cheat Engine 中右键单击该地址,然后选择 “ Find out what writes to this address ” 。一个窗口将弹出,并显示一个空的列表。
然后,点击本教程中的“Change value”按钮,并返回到 Cheat Engine。如果一切正常,现在应该有一个带有汇编代码的地址。
点击它,并选择“替换”选项,将其替换为不执行任何操作的代码。这也将在“高级选项”窗口的代码列表中添加该代码地址(如果保存了表格,它将被保存)。

点击“Stop”,以便游戏正常运行,并点击“Close”关闭窗口。
现在,点击“Change value”,如果一切正常,下一步按钮应该变为可用状态。

注意:当您使用足够快的速度冻结地址时,下一步按钮可能会变为可见状态。

还是重新开始一个扫描,然后得到改变得地址如下:

然后我们右键选择 Find out what writes to this address, 如下图:

出现如下图所示得窗口,然后我们点击教程得 Change Value 就能出现写入改变值地址得汇编内容:

然后地址这个窗口中得 Replace 就会出现一个汇编来改变内容:

1
mov [eax], ebx

我们随意修改这个汇编指令,如下:

1
mov [eax], 500

然后点击教程中得 Change Value 那么 Next 就变为可用状态:

注:

其实地址得数据可以直接修改,至于修改值后不能使 Next 变为可用,是教程开发上的原因。

6. Step6

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
第6步:指针(密码=098712)
在上一步中,我解释了如何使用代码查找器处理位置变化的情况。但仅仅使用这种方法很难找到要设置所需值的地址。
这就是为什么会有指针的存在:

在底部,您会找到两个按钮。一个按钮用于更改值,另一个按钮用于更改值和值的位置。
在这一步中,您实际上不需要了解汇编语言,但如果您了解汇编语言,会对您有很大帮助。

首先找到该值的地址。找到地址后,使用“Find out what accesses this address”功能来查找访问该地址的代码。
再次更改该值,列表中将显示一个条目。双击该条目(或选择并单击“更多信息”),将打开一个新窗口,详细说明指令运行时发生的情况。
如果汇编指令在 '[' 和 ']' 之间没有任何内容,请使用列表中的另一个条目。
如果有内容,它将显示它认为您所需的指针的值。
返回到 Cheat Engine 的主窗口(如果您愿意,可以保持此额外信息窗口打开,但如果关闭它,请记住 '[' 和 ']' 之间的内容),并对该额外信息提供的值进行16进制的4字节扫描。
扫描完成后,可能会返回1个或几百个地址。!大多数情况下,您所需的地址将是最小的地址。然后点击“Add Address Manually”按钮,并选择指针复选框。

窗口将更改,并允许您输入指针的地址和偏移量。
填入刚才找到的地址。它可以是形如:“Tutorial-i386.exe”+xxxxxx(相对于进程的地址)的形式,
或者您可以双击地址将其添加到地址列表中,并使用出现在那里的绝对地址。
如果汇编指令末尾有一个计算(例如:[esi+12]),请在地址字段上方输入在末尾的值。这是偏移量。否则将其保留为0。如果是更复杂的指令,请参考以下计算。

更复杂指令的示例:
[EAX2+EDX+00000310] eax=4C,edx=00801234。
在这种情况下,EDX 将是指针的值,而 EAX2+00000310 将是偏移量,因此您要填写的偏移量将是 2*4C+00000310=3A8。(这都是16进制,使用 Windows 的计算器(calc.exe)在程序员模式下计算16进制值。)

回到教程中,点击“确定”,地址将被添加。如果一切顺利,地址将显示为 P->xxxxxxx,其中 xxxxxxx 是您找到的值的地址。如果不正确,则表示您做错了什么。
现在,使用您添加的指针将该值更改为5000,并点击“Active”列以冻结它。然后点击“Change pointer”,如果一切顺利,下一步按钮将变为可见状态。

额外信息:
您还可以使用指针扫描器来查找指向该地址的指针。https://cheatengine.org/help/pointer-scan.htm

还是通过上面的方法找到地址,然后右键 Find out what accesses this address , 如下图:

打开窗口,然后我们点击课程的 Change Value 按钮,就可以得到值,如下图:

其中第二汇编就是需要的内容: mov [edx], eax, 原因可以看下图,赋值的 eax = 451

其他的汇编内容,可以自行查看,和本身的内容没有太多关系。

我们找到上图的 EDX 的值为: 016D6030 我们搜索这个值,如下图:

我们把这个地址手动添加到地址栏中

注意: 这个地方一定选择指针和添加途中的地址形式,要不后续的操作不对,这个是本身CE在做内容锁定的时候需要的地方,我尝试过使用使用地址,而不是指针的形式,是锁定不了的。

然后如下图:

然后我们改变值和改变地址尝试看看变化:

我们看到,即使改变地址,我们指针指向的还是正确的值, 那么我们修改值为 5000, 并且锁定这个指针,点击教程中的按钮, 如下图:

我们看到成功解锁了这个程序。

7. Step7

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
第7步:代码注入(密码=013370)
代码注入是一种技术,您通过将一段代码注入到目标进程中,然后将代码的执行重定向到您自己编写的代码中。

在本教程中,您有一个生命值和一个按钮,每次点击按钮时,生命值会减少1。
您的任务是使用代码注入使按钮每次点击时生命值增加2。

首先找到该地址,然后找出对其进行写入的代码。
然后,当您找到减少生命值的代码时,在反汇编器中浏览到该地址,并打开自动汇编器窗口(Ctrl+A)。
在那里,点击模板,然后选择代码注入,并给它减少生命值的地址(如果没有正确填写)。
这将生成一个基本的自动汇编器注入框架,您可以在其中编写您的代码。

请注意 alloc 这一行,它将为您的代码洞分配一个内存块,在过去,在 Windows 2000 之前的系统中,人们必须在内存中找到代码洞(游戏未使用的内存区域),但幸运的是,这已经成为过去式,因为从 Windows 2000 开始,由于 XP 的 SP2 和新 CPU 的 NX 位,尝试使用这些代码洞将导致错误。

还请注意 newmem: 和 originalcode: 这两行以及“在此处放置您的代码”文本。
正如您猜到的那样,在此处编写代码,该代码将使生命值增加2。
在这种情况下,一个有用的汇编指令是“ADD 指令”。

以下是几个示例:
"ADD [00901234],9" 表示将地址 00901234 处的值增加9
"ADD [ESP+4],9" 表示将 ESP+4 所指向的地址的值增加9
在这种情况下,您将使用与原代码中减少生命值的部分相同的内容放在方括号中。

注意:
建议删除原代码部分中减少生命值的行,否则您将不得不将生命值增加3(您增加2,原代码减少1,因此最终结果是增加2),这可能会变得令人困惑。但这完全取决于您和您的编程。

注意2:
在某些游戏中,原代码可能由多个指令组成,并且有时(并非总是)可能发生的是,其他位置的代码跳转到您的跳转指令中,这会导致未知的行为。如果发生这种情况,通常应在该指令附近查看跳转并进行修复,或者甚至可以选择使用不同的地址进行代码注入。只要您能够在注入的代码中找到更改的地址即可。

首先通过上面的方法找到地址位置,然后右键菜单:Find out what writes to this address, 看到汇编内容如下:

按题目要求,我们尝试修改一下这条汇编,从原有的减少1到增加2, 如下:

我们点击 Hit Me 发现已经通过测试:


Cheat Engine Tutorial(1-7)
https://xxxxnnxxxx.github.io/2023/07/09/Cheat Engine Tutorial(1-7)/
作者
xxxxnnxxxx
发布于
2023年7月9日
许可协议