最近在玩一个游戏,发现不修改数据,很难让我过关,所以我想到了CE, 虽然很多年前用过,属于基本应用,没有特别深入,这次为了游戏,系统的学习一下,做个教程,留住记忆吧。
这篇主要是练习 Cheat Engine 帮助部分的 Check Engine Turtorial 部分, 主要使用的CE 为最新的7.5版本, 如下图:
本身英文也不是很好,所以通过机翻的方式翻译题目,离谱的地方会尽量手翻修正,希望能更好的让大家理解。
1. Welcome to the Cheat Engine Tutorial (v3.6) 如图:
题目:
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,然后点击“教程”查看面向初学者的指南!
按步骤附加到进程,如下图:
然后点击 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 Between
和 4 Bytes
, 然后填入 0
到 500
,如下图:
然后 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
就会出现一个汇编来改变内容:
我们随意修改这个汇编指令,如下:
然后点击教程中得 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
发现已经通过测试: