Cheat Engine安装汉化,指南和游戏指南教程
Cheat Engine
简介
- Cheat Engine官网 https://www.cheatengine.org/
- Git 地址 https://github.com/cheat-engine/cheat-engine/
- 官方视频教程 https://www.youtube.com/@cheat_engine
- 官方wiki https://wiki.cheatengine.org/index.php?title=Main_Page
Cheat Engine是一款开源的作弊引擎。带有一个内存扫描仪,可以快速扫描游戏中使用的变量并允许您更改它们,但它还带有调试器、反汇编器、汇编器、speedhack、训练器制造商、直接 3D 操作工具、系统检查工具等,这些工具对普通程序员和软件分析师也很有用。
除了这些工具之外,它还具有广泛的脚本支持,使经验丰富的开发人员可以轻松创建自己的应用程序并与其他人共享。
以上简介来源Cheat Engine官网。
安装
在Cheat Engine官网下载Cheat Engine。
在官网最上面最大的绿色按钮,Download Cheat Engine
点击这个下载。
汉化
-
打开这个面页Cheat Engine官网下载面页
-
复制
Translations
按键Ctrl+F
打开搜索 -
下载
Chinese Simplified translation files (ch_CN)
-
在桌面鼠标右键,打开文件所在位置,进入
languages
文件夹,或者路径C:\Program Files\Cheat Engine 7.5\languages
,把刚刚下载的汉化语言包解压到该文件夹下。
-
切换Cheat Engie语言设置
打开设置
双击选择ch_cn
,或者在右边选择Select Language
。OK重启软件生效。
Cheat Engine Tutorial
这个是最基础的教程,在下面这个图片的位置打开。
这个教程里面,每一关都有密码,输入密码可以直接跳转到其他关卡。
步骤1:简介
在这个关卡,主要是一个介绍,可以自己详细的阅读。重要的是留意窗口右下角的密码输入框,这里填入关卡密码可以直接跳转到相应的关卡。
步骤 2: 精确值扫描 (密码=090453)
现在你已经在 Cheat Engine 中打开了训练程序,为我们下一步的练习做好了准备。
本窗口的左下方显示的"健康:XXX",
在你每次点击"打我"按钮时,它的值便会减少。
要进入下一关,你必须找到这个数值并把它改成 1000 。
很多方法都可以找到这个数值的位置,但我将告诉你一个最简单的方法,“精确数值"扫描:
首先确认数值类型设置为2字节或4字节,设置成1字节也可以的,不过最终修改数据的时候便会有点麻烦了(虽然说这是很容易解决的问题)。假如该地址后边的字节数值都为 0 ,
那么你设置成 8 字节也未尝不可,
在这我们就不必尝试了。单浮点数,双浮点数,以及其他的扫描方法在这里行不通的,因为它们储存数值的方式不同。
当数值类型设置正确后,确认扫描类型设置了"精确数值”,把健康值填写在数值的输入框,并点击"首次扫描",稍等一会儿(假设你的电脑非常的慢),扫描完毕,扫描的结果将会显示在主界面的左侧。
如果检索结果多于一个,你无法确定哪一个是正确的地址,那么继续点击"打我",并将变更后的"健康值"填写在数值输入框中,点击"再次扫描",重复这些步骤,直到你能确认已经找到了地址(在地址列表中只有一个地址)。
好,双击左侧列表中的地址,该地址便会移动到下方的地址列表中并显示它的当前数值。r
双击下方地址列表中的数值(或者选择它,按下回车),填写你要修改的数值:1000 。
如果操作正确,"下一步"按钮将变成可点击状态,本关就完成了。
提示:
如果你在扫描过程中出现了错误,可以点击"新的扫描"重新再来。当然,你也可以点击"打我"去查找一些更有价值的线索。
- 提取信息:
- 上面说明,这个值的类型不是单浮点数,双浮点数。
- 数值的类型为2字节或4字节。一般i386是32位的应用
- 目标:找到这个数值并把它改成1000。
- 原理:利用Cheat Engine的内存扫描功能。使用Cheat Engine修改功能。
- 过程:
-
打开进程
-
查看当前健康值
-
先使用4字节扫描,因为32位程序的一个位宽就是4字节。然后点击
首次扫描
-
回头点击一次
打我
,目的是令健康值发生变动。 -
填入98,点击
再次扫描
-
双击把地址添加到下方的地址列表
-
在地址列表中,双击数值98,在出现的窗口填入新数值1000
-
下一步
按钮已经亮起,第一关通过。
-
步骤 3: 未知的初始值 (密码=419482)
OK, 看来你已经理解了如何利用"精确数值"扫描查找数值了,让我们进行下一步。
在上一关中我们知道初始数值的大小,所以我们可以利用"精确数值"扫描,但本关中仅有一个状态栏,我们并不知道它的初始数值。
我们只知道这个数值在0到500之间,并且每次点击"打我"之后便会减些健康值,每次减少的健康值会显示在进度条的上方。
同样有好几种方法可以找这个数值,(例如使用"数值减少了…“扫描方式),但我只教你最简单的方法,“未知的初始值"和"减少的数值”。
由于不知道当前数值的大小,“精确数值"扫描便派不上了用场,所以选择扫描方式"未知初始数值”。数值类型仍然选择 4 字节(这是因为大多数WINDOWS应用程序都使用 4 字节存放数据)。点击"首次扫描"并等待扫描结束。
扫描完成后,点击"打我”,你会减少一些健康值。(减少的健康值显示几秒便会消失,你并不需要刻意记下它)。
回到 Cheat Engine,在扫描类型中选择"减少的数值",然后点击"再次扫描"。
扫描完毕后,再次点击"打我",并重复上述步骤,直到检索出很少的几个地址。
我们已经知道这个数值在0到500之间,所以挑出那个最为相似的地址,并将它加到下方的地址列表。
现在,更改健康值为 5000,以便我们进入到下一关。
- 提取信息:
- 知道它的初始数值
- 这个数值在0到500之间
- 每次点击"打我"之后便会减些健康值
- 选择扫描方式"未知初始数值"。数值类型仍然选择 4 字节
- 目标:更改健康值为 5000
- 原理:利用Cheat Engine的内存扫描功能。使用Cheat Engine修改功能。
- 过程:
- 使用
未知的初始值
进行扫描 - 回头点击一次
打我
- 切换成
减少的数值
,点击再次扫描 - 重复第2、3步骤,直到结果框中的结果数量变少
- 前面已经知道这个数值是0到500之间,所以第一个地址为
0175A200
就是需要查找的地址。双击将地址添加到下方地址列表,修改数值为5000。本关通过。
- 使用
步骤 4: 浮点数 (密码=890124)
在前面的教程中我们使用字节的方式进行扫描,但有些游戏使用了"浮点数"来存储数值(这么做是为了给菜鸟制造一些麻烦,让他们没那么容易修改游戏)。
浮点数是带有小数点的数值(如 5.12 或 11321.1)。
正如本关中的健康和弹药,两者都以浮点方法储存数据,不同的是,健康值为单精度浮点数,而弹药值为双精度浮点数。
点击"打我"将减少一些健康值,而点击"开火"则消耗掉 0.5 的弹药。
你得把这两项都修改到 5000 或者更多才能过关。
"精确数值"扫描的方式虽然也可以完成本关的工作,但你应该试试其它更简练的扫描方式。
提示: 扫描双浮点数类型建议禁用 “快速扫描”
- 提取信息:
- 健康值为单精度浮点数
- 弹药值为双精度浮点数
- 扫描双浮点数类型建议禁用 “快速扫描”
- 目标:健康值和弹药值都修改到 5000 或者更多
- 过程:
“精确扫描”过程,参考步骤3的过程即可。- 关闭
快速扫描
- 按照步骤3同理的操作,修改到5000通关。
- 关闭
步骤 5: 代码查找 (密码=888899)
某些游戏重新开始时,数据会存储在与上次不同的地方, 甚至游戏的过程中数据的存储位置也会变动。在这种情况下,你还是可以简单几步搞定它。
这次我将尽量阐述如何运用"代码查找"功能。
下方的数值每次启动教程的时候都会存放在内存不同的位置,所以地址列表中的固定地址是不起作用的。
我们要先找到这个数值当前的存储地址(要如何去做,相信不用我再啰嗦了)。
当你找到了地址就添加在下方的地址列表中,然后右健单击该地址,在弹出的菜单中选择"找出是什么改写了这个地址",将弹出一个空白的窗口。
接着点击本教程窗体上的"改变数值"按钮,并返回 Cheat Engine 。如果操作没问题 在刚才弹出的空白窗口中会出现一些汇编代码。
选中代码并点击"替换"按钮,将它替换成什么也不做的代码(空指令),同时,修改后的代码也将放置在"高级选项"的代码列表中去(保存地址列表时会同时保存)。
点击"停止",游戏会以正常的方式继续运行下去,点击"关闭"按钮,关掉窗口。
现在,再次点击教程窗口上的"改变数值",没问题的话,"下一步"将变为可点击的状态。
提示:如果你以足够快的速度锁定住该地址,"下一步"按钮也会变为可点击的。
- 提取信息:
- 找到地址后,然后右健单击该地址,在弹出的菜单中选择"找出是什么改写了这个地址"
- 改变数值之后,空白窗口中会出现一些汇编代码
- 选中代码并点击"替换"按钮,将它替换成什么也不做的代码(空指令)
- 目标:点击改变数值变成什么也不做
- 过程:
- 找到地址,右键,点击
找出是什么改写了这个地址
- 附加进程
- 改变数值,便会出现汇编指令。 4. 鼠标右键,使用空指令替代
- 然后刚刚修改的代码,会存放在
高级选项
中 - 再次点击
改变数值
,数值不回被改变,因为执行的是空指令。通关。
- 找到地址,右键,点击
步骤 6: 指针: (密码=098712)
上一步阐述了如何使用"代码查找"功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,
所以我们需要学习如何利用指针。
在本关的 Tutorial.exe 窗口下面有两个按钮,一个会改变数值,另一个不但能改变数值而且还会改变数值在内存中存储的位置。
这一步,你不需要懂得汇编,但如果懂的话会很有帮助。
首先找到数值的地址,然后再查找是什么改写了这个地址。
再次改变数值,CE 便可以列出找到的汇编代码。 双击一行汇编代码(或选择它并点击"详细信息")并打开"详细信息"窗口以显示详细的信息,用来告诉你当这个指令运行时发生了什么事情。
如果在这条汇编指令中没看到方括号([])的存在,我们就应该查看下一条汇编代码的详细信息,
如果看到了方括号,那很可能表示我们已经找到了需要的指针。
返回到主 cheat engine 窗口 (只要你愿意,你可以保持这个额外的信息窗口为打开状态。如果你要关掉它,那么要记好方栝号中间的代码)并做一次 4 字节的扫描,扫描"详细信息"窗口中告诉你的一串十六进制数值。
扫描完成时它可能返回一个或几百个地址。大多数时候你需要的地址将是最少的一个。现在点击"手工添加地址"按钮,并勾选"指针"选项。
"添加地址"窗口将发生变化,多出了"Address of Pointer(指针地址)"和"Offset (Hex)(偏移量(16进制))"的文本框,以便您键入一个指针的地址和偏移量。
请尽量填入刚才扫描到的地址。
如果汇编指令中的方栝号里存在计算(例如:[esi+12])则把数值部分填在"Offset (Hex)"的文本框中,如果不存在,则让它保持为 0 。
如果看上去是更复杂的计算指令的话(举例说明一下):
[EAX2+EDX+00000310] eax=4C 并且 edx=00801234.
这种情况下 EDX 便是数值的指针,而 EAX2+00000310 则是它的偏移量, 所以你要填在"Offset (Hex)"的将是 2*4C+00000310=3A8。(这些都是在十六进制下计算的,你可以使用WINDOWS的计算器,在科学方式下用十六进制计算)。
回到教程,点击"确定"这个地址便会加到 CE 主窗口下方的地址列表中,如果没做错,在地址栏将显示 P->xxxxxxxx,而 xxxxxxxx 和你扫描到的地址数值是一致的,如果不一致,那么可能是哪里出错了。
现在, 改变那条指针地址的数值为 5000 并锁定它,然后点击 Tutorial.exe 窗口上的"改变指针"按钮,如果一切正确,"下一步"按钮将变为可点击状态。
备注:
你也可以使用"指针扫描"的方式来查找这个指针地址。
-
提取信息:
- 首先找到数值的地址,然后再查找是什么改写了这个地址。
- 再次改变数值,CE 便可以列出找到的汇编代码
- 留意详细信息中,方括号([])的存在
-
目标:改变那条指针地址的数值为 5000 并锁定它,然后点击 Tutorial.exe 窗口上的"改变指针"按钮
-
过程:
- 找到地址,并
找出是什么改写了这个地址
- 改变一次数值,打开详细信息,右键复制简易猜测到剪贴板
- 勾选
HEX
,做一次4字节的精确扫描 - 在这个教程里,会得到一个绿色地址的值。鼠标左键选中该这个地址,快捷键
Ctrl+C
可以快捷复制该地址 手动添加地址
,选中指针
- 得到的地址列表如下
- 修改数值为5000,并进行锁定,留着左边
激活
下方的空色交叉。 - 回去改变数值的窗口,点击
改变指针
。通关。
步骤 7: 代码注入: (密码=013370)
代码注入是将一小段你写出的代码注入到目标进程中并执行它的技巧。
在这一步教程中,你将有一个健康值和一个每按一次将减少 1 点健康值的按钮,
你的任务是利用"代码注入",使每按一次按钮增加2点的健康值。
查找这个地址,然后看看是什么在改写它(“找出是什么改写了这个地址”)。
当你看到那条减少数值的汇编代码后,选择"显示反汇编程序",然后打开"自动汇编窗口"(菜单-工具->自动汇编 或 按下快捷键 Ctrl+a ),选择"模板"中的"代码注入"。CE 将自动生成一部分汇编代码并为你输入指令做好准备(如果 CE 没有给出正确的地址,你也可以手工输入它)。
注意 alloc 这部分代码,它会为你的代码分配出一小块空白的内存,过去,在 Win2000 之前的系统,这种行为存在安全隐患,很可能导致系统崩溃,幸运的是,这种情况在 win2000 以后的操作系统得到改善。
也要注意line newmem: 、originalcode: 以及用文本"此处放置你的代码"标示出的空白部分
正如你猜测的, 在这儿可以写下每次增加2点健康值的代码。
在这种情况下推荐你使用 “ADD” 汇编指令,
下面是一些示例:
“ADD [00901234],9” 使 [00901234] 地址的值增加9
“ADD [ESP+4],9” 使地址指针 [ESP+4] 的值增加9
在本关的情况下,你可以使用相同的手法处理减少健康值的那条原代码方括号之间的部分。
提示 1:
推荐你从原代码中删除减少健康值的那行代码,否则你得加 3 点健康值(你增加了3点,原代码减去1点,最终结果才会增加2点),这样看上去很容易让人迷惑,但最终方案还是由你来决定好了。
提示 2:
某些游戏中,原代码可能在多条指令之外,有时候(并非一向如此),它可能由不同的地方跳转至你的指令中并结束运行,其结果可能引起未知的错误;如果出现了这种情况,通常应当查看附近的那些跳转指令,进行修改,或者尝试使用不同地址进行代码注入,确认无误后便可以将你修改的代码注入到原代码中了。
- 提取信息:
- 查找这个地址,然后看看是什么在改写它(“找出是什么改写了这个地址”)
- 看到那条减少数值的汇编代码后,选择"显示反汇编程序"
- 打开"自动汇编窗口"(菜单-工具->自动汇编 或 按下快捷键 Ctrl+a )
- 选择"模板"中的"代码注入"。
-
目标:把打我变成增加健康值,每次增加2点健康值的代码
-
原理:这里的代码注入和inline hook的操作类似,把原来执行的指令跳转到执行自己定义的指令然后再转跳回来。
-
过程:
-
先以4字节搜索找到地址,然后
找出是什么改写了该地址
,点击显示反汇编代码
-
点击
工具
-
选择
自动汇编
-
加入模板,先加入
CT表框架代码
,再加入代码注入
。加入CT
表框架代码是方便存放到地址表。 -
编写令健康值加2的汇编代码,注释了第12行,添加了第10行代码。
-
分配到CT表。这一步你可以选择直接点击自动汇编窗口下方的
Execute
按钮完成,但是这是一次性的,也没有提供到撤销按钮,但是分配到CT表可以自由激活和撤销。
将会出现一个自动汇编脚本在列表里面 -
生效。点击左侧的方框激活。回去点击
打我
,可以加2,通关。
步骤 8: 多级指针: (密码=525927)
在这一步将解释如何使用多级指针。
在第 6 步,你已经清楚 1 级指针的概念和用途,并可以利用数值的首个地址找到存放数据真正的基址。
在本关中,你将看到 4 级指针,它由第一个指针指向第二个指针,再由第二个指针指向第三个指针,由第三个指针指向第四个指针,最终指向健康值的真正地址。
开始的几步与在第 6 步中的操作基本相同。找出是什么访问了这个地址,然后分析汇编指令,查找指针地址中的数值,以及它的偏移量,将它们记下来。但这次你按数值找出的仍然是一个指针,你得依据这些数值,使用同样的操作方法找出指向这个指针的指针。看看是什么访问了你发现的那个指针地址,分析汇编指令,留意可能的代码和偏移量,并加以利用。
持续这种过程,直到不能更进一步查找为止(通常基址为静态时,地址将以绿色标示)。
点击"改变数值"改变健康值,
如果你发现列表中那些指针地址所指向的值发生同样的变化时,那表示你可以试着将基址中的值更改为 5000,并锁定它,以便完成本关的任务了。
备注1: 本步骤也可以使用自动汇编程序脚本或者使用指针扫描器加以解决。
备注2: 在某些情况下,可以改变 CE 软件"代码查找"的相关设置。
当你遇到类似于 mov eax,[eax] 的指令时,调试程序将显示改变之后的寄存器中的值,也许利用它更容易找出指针的位置。
备注3: 你还在读?!当你查看汇编指令时你可能已经注意到,这些指针是在相同的代码块(相同的程序,如果你懂汇编,可以查看程序的起始代码)位置被读写。这种情况并不总会发生,但是当你在查找某个指针遇到问题的时候,没准能起到很大的用处。
-
提取信息:
- 四级指针,第一个指针指向第二个指针,再由第二个指针指向第三个指针,由第三个指针指向第四个指针,最终指向健康值的真正地址
- 第一次定位到地址,先
找出是什么改写了这个地址
- 后面的几级,寻找
找出是什么访问了这个地址
,直到寻找到基址(绿色的地址) - 留意可能的代码和偏移量
-
目标:将基址中的值更改为 5000,并锁定它
-
原理:指针是一种变量,存储的是指向内容的内存地址。所以每次读写变量的时候,需要访问指针,获得里面的内存地址,再去访问内存地址的值。
在这个步骤里面,一级指针存放的是二级指针的地址,当访问到二级指针的时候,发现又是一个指针,于是从二级指针取出三级指针的地址,访问到三级指针的时候,发现又是一个指针,于是从三级指针取出四级指针的地址,访问到四级指针的之后,四级指针存放的地址就是内容存放的地址,就可直接读写四级指针存放的地址对内容进行操作。当然这个操作只是原理解释,在实际程序中,在编译过程已经完成了这一些系列映射,所以真正操作起指针来,效率也很高。
在上面这个指针访问的过程中,假设要向指针写入也给数据,其顺序就是
1.访问一级指针
2.访问二级指针
3.访问三级指针
4.访问四级指针
5.向内容地址写入数据
当我在从变动的数据寻找基地址时,刚好和上面的顺序倒序:
1.精确查找得到地址
2.找出是什么改写了这个地址
3.找出是什么访问了这个地址
4.找出是什么访问了这个地址
5.找出是什么访问了这个地址 -
过程:
-
先使用精确扫描定位到健康值的地址,然后点击
找出是什么改写了这个地址
-
改变一次数值,将会出现想如下的信息,点击
详细信息
可以看到简易猜测的指针。详细信息
的窗口不要关闭,后面需要用来计算偏移量。这个图的右下角的停止调试按钮,推荐停止,大量的捕获这些指令操作可能会导致程序崩溃。
-
复制指针数值,做一次新的4字节精确扫描。可能会出现多个地址,每一个地址都逐一分析即可。
-
我这里扫描出5个结果,全部地址加入到地址列表。然后
找出是什么访问了该地址
-
改变一次数值,对于有效的地址,会出现像如下的结果。对于无效的地址,将不会有指令出现,这时候换一个地址继续查找访问就好。
-
重复第3、4和5的步骤,直到搜索框的结果中出现绿色的地址。
上面存在重新启动Cheat Engine Tutorial程序,所以截图的地址有差异,直接看下面的截图就是完整流程。依次查找到的地址和指针为
-
精确查找得到的地址016AF9F0
-
016AF9F0第一次找出改写,得到指针016AF9D8
-
016AF9D8做一次4字节HEX精确扫描,第一次找出访问得到指针016DDA70
-
做一次4字节HEX精确扫描,第二次找出访问得到指针0173D808
-
做一次4字节HEX精确扫描,第三次找出访问得到指针0175AB18
-
做一次4字节HEX精确扫描,得到基址(绿色地址) :“Tutorial-i386.exe”+2566E0
-
添加地址,从基址一步一步指向内容地址,注意汇编代码[]括号中的偏移。最终指向的地址和精确查找得到的地址016AF9F0一致。
- 修改指针指向的数值,锁定地址。回到窗口改变指针。通关。
-
技巧:
这个关卡也可以使用指针扫描器
查找指针。如果你操作了上面的步骤,建议关闭Cheat Engine Tutorial软件重新打开,输入密码525927跳转到步骤8再尝试。
-
精确查找得到地址017C0148
-
对这个地址进行指针扫描
-
填入精确扫描得到的地址017C0148
-
选择路径保存文件
-
查看结果。可用性自行验证。
步骤 9: 注入++: (密码=31337157)
这一步将会解释如何处理游戏中的共用代码, 这种代码是通用在除了自己以外的其他同类型对像上
常常你在修改游戏的时候, 你找到了一个单位的健康, 或是你自己角色的健康, 你会发现一种情况: 如果你把健康相关代码移除的话,其结果是你的角色无敌, 但你的敌人也无敌了。
在这种情况下, 你必须想办法区分自己与敌人。
有时候很简单, 你只要检查最前面的4个字节(函数指针表), 它通常指向一个独一无二的地址, 代表着游戏玩家角色,而有的时候它是一个团体号码, 或者也可能是一个指针, 它指向另一个指针, 该址针又指向下一个指针,搞不好还指向下下一个指针, 最后指向一个玩家名字。总之完全取决于游戏的复杂度, 以及你的运气
最简单的方法是以"找出是什么改写了这个地址"去找出游戏代码,然后使用"分析(新/旧)数据/结构"的功能去比较两种结构。(你的单位和敌人的单位)然后看看是不是可以找到一个区分两者的方法。
当你找到如何区分你和电脑单位的方法后,你可以注入一段自动汇编脚本来检查状态,然后看是要运行游戏的代码还是要做其他的修改。(例如一击必杀)
另外, 你还可以用这个方法去创建一般所说的"字节数组"的字串, 它可以用来搜寻并产生一份所有你的单位或是敌人单位的列表
在这个教程中, 我已经实现了你将会玩到的最惊人的游戏.
这个游戏有4个玩家。2个属于你的阵容, 另外两个属于电脑方。
你的任务是找到改写健康的代码, 并且修改以至于你可以获得胜利,但"绝不能"使用锁定HP的方法.
完成修改以后, 请按 “重新启动游戏并自动执行” 来测试你的修改是否正确
提示1: 健康是一个单浮点数
提示2: 解法不只一种
-
提取信息:
- 游戏有4个玩家。2个属于你的阵容, 另外两个属于电脑方
- 找到改写健康的代码, 并且修改以至于自己可以获得胜利
- "绝不能"使用锁定HP的方法.
-
目标:干死电脑玩家,己方玩家不能死
-
过程:
- 先通过步骤8的方法找到四个玩家的健康值。
表格单位均为十六进制
地址 | 基址 | 一级偏移 | 二级偏移 | 数值类型 |
---|---|---|---|---|
玩家1 | “Tutorial-i386.exe”+2566F0 | 4f8 | 4 | 单浮点 |
玩家2 | “Tutorial-i386.exe”+2566F0 | 4fc | 4 | 单浮点 |
玩家3 | “Tutorial-i386.exe”+2566F0 | 500 | 4 | 单浮点 |
玩家4 | “Tutorial-i386.exe”+2566F0 | 504 | 4 | 单浮点 |
- 可以看出 ,指向几个玩家健康值的指针,只有
一级偏移
有改变,改变的值均为十六进制的4,等于十进制的32,等于32位程序的一个指针占用长度。猜测可以分析一级指针指向的地址,估计就是单个玩家的所有数据存放的地址。 - 查看一级指针指向的地址
地址 | 一级偏移指向的地址 |
---|---|
玩家1 | 0689DCE8 |
玩家2 | 02790078 |
玩家3 | 027D0080 |
玩家4 | 027E8420 |
- 浏览相关内存区域
- 分析数据/结构
- 填入第3点找出的地址
-
打开的时候会这样
-
修改群组名。在群组名鼠标右键
-
添加群组
-
向群组添加地址。先点击一次想添加地址的群组任意一个输入框,然后如图操作
-
删除群组内的地址,或把群组内的地址移动到其他群组
-
把地址添加完毕后,定义一个新的内存结构。
-
最终比较,得到不同的值,于0x10偏移的地方,己方阵营为1,地方阵营为2。0x10偏移这个地方的值,并不知道是用来标识什么,这里只是作为一个可以区分敌我阵营的值。
-
然后在任意玩家的指针,找出是什么改写了该地址,
找出是什么改写了该指针指向的地址
。攻击一次玩家,得到反汇编代码
-
这里地址注意的是,地址Tutorial-i386.exe+28E8C的操作码是
fldz
,这是一个浮点寄存器相关的地址,在此初级教程中还是不要设计到浮点数操作的相关内容。所以在执行代码注入的时候,选择代码注入的地址应该往前4字节,以避开fldz
这个操作。 -
参考
步骤 7: 代码注入: (密码=013370)
,执行代码注入到Tutorial-i386.exe+28E86,注入以下代码,分配到CT地址表。回到地址表激活自动汇编脚本,重新启动游戏并自动执行,通关。
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
// 如果[ebx+10]==1,直接退出,不更新[ebx+04]的值,不增加也不减少
cmp [ebx+10],1 // 比较偏移为10的地方的值
je exit // 如果cmp地址成功,je命令是jump equal,相等则跳转
originalcode:
mov eax,[ebp-04]
mov [ebx+04],eax
exit:
jmp returnhere
"Tutorial-i386.exe"+28E86:
jmp newmem
nop
returnhere:
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"Tutorial-i386.exe"+28E86:
db 8B 45 FC 89 43 04
//mov eax,[ebp-04]
//mov [ebx+04],eax
到这里,前面的几个步骤已经完成,接下来将会进入游戏范例章节。
Cheat Engine Tutorial Games
在Cheat Engine Tutorial的步骤9点击下一步会自动转跳到这里。或者在图片这里打开
step1
-
游戏说明:
Step 1:
Every 5 shots you have to reloadafter which the target will healTny to find a way to destroy the target
(Click to hide)
第一步:每开5枪你就必须重新装弹,同时目标会恢复健康值。尝试找到一种方法来摧毁目标。
(点击隐藏) -
笔者发现的玩法说明
按左右方向键可以调整大炮角度,空格键开炮。 -
思路
在这里,可变动的值有:- 大炮的方向
- 开炮的次数
- 敌人的健康值
由于以上的值在内存中不知道以什么类型存放,也不知道变量的变化规则,那么扫描的时候可以考虑扫描所有类型
和未知的初始值
。后面到游戏里面操作,把某些值改变,再扫描变动的数值
。
-
过程
- 搜索所有变量类型
- 回去改变游戏的值,搜索变动的值 ,多次操作获得的地址如下
地址功能 基址 一级偏移 二级偏移 三级偏移 数值类型 敌人真实血量 “gtutorial-x86_64.exe”+3CCD20 7c0 30 70 4字节 地址功能 基址 一级偏移 二级偏移 三级偏移 四级偏移 数值类型 敌人显示血量百分比 “gtutorial-x86_64.exe”+3CCD20 7c0 30 68 50 单浮点 地址功能 基址 一级偏移 二级偏移 三级偏移 数值类型 大炮角度 “gtutorial-x86_64.exe”+3CCD20 7c0 30 68 单浮点 地址功能 基址 一级偏移 二级偏移 数值类型 大炮开火次数 “gtutorial-x86_64.exe”+3CCD20 7c0 6c 4字节 - 过关方式。
- 改变敌人血量为1,打中一炮
- 锁定或改变开火次数为0,不断的开炮
- 搜索所有变量类型
step2
Step 2:
These two enemies have more health and do more damage to you than you do to them.Destrey them
Tip/warning: Enemy and player are related
(Click to hide)
第二步
这两个敌人的生命值更高,对你造成的伤害也比你对他们造成的要大。消灭他们
提示/警告:敌人和玩家是相关的
(点击隐藏)
-
笔者发现的玩法说明
按找上方向键可以走动,按左右方向键可以调整大炮角度,空格键开炮。 -
思路
在这个关卡里面两个敌人的血量和自己的血量都可以查找到,可以尝试所锁定自己的血量来做成伪无敌。
在提示警告里面,提示/警告:敌人和玩家是相关的
,回顾前面的教程,和相关有关系的只有步骤9,可能这个关卡有公用代码。 -
过程
-
查找到两个敌人和自己的血量指针
地址功能 基址 一级偏移 二级偏移 三级偏移 数值类型 左边敌人血量 “gtutorial-x86_64.exe”+3CCD20 7c0 30 60 4字节 右边敌人血量 “gtutorial-x86_64.exe”+3CCD20 7c0 38 60 4字节 自己血量 “gtutorial-x86_64.exe”+3CCD20 7c0 28 60 4字节 -
锁定自己的血量。可以顺利杀死一个敌人。
-
敌人的炮弹一下子变大了,伤害也变高了,即使锁定了血量,自己中一炮也没了。
-
考虑到的提示,从共用代码的方面入手。在任意一个血量地址中
找出是什么改写了该地址
,然后找出指令访问的地址
-
给两个敌人都来一炮,可以得到以下信息。注意看地址值,和指针指向的地址能够对应上。这样有很大的把握确定,第4步反汇编的地址
gtutorial-x86_64.exe+400E3
是一个共用的地址。
-
共用代码就分析下内存结构。查看第一步,二级偏移指向的地址就是应该分析的地址。找一个地址的值可以标识阵营的,在这里我选择了偏移0x70的地址,自己为0,另外两个为1
-
返回第4步的
Memory Veiwer
窗口,自动汇编注入以下代码。激活,干死两个敌人通关。
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048,"gtutorial-x86_64.exe"+400E0)
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
mov rax,rcx
cmp [rax+70],0 //自己的值为0,直接退出
je short exit
originalcode:
// 有多少血量减去多少血量
mov edx,[rax+60] //把现有的血量赋值给edx寄存器
sub [rax+60],edx // 现有的血量减去edx中的血量
// 为什么不写成sub [rax+60],[rax+60]?这样不是更简便吗,其实你可以尝试一下,更容易获得结果。
exit:
jmp returnhere
"gtutorial-x86_64.exe"+400E0:
jmp newmem
nop
returnhere:
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
"gtutorial-x86_64.exe"+400E0:
db 48 89 C8 29 50 60
//mov rax,rcx
//sub [rax+60],edx
step3
-
笔者提示,左下角可以暂停。暂停时画面提示
-
思路
- 会动的东西最好找,哪几个敌人,左右动来动去的哪几个敌人容易找出其X坐标。找到X坐标,一般来说Y坐标就在X坐标内存的附近。
- 站台解锁就变绿色,解锁所有站台才能开门,可能存在一个计数存放着已经解锁的数量。
- 最底部哪个长条绿色可能也是一个站台。
-
过程
- 先找出三个敌人的坐标。搜索所有类型变量,敌人动一下,暂停一下,不断的找变动。
地址功能 | 基址 | 一级偏移 | 二级偏移 | 三级偏移 | 四级偏移 | 数值类型 |
---|---|---|---|---|---|---|
敌人0 X坐标 | “gtutorial-x86_64.exe”+3CCD20 | 7C0 | 38 | 0 | 24 | 单浮点 |
敌人0 Y坐标 | “gtutorial-x86_64.exe”+3CCD20 | 7C0 | 38 | 0 | 28 | 单浮点 |
敌人1 X坐标 | “gtutorial-x86_64.exe”+3CCD20 | 7C0 | 38 | 8 | 24 | 单浮点 |
敌人1 Y坐标 | “gtutorial-x86_64.exe”+3CCD20 | 7C0 | 38 | 8 | 28 | 单浮点 |
敌人2 X坐标 | “gtutorial-x86_64.exe”+3CCD20 | 7C0 | 38 | 10 | 24 | 单浮点 |
敌人2 Y坐标 | “gtutorial-x86_64.exe”+3CCD20 | 7C0 | 38 | 10 | 28 | 单浮点 |
- 找出存放已经解锁站台数量的地址。先搜索未知的数值,上去解锁一个站台搜索变动,再解锁一个搜索变动,然后自杀一次,继续搜索变动,直到找到为止。
地址功能 | 基址 | 一级偏移 | 二级偏移 | 三级偏移 |
---|---|---|---|---|
解锁站台计数 | “gtutorial-x86_64.exe”+3CCD20 | 7C0 | 88 | 4字节 |
开启游戏之后,底部最长的平台解锁,所以数值是1,全部平台解锁就是12,理论上填入12,就能把门解锁。
3. 把敌人的XY值手动修改一下,就可以过关。
至此,整篇笔记完毕。