type
status
date
slug
summary
tags
category
icon
password
前言:
我平时喜欢玩王国守卫军这种塔防类单机游戏,但游戏难度稍微调高一点,操作的容错率就变得极低,很多时候都是被BOSS乱打。这个时候就需要祭出秘密武器:
修改器
了。而在众多修改器中Cheat Engine
绝对可以说是天花板级别的存在,它作为一个开源的内存修改工具,不仅操作简单,功能还十分丰富,许多游戏外挂都是基于它来进行开发。CE从下载到汉化:
这里提供了官网的下载链接和我自己上传的7.4版本的安装包。
Cheat Engine7.4安装包
下载后将尾缀txt改成exe即可
安装好后的CE是英文,修改中文的方式如下:
在官网中有提供汉化包:

点击下载这个压缩包,解压后得到文件夹:

然后进入CE所在的文件下,选择language文件夹,然后将解压后的汉化包放入language文件夹中

进入文件夹后打开名为
language.ini
的配置文件:
将*删除改成汉化包的文件夹名,保存文件之后程序就汉化好了。
CE学习程序的通关思路:
工具安装好后,接着了解一下CE的基本使用方法,在CE所在的文件夹中官方提供了两个练习程序(Tutorial、gtutorial),Tutorial比较简单,在这个程序中总共设置了八个关卡,通关完前五个关卡基本就可以在一些简单的单机游戏中为所欲为了下面贴一下CE练习程序各关卡的通关攻略:(以下的实例用的都是64位程序)
下图是Cheat Engine的操作界面,左上角被框中的电脑图标就是选择进程按钮,点击它可以选择想要修改的游戏的进程。

Tutorial

这里直接下一步就好,然后回到CE程序,选择训练程序的进程:

1.精确数值扫描:(密码=090453)
这一关要做的就是把健康这个变量的数值改成1000。

首先在CE操作界面的数值里输入100,扫描类型为精确数值,点击首次扫描。

点击完后CE就会在练习进程中扫描整形变量数值为100的地址,并在左边罗列出来,下图可以看到总共扫描出了64个结果。

这么多个地址我们无法确定到底那个才是健康值时哪个,但是上面有提示过可以点击
打我
这个按钮来消耗健康值:
点击后可以发现健康值发生了变化,这时我们再次在数值中输入97,点击再次扫描,CE软件就会去搜索刚开始为100然后又变成了97的变量所在的地址:

这个时候可以发现我们就找到了这个健康值所在的内存地址,双击它,它就会出现在下面的地址列表中:

鼠标双击97,弹出改变数值选项卡。

将数值改变成1000就可以通过此关。
2.未知的初始值:(密码=419482)
这关要找的数值在0~500之间,我们依旧能通过
打我
这个按钮来消耗健康值。通关方法是将扫描类型改为
值介于···两者之间
,填写数值为0~500:
然后进行扫描之后,点击
打我
,再将扫描方式选择为减少的数值
再进行扫描,这个步骤重复多次就可以找到健康值所在的地址:
3.浮点数:(密码=890124)
和精确数值那关一样只是将数值类型分别改为单浮点和双浮点。
4.代码查找:(密码=888899)
先看关卡描述:
这关的目的是要让
改变数值
按钮失去作用,首先找到数值当前所在的地址,具体方式不再过多赘述。
然后放入下方地址列表,右击找到的地址,选择
找出是什么改写了这个地址
(也可以直接按F6):
然后将弹出一个空白的窗口,在点击次
改变数值
按钮,就可以看到窗口中出现了一些汇编代码:
选中指令点击替换,在弹出的窗口中输个名字就行。
这里再次点击改变数值就可以发现数值已经无法修改。
这里的原理是
mov [rax],edx
,这串代码的作用就是改写数值,然后将这串代码所在的几个字节全部替换成另外一个汇编代码nop
(这个汇编代码的作用是不做任何事情单纯用来填充空间),这样程序再次执行改变数值时执行的代码就是啥事也不干。5.指针:(密码=098712)
关卡描述:
首先找到数值的地址,然后再查找是什么改写了这个地址并调出改变地址的汇编代码,选择详细信息按钮。


可以看到这里列出的是改变地址的汇编代码以及它前后的代码,下方的RAX这些以R开头的是CPU的寄存器名。不过不懂这些也没关系,官方给的解释是如果打开详细信息中的汇编代码有中括号就找对了。
这里我们关注详细信息中的中间那句话:
您要查找的该地址的指针数值可能是015EE630
。复制这串十六进制数到CE的主窗口选择新的扫描,然后对这串十六进制数值进行扫描

将这个地址加入到下方的地址列表:

100325AD0
就是我们要找的基址。搜索到了这个指针可以发现地址是绿色字体,如下图选择
手动添加地址
按钮:
在弹出的对话框中勾选指针,对话框就会从左图变成右图的样子:


下面的操作直接套用官方原话
这里的方括号里的计算就是一开始找出来的详细信息:

很明显这里并没有偏移直接在将基址输入框中就行,然后点击确定:

可以看到地址列表中多了一个
p→
指向的地址,如果后面的地址等于第一行一开始找到的数值地址相同,就代表找到指针了。
这关的通关条件需要将指针地址的数值锁定为5000,锁定这个功能就是在地址列表中的
激活
那一列的单选框选中即为锁定数值:
改变指针这一关寻找基址这个步骤需要记住的是基址都是绿色字体显示的,而黑色字体显示的字体都是动态地址,如果找到最后有多个绿色地址,在一般情况下选择第1个。
到这里CE的基本使用就差不多都了解了,其实只要会精确数值查找操作就已经可以应付一些植物大战僵尸这类古早的小游戏了,之后的挑战就需要会一点汇编语言的知识才容易理解了。
6.代码注入:(密码=013370)
关卡描述:
直接从汇编代码这步开始分析:

找到了改变健康值的代码后,这里是使用的sub命令实现减一的效果,直接将其修改为add再将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
在本关的情况下,你可以使用相同的手法处理减少健康值的那条原代码方括号之间的部分。
提示一
推荐你从原代码中删除减少健康值的那行代码,否则你得加 3 点健康值(你增加了3点,原代码减去1点,最终结果才会增加2点),这样看上去很容易让人迷惑,但最终方案还是由你来决定好了。
提示二
某些游戏中,原代码可能在多条指令之外,有时候(并非一向如此),它可能由不同的地方跳转至你的指令中并结束运行,其结果可能引起未知的错误;如果出现了这种情况,通常应当查看附近的那些跳转指令,进行修改,或者尝试使用不同地址进行代码注入,确认无误后便可以将你修改的代码注入到原代码中了。
7.多级指针:(密码=525927)
关卡描述:
这关就是层层套娃,一层一层剥吧:
找到数值所在地址,之后查看到其指向的指针为:

这里建议使用记事本将关键信息记录下来:

然后是搜索搜索地址
01655450
:
将其加入地址列表,右击地址之后选择查找
是什么访问了这个地址
:tips:这里记得不是选择改变而是访问。


到了这里发现出问题了指针基址又指向了
01655450
,这时不要谎,看下图015D1960
地址处的数值为01655450
也就是说当程序要改变健康值时就一定为访问015D1960
这个地址。
所以我们这里直接搜索
015D1960
这个地址。
这里出现了两个结果,将这两个结果都放入地址列表,通过点击改变数值按钮来观察最后那个地址是被访问的:



很明显015D6778就是第二级指针的值。
之后的三级指针和四级指针就没有出现任何意外了都可以通过正常手段找到:

最后搜索四级指针基址
016553D0

就成功找到了基址:
100325B00

手动添加地址:


两者相等。
8.注入++:共用代码(密码=31337157)
关卡描述:

这里的提示说游戏中有些代码是共用的,我们分别定位四个玩家的血量,然后找他们的访问地址,可以发现四个人的访问地址一模一样,也就是说如果我们修改了这里的代码,在对我方阵营生效的同时对敌方阵容也会生效。

tips
这里还有一个技巧,向上面这样一个一个查看是很麻烦的事情,这里可以只定位一个,然后选择显示反汇编程序:

在对应的指令上右击显示找出这个指令访问的地址

然后依次对四个玩家进行攻击,可以发现每个玩家共用的都是同样的代码。

通关条件很明显是要左边的两名玩家战胜右边的两名BOSS,这里有几种方法解决战斗,先说第一种。
方法一:动态调试
首先随便点一下各个玩家的
攻击
按钮,这里可以发现一个规律,每次玩家阵营扣血都是几滴几滴的扣,具体扣多少是随机的,而BOSS阵容扣血每次都只扣一滴。发现这个规律后,开始动态调试程序随便找一个操作码访问窗口选择
显示反汇编程序
以此调处共用的反汇编代码:
在访问地址代码处也就是第一行下断点,点击攻击程序会自动停在断点出,这里可以对每个玩家各攻击几次,然后观察参数变化,可以发现对玩家每次攻击的伤害都是大于1的而且伤害的值存在了RSI寄存器。

上图RSI的值为2,Eric的血量为71,然后点击运行,下图Eric的血量就变成了69。

发现了这些信息,就可以大概理一下方法一的思路了,在下断点处进行代码注入,当程序执行到这里时,对RSI寄存器的值做判断如果值为一时,就正常执行原来的代码,如果值不为一就什么也不做。思路就是这样具体操作如下:
点击工具选项卡→选择自动汇编→选择模版选项卡→选择代码注入




打开模版后在newmem段中输入要注入的代码:
完整代码

输入好代码后点击执行,然后就可以按
重新启动游戏并自动执行
按钮来验证方法可行性:
方法二:官方解法
官方的解法有发在youtube上,点击实例程序右上角的灯可以直到教学链接:

还是打开反汇编程序,在当前指令上右击,选择找出
这个指令访问的地址
,之后会弹出新的窗口:

打开上图窗口后是空的,很简单是因为这时没有选择攻击任何玩家自然没有代码访问该地址,此时回到学习软件,挨个点击一遍四个玩家的攻击按钮,窗口就会出现四条记录:

全选四条记录,右击选择
打开选中地址的分析数据
:
之后一路选择
正确
和是
就会打开结构分析窗口(中途出现的4096表示是以当前地址开始向后分析多少个地址可以改小些因为用不了这么多,也可以不用改问题不大):
到这一步就是找规律了,查看这四列相同偏移的值有何异同(其实看到这里有C语言基础的就可以猜出来每个成员就是一个结构体,这四个结构体成员的结构体类型可能是一样的):
这里我们大致猜测了一些结构体成员所代表的意义。到这里就是编写注入代码了,这次选择的突破口是位于偏移0x14的阵容编号,通过判断RAX+0x14处的值来区分阵容,代码和之前的代码类似:

点击执行,然后回到学习程序选择重新启动游戏并自动执行,就可以验证这个方法成功与否了。

tips:官方其实在这个方法之前还介绍了一种将两个阵容分成两个Group的方法,但着实是听不懂他们在说什么东西,自动翻译也没翻译出来,感兴趣的可以去youtube上自行了解。
gtutorial
GAME1:

通过界面可以推测出修改的方向有两个,一个是修改子弹数,一个是修改健康值。
思路一:修改子弹数
子弹数的搜索用常理的先搜5再搜4会发现:

