Cheat Engine 官方教程汉化
CE修改器官方教程汉化版,区别于前款教程,官方教程中使用的是Tutorial64位程序,如下是经过翻译后的官方文档。
第一步:欢迎
当教程启动时,您应该会看到类似的东西,您只需在阅读帮助文本后单击“下一步”按钮即可。
在后面的步骤中保存密码,以防崩溃(从注入中)并在以后重新启动。

运用CE如何附加到进程
- 1.打开要附加到的进程/游戏(如果尚未打开)。
 - 2.打开作弊引擎(如果尚未打开)。
 - 3.单击作弊引擎窗体工具栏中的计算机图标,如果作弊引擎刚刚打开,它应该会闪烁,或者在作弊引擎主窗体菜单上选择进程。
 

4.从列表中选择进程。

5.单击打开按钮或双击该过程。您应该会在窗体顶部看到进程名称。您现在已附加到该进程。

第二步:精确值扫描
对于步骤2,您将看到类似这样的东西。

我们需要找到的是健康,这里是一个整数。
因此,设置内存扫描程序以查找整数,然后进行精确值扫描,然后将该值设置为当前运行状况值,大多数整数将存储在4字节变量中,因此让我们从那里开始。
注意:整数可以存储在 1 字节变量(字节)、2 字节变量(int16/短)、4 字节变量 (int32/int) 或 8 字节变量 (int64/long) 中。
准备就绪后,单击第一个扫描按钮。

您应该在找到的地址列表中看到一个地址列表,如下所示。

现在点击点击我按钮,然后重新输入当前值,然后单击下一次扫描按钮。
请注意列表中的红色值,这表示该值已更改。

单击下一次扫描后,您可能需要继续单击击中我,然后重新扫描,告诉找到的地址列表足够小,可以使用。

只需双击找到列表中的地址,即可将其添加到作弊表中。然后更改值并冻结地址,双击地址列表中的值进行编辑,通过单击启用码/冻结框将其冻结。

现在应该启用下一个按钮,单击它以转到下一步。如果下一个按钮尚未启用,请再次单击点击我按钮。
第三步:未知的初始值
当您开始步骤 3 时,您应该会看到表单如下所示。

就像帮助文本所说的那样,请确保在开始新扫描之前单击新扫描按钮。

这将清除找到的结果以开始扫描新值。
在这里,我建议继续单击点击我按钮,只是为了查看值是如何减小的,以帮助确定要扫描的值类型。

请注意,该值减小了一个整数,即非小数。
因此,我将扫描仪设置为4个字节和未知的初始值。然后单击第一个扫描按钮。

现在点击点击我按钮。然后将扫描类型设置为减小值,然后单击嵌套扫描按钮。

请注意找到的地址数量,对于当今的大多数游戏来说,这有点小,对于大多数游戏来说,找到的结果很容易达到数百万。
现在,只需使用点击我按钮继续减小该值,然后扫描减小的值,直到找到的结果足够小,可以使用。

现在我们只需选择一个地址并更改值以查看它是否具有所需的效果,这就是它的工作原理。
在这里,我建议您在更改值(或只是Ctrl + C)之前始终注意这些值,以便在它们不是正确的值时将其设置回去,以防止在游戏中执行此操作时更改一堆未知地址并损坏保存文件。
一旦您将值设置为 5000,下一步按钮应立即变为启用状态。更改值并单击点击我按钮后,进度条应填充,但这不是必需的。

现在应该启用下一个按钮,单击它以转到下一步。如果下一个按钮尚未启用,请再次单击点击我按钮。
第四步:浮点数
当您开始步骤 4 时,您应该会看到表单如下所示。

因此,请单击新建扫描按钮。然后为扫描仪设置一个浮点数,精确值,输入当前运行状况值。设置时,单击第一个扫描按钮。

因此,只需像以前一样扫描以查找健康地址,然后将其添加到地址列表中。
现在再次单击新的扫描按钮。然后将扫描仪设置为双精度值,输入当前弹药值。设置时,单击第一个扫描按钮。

因此,只需像以前一样扫描以查找弹药地址,然后将其添加到地址列表中即可。
现在将值更改为5000,然后下一步按钮应变为启用状态。然后单击下一步按钮以继续执行下一步。
第五步:代码查找器
当您开始步骤 5 时,您应该看到表单如下所示。

因此,首先找到该值,然后将其添加到地址列表中。此时继续保存表和密码,以防调试器设置不正确。
在地址列表中拥有地址后,右键单击它,然后选择找出访问此地址的内容。

作弊引擎将提示您有关附加调试器的信息,只需单击是按钮即可。

然后将打开一个调试器窗体,现在单击更改值按钮,您应该获得显示在调试器窗体中的代码。
我们想要的是一个书面指令。因此,我们将寻找一些类似于以下内容之一的东西:
mov [**],**
add [**],**
sub [**],**
*** [**],**
选择写入指令的代码行,可以单击显示拆装器按钮以查看内存中的代码,然后单击替换按钮。最后不要忘记单击停止按钮。

替换按钮会将该行代码替换为NOP。作弊引擎将提示您输入它将添加到高级选项列表中的条目的名称。
输入名称,然后单击确定按钮。

现在,单击教程中的更改值按钮。下一步按钮应变为启用状态,然后单击下一步按钮以前进到下一步。
当高级选项列表中的条目被替换时,它们将显示为红色文本。

可以通过单击作弊引擎主窗体左下角状态栏中的高级选项按钮来查看高级选项列表。
要还原列表中某个条目的原始代码,请右键单击该条目,然后选择使用原始代码还原。

请注意,恢复后文本为黑色。

第六步:指针
当您开始步骤 6 时,您应该看到表单如下所示。

因此,首先找到该值,然后将其添加到地址列表中。
在地址列表中拥有地址后,右键单击它,然后选择找出访问此地址的内容。

然后单击更改值按钮,让进程访问该地址。
选择代码以查找指针的基址时,请尝试选择不写入与基址相同的寄存器的指令。
在这里,我们对方括号[]之间的值感兴趣,因此这里我们需要RDX的值。

这里的偏移量是0,如果指令有这样的东西:
mov [rdx+12C],eax
然后偏移量将为12C(0x12C),请注意,这是十六进制。
现在将扫描仪设置为8个字节,精确值,选中十六进制复选框,然后获取找到的值并将其作为要扫描的值。
准备就绪后,单击第一个扫描按钮。
在找到的地址列表中查找带有绿色文本的地址,这些是静态地址。

将一个添加到作弊表,双击已添加到地址列表的内存记录的地址,复制该地址,然后选中指针复选框,然后将该地址粘贴到指针基址中。
所以我的指针看起来像["Tutorial-x86_64.exe"+XXXXXX]+0这样。

设置指针时单击确定按钮。
现在将值冻结在5000并单击更改指针按钮,下一个按钮应该变为启用状态。
如果下一个按钮未启用,则从找到的列表中选择另一个地址,查找更改其值的绿色地址,并将其设置为与上一个地址一样,并查看它是否指向正确的值,如果是这样,请更改值冻结并单击更改指针按钮。
单击下一步按钮前进到下一步。
第七步:代码注入
当您开始步骤 7 时,您应该会看到表单如下所示。

在这里,我们将遵循与步骤 5 相同的过程,但不是单击替换,请单击显示反汇编器按钮。

这将在指令的地址打开反汇编器视图表单。

选中该指令后,按 Crtl+A 打开自动汇编程序窗体。
在自动组装器表单菜单中,选择模板,然后选择完全注入。

这将生成一些脚本来启动。

现在,我们需要添加一些将值增加 2 的代码,然后删除减小该值的原始代码。
为了增加价值,我们可以使用INC或ADD。
所以让我们尝试这样的事情。
...
newmem:
  add dword ptr [rsi+780],2
code:
  //sub dword ptr [rsi+00000780],01
  jmp return
address:
  jmp newmem
  nop
  nop
return:
...
现在将脚本添加到作弊表,然后启用脚本并单击“点击我”按钮。
这应该启用下一步按钮,因此单击下一步按钮转到下一步。
第八步:多级指针
当您开始步骤 8 时,您应该会看到表单如下所示。

手动迭代
在这里,我们将遵循与步骤6相同的步骤,除了我们将看到哪些内容访问了我们找到的基址,并且我们将继续重复此操作,直到找到静态基址。
这是我的第一个调试器输出。
10002D8D1 - B9 A00F0000 - mov ecx,00000FA0
10002D8D6 - E8 3522FEFF - call Tutorial-x86_64.exe+XXXXXX
10002D8DB - 89 46 18  - mov [rsi+18],eax  <<<<<<
10002D8DE - 89 C2  - mov edx,eax
10002D8E0 - 48 8D 4D F8  - lea rcx,[rbp-08]
RAX=00000000000007F7
RBX=000000000125CD60
RCX=0000000000000FA0
RDX=00000000828087F3
RSI=0000000001287960  <<<<<<
RDI=0000000100258308
RSP=000000000102F070
RBP=000000000102F0B0
RIP=000000010002D8DE
R8=0000000100161BA0
R9=00000000008E06A0
R10=0000000000000002
R11=0000000000000206
R12=00000000012607C0
R13=0000000100161BA0
R14=0000000100258300
R15=0000000100257A18
我确实在基址的第一次扫描中发现了一个静态基数,但我记得这是一个虚假的基数。所以这里我们想要的是一个process.exe+offset形式的基址,你可以尝试其他看起来像module.dll+offset的基址,但我想说的是,在这里它们将被证明是错误的指针。是的,大多数较新的游戏都会有许多错误的值和指针。
调试器从地址保持输出:0000000001287960
10002D88B - E8 90961200 - call Tutorial-x86_64.exe+XXXXXX
10002D890 - E9 65000000 - jmp Tutorial-x86_64.exe+XXXXXX
10002D895 - 48 83 3E 00 - cmp qword ptr [rsi],00  <<<<<<
10002D899 - 74 5F - je Tutorial-x86_64.exe+XXXXXX
10002D89B - 48 8B 36  - mov rsi,[rsi]
RAX=0000000000013117
RBX=000000000125CD60
RCX=000000000125CD60
RDX=0000000000003CE3
RSI=0000000002D6D540  <<<<<<
RDI=0000000100258308
RSP=000000000102F070
RBP=000000000102F0B0
RIP=000000010002D899
R8=0000000100161BA0
R9=00000000008E06A0
R10=0000000000000002
R11=0000000000000206
R12=00000000012607C0
R13=0000000100161BA0
R14=0000000100258300
R15=0000000100257A18
调试器输出的地址保持:0000000002D6D540
10002D845 - E8 D6961200 - call Tutorial-x86_64.exe+XXXXXX
10002D84A - E9 AB000000 - jmp Tutorial-x86_64.exe+XXXXXX
10002D84F - 48 83 7E 18 00 - cmp qword ptr [rsi+18],00  <<<<<<
10002D854 - 0F84 A0000000 - je Tutorial-x86_64.exe+XXXXXX
10002D85A - 48 8B 76 18  - mov rsi,[rsi+18]
RAX=00000000000166D2
RBX=000000000125CD60
RCX=000000000125CD60
RDX=000000000000302E
RSI=0000000002D6CE40  <<<<<<
RDI=0000000100258308
RSP=000000000102F070
RBP=000000000102F0B0
RIP=000000010002D854
R8=0000000100161BA0
R9=00000000008E06A0
R10=0000000000000002
R11=0000000000000206
R12=00000000012607C0
R13=0000000100161BA0
R14=0000000100258300
R15=0000000100257A18
调试器输出的地址保持:0000000002D6CE40
10002D800 - E8 1B971200 - call Tutorial-x86_64.exe+XXXXXX
10002D805 - E9 F0000000 - jmp Tutorial-x86_64.exe+XXXXXX
10002D80A - 48 83 7E 10 00 - cmp qword ptr [rsi+10],00  <<<<<<
10002D80F - 0F84 E5000000 - je Tutorial-x86_64.exe+XXXXXX
10002D815 - 48 8B 76 10  - mov rsi,[rsi+10]
RAX=000000000000B567
RBX=000000000125CD60
RCX=000000000125CD60
RDX=00000000000050A1
RSI=000000000123F1C0  <<<<<<
RDI=0000000100258308
RSP=000000000102F070
RBP=000000000102F0B0
RIP=000000010002D80F
R8=0000000100161BA0
R9=00000000008E06A0
R10=0000000000000002
R11=0000000000000206
R12=00000000012607C0
R13=0000000100161BA0
R14=0000000100258300
R15=0000000100257A18
现在我们扫描该基址000000000123F1C0,您应该找到一个静态地址,但在实际游戏中,您将继续前进,直到找到静态基址。
以该静态地址为基址,我的指针将如``[[[["Tutorial-x86_64.exe"+XXXXXX]+10]+18]+0]+18`所示。

指针扫描可以通过首先找到所需值的地址,保存生成的指针映射,重新启动游戏,再次搜索地址,保存另一个指针映射,然后比较两者来快速解决此问题。
找到指针后,将其冻结在 5000,然后单击更改指针按钮。如果您找到了正确的底座,则下一步按钮应在大约2秒后启用。因此,单击下一步按钮转到下一步。
第九步:共享代码
当您开始步骤 9 时,您应该会看到表单如下所示。

因此,就像帮助文本所说的那样,解决方案远远不止一种。
首先,我们需要找到其中一个地址并将其添加到表中。
如果您在查找地址时遇到问题,请记住尝试不同的值类型,并且不要忘记开始新的扫描。
然后,就像在步骤7中一样,我们想要查看访问地址的内容,以找到写入参与者运行状况的函数。
如果您想尝试其他方式,请继续保存密码,这是本教程的最后一步。
因此,在这里,最好了解我们实际上在寻找什么来区分盟友和战斗人员。
当编写游戏或引擎时,演员和玩家可能会这样编写。
//// Actor, base for all actors
class Actor(object){
   string Name = 'Actor';
   Coord Coords = new Coord(0, 0, 0);
   float Health = 100.0;
   ...
}
//// Player
class Player(Actor){ //// Player inherits form Actor
   string Name = 'Player';
   int Team = 1;
   ...
}
团队本身可以是一个结构,比如说,如果它被声明为一个对象类,比如Coords变量,我们希望寻找一个指向参与者团队结构的指针。
因此,我们可以做到这一点的一种方法是在玩家结构中找到团队ID或团队结构。
在球员结构中查找球队ID
找到减少生命值的功能后。右键单击反汇编器视图窗体中的指令,然后选择找出此指令访问的地址。

然后单击所有 4 个值的攻击按钮。调试器列表中应具有所有 4 个地址。

因此,请继续将它们添加到地址列表中。

然后,让我们打开剖析数据结构表单。

你会得到一些弹出窗口,在想到它们之后,你应该看到这样的表单。请注意,我必须扩展窗体的宽度才能移动列。
现在在我的偏移量上,0x10被猜测为一个指针,在64位进程中宽度为8字节。我看到0x10的指针的值看起来真的不像指针。
因此,我必须将其切换到4字节,并添加一个新的元素集,其偏移量为具有4字节值类型的0x14。这通常是它的工作方式。

所以在这里我们可以看到团队变量在结构的偏移0x14。
现在我们需要向脚本添加一些注入代码,然后添加一些代码来检查结构的团队变量,以确定哪些参与者是盟友,哪些是战斗员。
所以我们想要一些这样的。

因此,启用此脚本后,当游戏写入演员健康时,以下是跳转到钩子代码后将发生的事情:
- 1.保存(PUSH)RFLAGS寄存器,不是完全需要,但在比较时仍然是一个好习惯。
 - 2.检查演员是否在团队 1 中。如果 actor 在团队 1 中,则我们以浮点格式将新值设置为 5000。
 - 3.检查演员是否在团队 2 中。如果 actor 在团队 2 中,则我们将新值设置为 0,采用十六进制格式。(浮点数 0 == 整型 0 == 十六进制 0)
 - 4.恢复(POP)RFLAGS寄存器,如果寄存器是PUSHed的,这是完全需要的。
 
启用此脚本后,单击重新启动游戏并自动播放按钮,然后您应该看到表单更改并如下所示。

因此,单击下一步按钮以完成本教程。然后,您应该会看到一个表单,告诉您已完成本教程。
在寄存器中发现差异
找到减少生命值的功能后。
右键单击反汇编器视图窗体中的指令,然后选择找出此指令访问的地址。

然后单击所有 4 个值的攻击按钮。
调试器列表中应具有所有 4 个地址。

现在让我们看看登记册,看看我们是否能找到盟友和战斗人员的差异。
单独选择每个地址,然后按 Ctrl+R。
排列表单以使其更易于比较。

因此,在这里我们可以看到战斗人员的RSI为1。
所以像这样的脚本应该可以工作。

因此,启用此脚本后,当游戏写入演员健康时,以下是跳转到钩子代码后将发生的事情:
1.保存(PUSH)RFLAGS寄存器,不是完全需要,但在比较时仍然是一个好习惯。
2.检查 RSI 寄存器是否为
- 1,如果 RSI 寄存器为 则我们将新值设置为十六进制格式的 0。(浮点数 0 == 整型 0 == 十六进制 0)
 - 2,如果 RSI 寄存器不是 1,那么我们假设 actor 是盟友,因此我们以浮点格式将新值设置为 5000。
 
3.恢复(POP)RFLAGS寄存器,如果寄存器是PUSHed的,这是完全需要的。
启用此脚本后,单击重新启动游戏并自动播放按钮,然后您应该看到表单更改并如下所示。

因此,单击下一步按钮以完成本教程。
然后,您应该会看到一个表单,告诉您已完成本教程。
Cheat Engine 官方教程汉化的更多相关文章
- Cheat Engine 中文设置汉化教程
		
下载地址:https://www.cheatengine.org/downloads.php 下载windows 安装版本以及中文翻译包: 1.安装程序:一路NEXT即可 2.打开程序安装位置在在文件 ...
 - IDEA 2020.1 插件市场无法找到官方的汉化包解决办法
		
问题: idea 终于更新了2020.1版本,新增了好多的特性,官方也终于支持了中文语言包,但是下载后在插件市场无法找到官方的汉化包 解决: 去IDEA插件中心 (https://plugins.je ...
 - intellij idea 2018注册码|intellij idea 2018破解文件下载(附破解教程/汉化包)
		
intellij idea 2018破解文件http://www.3322.cc/soft/37661.html intellij idea 2018注册码是一款针对“intellij idea 20 ...
 - Eclipse 00: 安装教程 + 汉化 + 简单创建java项目
		
Java 安装教程(Eclipse) 目录: 要安装Java 要分两个步骤: 1.JDK的安装 2.Eclipse的安装 3.Eclipse汉化 4.Eclipse创建简单java项目 1和2的顺序不 ...
 - pycharm安装教程,汉化教程,以及正版激活码---
		
密钥在下面 安装过程 PyCharm2019本地下载: http://www.100c1.com/upload/default/20190420/1c08a3209029093a8b34df941f1 ...
 - Cheat Engine TUTORIAL 教程 (8个步骤)
		
https://www.cnblogs.com/ae6623/archive/2011/04/16/4416874.html https://www.52pojie.cn/thread-828030- ...
 - 使用DevExpress官方汉化文件对界面进行汉化的过程
		
在较早期的Dev开发中,基本上都是在使用一个DLL包的汉化文件,如基于13.1的汉化包文件Dxper.LocalizationCHS.Win.v13.1.5.dll,这个汉化包也比较方便,大多数时候复 ...
 - Zend Studio 10.6.0汉化教程(图文)
		
来源于:http://www.pw88.com/teach/bangong/32.html 此汉化方法适用于所有的zend studio版本.整个汉化思路是:在线或者离线官方下载汉化包,本地安装即 ...
 - Sublime Text3汉化好的绿色免安装版使用和破解教程+下载链接
		
这个资源是我从官网上面下载好的Sublime Text3绿色版,然后通过网上的教程汉化之后再压缩的.理论上下载完之后,解压就可以用了,不过由于是绿色版,可能需要调一下默认打开方式.才好直接双击打开.绿 ...
 - 如何汉化XAF应用
		
这是一个入门级的问题,应网友请求,总结一下XAF汉化过程的几个关键点. 一.所有Dev的控件的汉化,Dev官方有汉化文件.点击下载15.2版本. 正版用户登陆至官网是有专门的下载界面的,并且可以参与汉 ...
 
随机推荐
- 开源项目因支持乌克兰遭issue刷屏,网友:别用Nginx,别用元素周期表
			
大家好,我是DD. 昨天,两条科技界的新闻炸了,一条是关于GitHub发文封锁俄罗斯,一条是关于Oracle暂停俄罗斯所有业务.一个是全球最大的开源软件社区,一个是全球最大的数据库软件厂商.似乎巨头的 ...
 - LeetCode | 983.最低票价(动态规划)
			
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的日子将以一个名为days的数组给出.每一项是一个从 1 到 365 的整数. 火车票有三种不同的销售方式: 一张 ...
 - <vue 路由 6、动态路由-方法传递参数>
			
一.query效果 点击query按钮 二.param效果 点击param按钮 注意点 1:重新刷新浏览器后,参数都不在了. 2:url中能看不到传递的参数 3.分别用{{$route. params ...
 - 这才是你应该了解的Redis数据结构!
			
深入了解Redis数据结构 Redis,作为一种高性能的内存数据库,支持多种数据结构,从简单的字符串到复杂的哈希表.在这篇博文中,我们将深入探讨Redis的一些主要数据结构,并通过详细的例子展示它们的 ...
 - Vue第二篇 Vue的常用指令
			
01-demo <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
 - C++数据结构(树)
			
树是一种递归定义的数据结构,如果树中节点的各子树从左到右是有次序的,不能互换,则称该树为有序树,否则叫无序树. 关于树的节点: 节点拥有的子树的个数叫做节点的度 如果度为0,那么该节点叫做叶节点或终端 ...
 - spring启动流程 (3) BeanDefinition详解
			
BeanDefinition在Spring初始化阶段保存Bean的元数据信息,包括Class名称.Scope.构造方法参数.属性值等信息,本文将介绍一下BeanDefinition接口.重要的实现类, ...
 - 【MicroPython】 mp对象和 c 类型的转换
			
[来源]https://www.eemaker.com/micropython-mp-toc.html
 - Java中有哪些方式能实现锁某个变量
			
有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top 首发博客地址 系列文章地址 在Java中,有几种方式可以实现对某个变量的锁定 ...
 - Nginx的日志处理
			
Nginx的日志处理 背景 之前一直被各种咨询nginx的使用问题. 大部分都是性能, 加模块, 以及一些tcp端口等的问题. 其实这些都还好, 还有一个比较麻烦的问题时日志相关的. nginx的日志 ...