本文主要是介绍Cheat Engine基础教程:软件汉化及Tutorial通关思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
CE从下载到汉化:
这里提供了官网的下载链接和我自己上传的7.4版本的安装包。
官网链接:Cheat Engine
安装好后的CE是英文,修改中文的方式如下:
在官网中有提供汉化包:
点击下载这个压缩包,解压后得到文件夹:
然后进入CE所在的文件下,选择language文件夹,然后将解压后的汉化包放入language文件夹中
进入文件夹后打开名为language.ini
的配置文件:
将*删除改成汉化包的文件夹名,保存文件之后程序就汉化好了。
工具安装好后尝试运行程序:
上图是Cheat Engine的操作界面,左上角被框中的电脑图标就是选择进程按钮,点击它可以选择想要修改的游戏的进程。
在CE所在的文件夹中官方提供了两个练习程序(Tutorial、gtutorial),Tutorial比较简单,在这个程序中总共设置了八个关卡,通关完前五个关卡基本就可以在一些简单的单机游戏中为所欲为了,以下是Tutorial的通关思路:(以下的实例用的都是64位程序)
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)
关卡描述:
在本关的 Tutorial.exe 窗口下面有两个按钮,一个会改变数值,另一个不但能改变数值而且还会改变数值在内存中存储的位置。
首先找到数值的地址,然后再查找是什么改写了这个地址并调出改变地址的汇编代码,选择详细信息按钮。
可以看到这里列出的是改变地址的汇编代码以及它前后的代码,下方的RAX这些以R开头的是CPU的寄存器名。不过不懂这些也没关系,官方给的解释是如果打开详细信息中的汇编代码有中括号就找对了。
这里我们关注详细信息中的中间那句话:您要查找的该地址的指针数值可能是015EE630
。
复制这串十六进制数到CE的主窗口选择新的扫描,然后对这串十六进制数值进行扫描
将这个地址加入到下方的地址列表:
100325AD0
就是我们要找的基址。
搜索到了这个指针可以发现地址是绿色字体,如下图选择手动添加地址
按钮:
在弹出的对话框中勾选指针,对话框就会从左图变成右图的样子:
下面的操作直接套用官方原话
"添加地址"窗口将发生变化,多出了"Address of Pointer(指针地址)"和"Offset (Hex)(偏移量(16进制))"的文本框,以便您键入一个指针的地址和偏移量。
请尽量填入刚才扫描到的地址。
如果汇编指令中的方栝号里存在计算(例如:[esi+12])则把数值部分填在"Offset (Hex)"的文本框中,如果不存在,则让它保持为 0 。
这里的方括号里的计算就是一开始找到的详细信息:
很明显这里并没有偏移直接在将基址输入框中就行,然后点击确定:
可以看到地址列表中多了一个p→
指向的地址,如果后面的地址等于第一行一开始找到的数值地址相同,就代表找到指针了。
这关的通关条件需要将指针地址的数值锁定为5000,锁定这个功能就是在地址列表中的激活
那一列的单选框选中即为锁定数值:
改变指针这一关寻找基址这个步骤需要记住的是基址都是绿色字体显示的,而黑色字体显示的字体都是动态地址,如果找到最后有多个绿色地址,在一般情况下选择第1个。
到这里CE的基本使用就差不多都了解了,其实只要会精确数值查找操作就已经可以应付一些植物大战僵尸这类古早的小游戏了,之后的挑战就需要会一点汇编语言的知识才容易理解了。
6.代码注入:(密码=013370)
关卡描述:
在这一关中,你将有一个健康值和一个每按一次将减少 1 点健康值的按钮,你的任务是利用"代码注入"
使你每按一次按钮就增加2点的健康值。
直接从汇编代码这步开始分析:
找到了改变健康值的代码后,这里是使用的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 在本关的情况下,你可以使用相同的手法处理减少健康值的那条原代码方括号之间的部分。
7.多级指针:(密码=525927)
关卡描述:
在第 6 步,你已经清楚 1 级指针的概念和用途,并可以利用数值的首个地址找到存放数据真正的基址。
在本关中,你将看到 4 级指针,它由第一个指针指向第二个指针,再由第二个指针指向第三个指针,由第三个指针指向第四个指针,最终指向健康值的真正地址。
前面第五关找一层就找到了基值,但一般的单机游戏中往往都是要往上找三到四级指针才能找到基址,这关就是这样层层套娃,一层一层剥吧:
找到数值所在地址,之后查看到其指向的指针为:
这里建议使用记事本将关键信息记录下来:
然后是搜索搜索地址01655450
:
将其加入地址列表,右击地址之后选择查找是什么访问了这个地址
:
tips:这里记得不是选择改变而是访问。
到了这里发现出问题了指针基址又指向了01655450
,这时不要谎,看下图015D1960
地址处的数值为01655450
也就是说当程序要改变健康值时就一定为访问015D1960
这个地址。
所以我们这里直接搜索015D1960
这个地址。
这里出现了两个结果,将这两个结果都放入地址列表,通过点击改变数值按钮来观察最后那个地址是被访问的:
很明显015D6778就是第二级指针的值。
之后的三级指针和四级指针就没有出现任何意外了都可以通过正常手段找到:
最后搜索四级指针基址:016553D0
就成功找到了基址:100325B00
手动添加地址:
两者相等。
8.注入++:共用代码(密码=31337157)
关卡描述:
这一步将会解释如何处理游戏中的共用代码, 这种代码是通用在除了自己以外的其他同类型对像上。
常常你在修改游戏的时候, 你找到了一个单位的健康, 或是你自己角色的健康, 你会发现一种情况: 如果你把健康相关代码移除的话,其结果是你的角色无敌, 但你的敌人也无敌了。
在这种情况下, 你必须想办法区分自己与敌人。
有时候很简单, 你只要检查最前面的4个字节(函数指针表), 它通常指向一个独一无二的地址, 代表着游戏玩家角色,而有的时候它是一个团体号码, 或者也可能是一个指针, 它指向另一个指针, 该址针又指向下一个指针,搞不好还指向下下一个指针, 最后指向一个玩家名字。总之完全取决于游戏的复杂度, 以及你的运气
这里的提示说游戏中有些代码是共用的,我们分别定位四个玩家的血量,然后找他们的访问地址,可以发现四个人的访问地址一模一样,也就是说如果我们修改了这里的代码,在对我方阵营生效的同时对敌方阵容也会生效。
tips:这里还有一个技巧,向上面这样一个一个查看是很麻烦的事情,这里可以只定位一个,然后选择显示反汇编程序:
在对应的指令上右击显示找出这个指令访问的地址
然后依次对四个玩家进行攻击,可以发现每个玩家共用的都是同样的代码。
通关条件很明显是要左边的两名玩家战胜右边的两名BOSS,这里有几种方法解决战斗,先说第一种。
方法一:动态调试
首先随便点一下各个玩家的攻击
按钮,这里可以发现一个规律,每次玩家阵营扣血都是几滴几滴的扣,具体扣多少是随机的,而BOSS阵容扣血每次都只扣一滴。发现这个规律后,开始动态调试程序。
随便找一个操作码访问窗口选择显示反汇编程序
以此调处共用的反汇编代码:
在访问地址代码处也就是第一行下断点,点击攻击程序会自动停在断点出,这里可以对每个玩家各攻击几次,然后观察参数变化,可以发现对玩家每次攻击的伤害都是大于1的而且伤害的值存在了RSI寄存器。
上图RSI的值为2,Eric的血量为71,然后点击运行,下图Eric的血量就变成了69。
发现了这些信息,就可以大概理一下方法一的思路了,在下断点处进行代码注入,当程序执行到这里时,对RSI寄存器的值做判断如果值为一时,就正常执行原来的代码,如果值不为一就什么也不做。思路就是这样具体操作如下:
点击工具选项卡→选择自动汇编→选择模版选项卡→选择代码注入
打开模版后在newmem段中输入要注入的代码:
cmp rsi,1 // 判断扣血量是否为1
jz originalcode // 如果为一则执行源代码扣一滴血
jmp exit // 如果不为一则什么也不做。
完整代码为:
alloc(newmem,2048,"Tutorial-x86_64.exe"+2F25D)
label(returnhere)
label(originalcode)
label(exit)newmem: //这是分配的内存,你已经拥有读、写、执行的权限。
//在此处输入你的代码
cmp rsi,1
jz originalcode
jmp exitoriginalcode:
movss [rbx+08],xmm0exit:
jmp returnhere"Tutorial-x86_64.exe"+2F25D:
jmp newmem
returnhere:
输入好代码后点击执行,然后就可以按重新启动游戏并自动执行
按钮来验证方法可行性:
方法二:官方解法
官方的解法有发在youtube上,点击实例程序右上角的灯可以直到教学链接:
还是打开反汇编程序,在当前指令上右击,选择找出这个指令访问的地址
,之后会弹出新的窗口:
打开上图窗口后是空的,很简单是因为这时没有选择攻击任何玩家自然没有代码访问该地址,此时回到学习软件,挨个点击一遍四个玩家的攻击按钮,窗口就会出现四条记录:
全选四条记录,右击选择打开选中地址的分析数据
:
之后一路选择正确
和是
就会打开结构分析窗口(中途出现的4096表示是以当前地址开始向后分析多少个地址可以改小些因为用不了这么多,也可以不用改问题不大):
到这一步就是找规律了,查看这四列相同偏移的值有何异同(其实看到这里有C语言基础的就可以猜出来每个成员就是一个结构体,这四个结构体成员的结构体类型可能是一样的):
0x08 ---- 单字节浮点数,又和健康值一一对应,确认是血量无疑
0x0c ---- 不知道有什么用
0x10 ---- 也不确定
0x14 ---- 阵容编号
0x18 ---- 成员名称的字母个数
0x19 ---- 成员名称
这里我们大致猜测了一些结构体成员所代表的意义。到这里就是编写注入代码了,这次选择的突破口是位于偏移0x14的阵容编号,通过判断RAX+0x14处的值来区分阵容,代码和之前的代码类似:
cmp [rbx+14],1 //判断Team Nameber是否为1
jnz originalcode //不为1则执行原来的减一代码
jmp exit //否则代表为己方阵容成员,什么也不做相当于跳过了当前语句
点击执行,然后回到学习程序选择重新启动游戏并自动执行,就可以验证这个方法成功与否了。
tips:官方其实在这个方法之前还介绍了一种将两个阵容分成两个Group的方法,但着实是听不懂他们在说什么东西,自动翻译也没翻译出来,感兴趣的可以去youtube上自行了解。
这篇关于Cheat Engine基础教程:软件汉化及Tutorial通关思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!