啥也没有,这里我试着修改了其他数值类型结果依旧是搜索不到,所以不得不怀疑这里的子弹数是否真的是按5~1来计算的。所以只能换个思路:
首次扫描选择未知的初始值,然后放一枪,再回到CE里面选择变动的数值,然后再放一枪,再扫变动的数值,中间可以穿插一些非变动的数值啥的这样逐渐缩小范围,在重新装弹后可以选择对比首次扫描。这个方法大概能简化出20个结果。在20个结果我个人采用的办法就是通过射击观察变量的变化确定到的变量。(在我扫描的过程中有将扫描类型里加了一个值小于6,可以尽量加快数值的搜索)。这是一个比较笨的办法,但我目前没有想到别的办法。
确定变量后可以发现,子弹数并不是从5开始递减而是从0开始递增,递增到5就归零。之后的扫描可以直接将首次扫描的精确数值设为0,再扫精确数值1就能定位子弹所在地址。
思路二:修改健康值
健康值也就是靶的血条,搜索思路是首次扫描为未知的数值,数值类型为所有类型。接着放一枪,搜索减少的数值,重复此操作直到健康值还原,选择对比首次扫描,中间可以穿插一些放枪不射中靶的操作CE选择未变动的数值。
GAME2:

提示说敌人和玩家有相关性,这里大概率指的是之前的一个知识点,代码共用。
这一关要找到玩家的健康值并不难,数值类型为4字节,精确扫描100就可以找到,我一开始的思路是直接锁血然后和它们对射,但是这里遇到一个问题当我任意杀死一台机器时另外一台机器的伤害就开始巨额提升,我推测当场上只剩一个敌人时,他的攻击会立马让你的健康值达到-1。
这里提供三个解决方案:
方案一:
该方案没什么技术含量纯粹是在卡BUG,我在玩该游戏时发现几个特征:
- 特征一:飞机是可以走位的,但是敌人的攻击方向会随着玩家飞机所在的位置而发生变化可能第一关就可以只是没发现。
- 特征二:敌人是可以攻击敌人的。
- 特征三:当毁灭一台敌机时,剩下的那台敌机的鸟枪并不会立马变成大炮,有三秒的升级时间。
所以利用这三个特点就可以通过第二关:
- 首先找到健康值并锁住。
- 然后将飞机移动到下图的位置,然后将右边的敌人磨到丝血状态

这样我们攻击右边敌人的时候,左边的敌人也在背刺同伴,这样做的目的是尽快将右边这台敌机磨成残血,一个人打太刮痧了。

- 然后又移到左边继续攻击这样当击毁左边敌机之后就可以在三秒内继续把右边的敌机也击毁。

方案一基本上没有什么技术含量就是卡bug,这一关考验的应该是通过对共用代码的修改。下面继续介绍方案二。
方案二:
共用代码的知识点在之前的学习程序
Tutorial
的第八关有介绍过这里就不做过多赘述,该方案的思路是利用玩家的健康值找到共用代码,然后在共用代码处观测是谁访问了这个地址,这样就可以找到三个结果分别代表这两个敌人和一个玩家。然后顺藤摸瓜将两个敌人的血量改成一也可以实现通关的效果。找到玩家健康值,先锁定,然后右击地址选择是什么访问了该地址:


选择下面任意一条指令,选择显示反汇编程序,右击当前汇编指令,选择找出这个指令访问的地址。

然后回到程序分别攻击两个敌人,攻击完后就可以看到代表这三个敌人的访问地址所在处了:

数值为96的地址很明显是玩家的健康值,而两个一百九十多的就是敌人的健康值点击这两个地址,然后将他们改为一再攻击亦可以通关。
tips:我在看官方教程时看到作者使用的地址锁定可以允许值减小但不允许其增长,可以单机下图来实现但快捷键是什么就不知道了:

方案三:
方案三是基于方案二找到共用代码的基础上对其访问的地址进行分析。
还是找到访问共用代码的三个地址然后将其分为两个group,一个group代表的是玩家阵营,一个group代表的是敌军阵营:

将三个地址都选中并右击选择→查找地址之间的共同特征→扫描共同特征→选择rax寄存器→点击扫描→选择保存。



可以看到扫描的结果已经出来了,和之前一样分析这里的数据差别:

偏移60处的数据很明显是当前各玩家的健康值,68应该是各玩家的初始健康值,偏移70处的值可以用来区分阵营。看到这里就可以确定思路,在共用代码处注入代码,代码判断的依据就是利用偏移70里的值。具体代码如下:

GAME3:

这关需要先让小人跳到每个板子上将所有板子激活,然后右下角的门解锁进入门即通关。玩一下这个小游戏发现几个问题:首先地图里的有些板子很难跳;其次地图上有三个小车,碰到小车所有板子状态重置游戏复位;最后一旦将所有板子全部激活这三个小车就会包住右下角的门,使得我们触之即死。所以要想通关首先需要利用CE找到的数值就是小人X轴和Y轴的坐标值,通过对坐标的直接修改来达到地图间的任意穿梭。
x轴和y轴这类的数值的找法也比较简单,小人想左移动x轴数值增大,向右移动x轴数值减小,向上移动y轴数值增大, 向下移动y轴数值减小。这里我们可以先找x轴,首次扫描设置为所有类型,未知的初始值。然后小人右移,选择增大的数值,左移选择减小的数值。重复此操作即可找到x轴坐标(这里建议对扫描方式设置快捷键以加快操作)。

找到x轴后y轴就不需要这么麻烦了,这些数值在内存中一般在一坨,右击找到的x轴地址,选择浏览相关内存区域:

当我左右移动时注意观察内存数据可以发现下图标记的地址变红了,这里表示这个地址的值发生了变化,这个地址就是之前记录的x轴地址,同理也可以试着跳几下看内存区域中那个地址被改写了。

当小人起跳时内存中变红的地址就是y轴坐标值:

右击改地址,选择将此地址添加到列表中:

至此小人的x轴和y轴就都找到了

下面介绍几个通关的思路。
思路一:
先确定几个难跳板子的坐标:


知道上面这几个坐标轴基本就可以确认全图的坐标轴,然后记录一下门的坐标轴,接着激活全部地板


这个时候修改小人坐标为门的坐标就可以通关了:

思路二:
通过思路一过关是可以发现我们并没有实际意义上的解决碰到小车就会重置游戏这个问题,这个思路解决的就是让小人及时碰到小车也不会重置游戏。
还是先找到小人的横纵轴坐标,然后让小人去送死,继续观察内存区域的变化,小人的存活状态只有两种情况非死即生。一般可以直接用布尔值表示。所以在观察内存变化时可以注意那些值是0,1之间切换的。

当小人死亡时上图有两处从0变成了1,游戏重置后又从1改回了0。将这两处值都加入地址列表:

锁定任意一个,来判断是哪个地址表示小人的存活状态,
当锁定第一个地址时,小人没有死亡,但游戏过一会儿依然重置了,当锁定第二个地址小人死亡后游戏并没有重置,以此推辞出地址015C0510表示的是是否显示小人,地址015C0530表示的是是否重置游戏。所以这里需要将两个地址都锁住。这样就可以继续激活地板后通关。
在这个基础上还可以继续深挖,既然已经找到了判断小人存活状态的内存地址,我们依然可以分析是什么指令改变了这个地址:

可以看到这条赋值汇编代码,通过之前的分析已经知道赋值为1就是重置游戏,那么这里将其改成赋值为0也可以避免重置游戏。
通关完CE的练习程序就可以拿一些单机游戏练练手了,这里选择的是植物大战僵尸(CS、皇城守卫军都可以)。
实战:CE修改植物大战僵尸:
在这个游戏中一般常用的修改就是修改一些阳光,金币。再难点的就是修改卡槽的冷却时间,叠加植物的子弹个数等。
- 作者:Reveone
- 链接:http://www.reveone.cn/article/de85967c-82bd-4079-a35e-560d98bb4c03
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。