Cheat Engine Tutorial 闯关手记 第一关
Cheat Engine 能做什么?修改游戏的数值,就象《金山游侠V》,但它能胜任动态地址的查找;制作游戏专用的修改器,补丁,你可以将制作好的补丁发布出去,让大家共享你的乐趣;当然,Cheat Engine 还能更多的事情,比如,制作网游外挂,软件反汇编等等,具体的介绍大家可以BAIDU一下。
Cheat Engine (简称 CE )的作者为了让大家更快的熟悉软件的使用方法,发布的同时还附带了练习小程序 Tutorial.exe ,这个小序程将我们在修改游戏过程中所遇到的问题总结在一起,分成了 8 个关卡(5.5 版),让我们一步一步的学习,最终成为——游戏作弊高人!
本篇手记就是 Tutorial.exe 的第一关的闯关记录,我会尽量将我所理解的全盘记叙下来,有兴趣的朋友一起研究,共同进步吧~
通过本关的任务,可以熟悉 CE 基本的操作界面,并可以解决最简单的数值修改问题。
在开始之前,我们先统一软件,否则研究起来可能会有不少的出入,CE 目前已经有了 5.6 版本,但汉化的版本好象还不甚完美,本手记使用 Cheat Engine 5.5 汉化中文版,英文牛人飘过好了……
下载地址 (注:如果链接无效,请至迅雷网站查找 Cheat Engine 5.5 中文版)
本人汉化的 Cheat Engine 5.6.1 下载地址
将下载的压缩包解压,已解压的文件夹下将包括如下图所示的文件:
我们要关注的是图上用红字标注出的执行程序,执行汉化版程序,CE 主界面如下图所示:
好象用不着怎么介绍,我们可以看出,在没有选择进程的情况下,CE 有部分是“虚”的,图中我用红框标示的部分,并且界面左上方 图标周围红绿框在不停的闪烁。
现在可以执行练习程序了,首先看到的是欢迎界面,没错,它是英文的,呵呵,如下图:
(注:网上有人将这个小程序汉化了,但在用 CE 分析时可能会出错,无法完成预定的关卡,建议大家还是用英文版的)
鉴于大家应该和我一样的英盲,下面将翻译过的文本提供给大家,上图中的文本大意如下:
欢迎你来到CE教程。 (v3.1)
这个教程是解释在游戏中作弊的基本步骤,并让你更熟悉CE的使用。
首先运行CE,如果你还没运行的话。然后点击 "请选择要调试的程序" 按钮 (在左上角有电脑图标的那个)
当进程列表窗口打开后,找到这个教程,进程的名字应该是 "tutorial.exe” ,除非你把它改名了,选择它,并点击 打开 。现在先不要管其他的按钮,如果你愿意的话,以后再研究它们。
如果没什么问题,进程列表窗口将会消失并且在 CE 主界面的上方会显示选择的进程名。
好了,点击 next 按钮继续到下一个步骤 (或者输入密码进入你想去的其它练习)。
明白说了什么,我们照做吧,点击那个不停闪烁电脑图,在弹出的进程列表中选择 Tutorial.exe ,打开它,如下图所示:
打开后如下图:
我们再点击 Tutorial.exe 上的 next ,看看第一关我们要做什么,如下图:
翻译如下:
步骤 2:精确数值扫描 (密码=090453)
现在你已经在 CE 中打开了 Tutorial ,为我们进入到下一步作好了准备。
在这个窗口的左下方的 Health (血值):XXX ,每次你点击 "Hit me" 时,血便会减少。
要进入下一关,你必须找到这个数值并把它改成 1000 。
有不少方法都可以找到这个数值的位置,但我会告诉你一个最简单的方法,“精确数值扫描”:
首先确认数值类型设置为2字节或4字节,当然,设置成1字节也可以的,但最终修改它的时候便会有点麻烦了(虽然很容易解决),如果该地址后边的字节数值都是 0 ,那么你设置成 8 字节也未尝不可,不过在这我们就不必尝试了。单浮点数,双浮点数,以及其他的扫描方在这里行不通的,因为它们储存数值的方式不同。
(注:1个字节所表示的最大数值为十进制的 255 ,十六进制为 FF ,2个字节所表示的最大数值为十进制的 65535 ,十六进制表示为 FF FF ;通常在游戏中很少有用8个字节表示数值)
当数值类型设置正确后,确认扫描类型设置在 "精确数值" ,把血的数值填在数值输入框上,并点击 "首次扫描" ,一会儿(如果你的电脑非常慢的话),扫描完毕后,扫描的结果将会显示在主界面的左侧。
如果你扫描到不止一个地址,你又不知道哪一个是正确的,那么继续点击 Tutorial 上的 "Hit me" ,并把变更后 血的数值 填到数值输入框中,然后点击 "再次扫描" ,重复这些步骤,直到你能确认你已经找到地址(在地址列表上只有一个地址)。
好,双击左边列表上的地址,这个地址便移动到下方的列表上并显示它的当前数值。
双击下方列表的中数值(或者选择它,按下回车),填入你要修改的数值:1000 。
如果操作正确,下一步按钮将会变成可点击的了,你就可以准备进入下一关了。
提示:
如果你在扫描过程中做错了,可以点击 "新的扫描" 重新再来。当然,你也可以点 "Hit me" 去找一些更有价值的线索。
OK,我们一步一步的来,首先按下图所示填好界面中的选项:
血值,呵呵,如果你刚才没有点击 "Hit me" 的话,它初始就是100,不信的话,你看上面的关于 Tutorial 图示?如果你已经忍不住点了两下,那么你要在 CE 数值框中填入你目前的血值再点击 首次扫描 按钮;第一次扫描,CE 找到 Tutorial 程序中所有值为100的地址,显示在左侧的列表中,如下图:
在左侧列表的上方,可以看到扫描结果为:39 ,表示CE找到了39个值为100的地址,太多了,我们不能确定哪一个才是我们要找的,这时,可以点击 "Hit me" 了,让血值产生变化,CE便可以查找或监控到哪一个地址发生了变化;点击后,如下图所示:
现在,血值为97,将97填入 CE 的数值框中去,然后点击 "再次扫描" 按钮,如下图:
很快,CE找到了惟一的地址,双击它,或是点击图中 按钮,便可将该地址转入下方的列表中,如下图:
简单介绍一下,"锁定" :勾选可将数值锁定(即不产生变化,保持数值不变);"说明" :可以帮助我们记忆修改的地址内容,比如说,我们可以双击图中 "无说明" 处,改为 "生命值";"地址" :放置数值的内存地址;"类型":数值类型;"数值":数值喽。
按照 Tutorial 本关的提示,双击"数值" 处,或是单击这一栏,按回车键,在弹出的对话框中填入 1000,如下图:
确定后,可以看到CE 下方列表 "数值" 部分已变更为 1000,如下图:
看一下 Tutorial ,next 按钮已经激活,但好象数值还是 97,呵呵,勾选上"锁定",再点一下 "Hit me" ?是不是搞定了?!
至此,闯过第一关了,好累,呵呵,不是说我水平不行哦,短短几分钟的事,为了写这个足足花费了2个多钟头的时间;希望大家都能看明白,因为第二关,我就不会插入这么多的图片说明了,毕竟不能老做重复的功,与本关相似的地方,文字说明好了~
哦,别忘了,记下第二关的密码(PW=419482),下次直接从第二关开始……
Cheat Engine Tutorial 闯关手记 第二关
经过第一关的演练,我们熟悉了 CE 的界面,用它查找到了有精确数值的地址,看来以后修改一下游戏中的生命,金钱,经验之类的应当没什么问题了,那么第二关是什么考验呢?
执行 Tutorial.exe 文件,在欢迎窗口的右下角,输入上次我们获得的第二关的密码,点击 "OK" 键,进入第二关,如果打从我上篇讲完你压根没休息,那就忽视这段……
先翻译第二关的说明,还象上篇一样用淡蓝色的字体标示如下:
步骤 3:未知初始数值 (PW=419482)
OK,看来你已经理解了怎样利用精确数值扫描并找到一个数值了,让我们进入下一步。
在上一关中我们知道初始数值的大小,所以我们利用精确数值扫描,但这一关中我们仅有一个进度条,我们并不知道它开始时的数值。
我们只知道这个数值在0到500之间,并且每次你点 "Hit me" 之后你会减些血,每次减的血量会显示在进度条的上方。
同样有好几种方法可以找这个数值,(例如使用 "减少了的数值..." 的扫描方式),但我只教你使用最简单的方法,"未知初始值" 和 "减少的数值" 。
因为你不知道现在数值的多少,利用精确数值进行扫描便派不上了用场,所以选择扫描方式为 "未知初始数值" ,数值类型仍然选择 4 字节(这是因为大多数WINDOWS应用程序都使用 4 字节存放数据)。
点击 "首次扫描" 并等它扫描完成。
扫描完成后,点击 "Hit me" ,你会掉些血 (失去的血量大小会显示几秒后消失,不过你并不需要关注它)。
回到CE,在扫描类型中选择 "减少的数值" ,点击 "再次扫描" 。
当扫描完成后,再次点击 "Hit me" ,并重复上面的步骤,直到你找到了很少的几个地址。
刚才我们说过,这个数值在0到500之间,所以挑出那个相似的地址,并将它加到下方的列表。
现在,更改血值为 5000,以便我们进到下一关。
好,弄明白过关要求,我们执行 CE ,点击 选择 Tutorial.exe 进程,并打开它,按下图设置好,点击 "首次扫描" (如果进行完上一篇你没有关闭 CE ,需要先点击 "新的扫描" 按钮,然后再点击 "首次扫描" ,这意味着你告诉 CE ,你现在要进行一个新的任务)。
扫描完毕,我们可以看到扫描结果有许多,这个数字也许在你那会有所不同,左侧的地址列表中没有显示任何的数据(上一篇的说明中提到过:超出额定的数据量,数据便不会显示),好,回到 Tutorial.exe 程序,点击窗口左下角的 "Hit me" ,血量会下降一点,再回到 CE ,按下图设置好,点击 "再次扫描" 。
可以看到扫描结果减少了一部分,但仍然无法确认哪一条才是我们要找的地址,所以,回到 Tutorial.exe 程序,点击 "Hit me" ,血量下降后,回到 CE ,点击 "再次扫描" ,重复桔红色的步骤直到左侧的地址列表中只剩下了很少的几个地址,如下图所示:
双击它,将该地址转至下方的列表中,并修改数值为 5000,如下图:
回到 Tutorial 窗口,next 按钮已经可以点击了,让我们进入第三关!别忘了记下第三关的密码 (PW=890124),我得先休息一下~
注:写这篇文章的过程中,发现按 "未知初始值" 搜索时,软件会偶尔报错,说是内存访问出错,在网上查找原因未果,试着在 "首次扫描" 前,将 内存扫描选项 中的 精细扫描 勾选后,进行扫描就不再报错;如果你也碰上这样的问题,可以试一下,或是找个安装版的重新安装。
Cheat Engine Tutorial 闯关手记 第三关
通过第二关,玩《拳皇》,血也不掉了……看看第三关说点什么?
步骤 4:浮点数 (PW=890124)
在前面的教程中,我们使用字节的方式来扫描,但有些游戏使用了 "浮点数" 的来存储数值(这么做是为了给新手制造一些麻烦,让他们没那么容易修改游戏)。
浮点数是带有小数点的数字(如5.12或11321.1)。
正如本窗口中的血和子弹,两者都以浮点方法储存数据,不同的是,血为单精度浮点数,而子弹为双精度浮点数。
点击 "Hit me" 可以减少一些血,而点击 "Fire" 可以消耗掉 0.5 的子弹。
你得把这两者都修改到5000或者更多才能过关。
"精确数值" 扫描的方式可以胜任本关的工作,也许你想试试其他的扫描方式?
本关看来比较容易,将扫描类型设置为 "精确数值" ,数值类型按浮点数精度设置正确,便可以使用第一关的步骤完成任务。
血和子弹需要分别完成,咱们先扫描血的值,OK,用 CE 打开 Tutorial.exe 的进程(呵呵,如果你没有休息的话,这步省略,直接点击 CE主界面中的 "新的扫描" 便可以了,下次我就不再说明了),比照下图设置,进行首次扫描:
扫描出的结果看不出是哪个地址,我们点击 Tutorial.exe 窗口上的 "Hit me" , 回到 CE ,我们发现 CE 将变化的地址放在了左侧列表的第一位,如下图:
没错,就是它,双击转至下方列表,将数值改为 5000;点击 "新的扫描" 为修改子弹做好准备,参照下图设置,扫描子弹的数值:
点击 Tutorial.exe 窗口上的 "Fire" ,回到 CE 窗口,左侧列表中第一位数据已经发生了变化,如下图:
已经很肯定是它了,照旧将它转至下方列表,修改数值 5000,如下图:
Tutorial.exe 窗口上的 next 按钮可以点击了,记下第四关的密码 (PW=888899) ,休息一下!
Cheat Engine Tutorial 闯关手记 第四关
第三关,练习程序已经告诉我们数值的类型是什么了(浮点数),所以我们有的放矢,感觉容易了许多,但在真正的游戏中,我们可看不出是以什么方式存诸的数据,那就要多试几次了(变更 CE "数值类型"),这也许是个比较漫长的过程……
第四关的说明翻译如下:
步骤 5:代码查找 (PW=888899)
某些游戏重新开始时,数据会存储在与上次不同的地方,甚至,游戏的过程中数据的存储位置也会变动,在这种情况下,你还是可以简单几步搞定它。
这次,我将尽量阐述如何运用 代码查找 的功能。
下方的数值在你每次启动 Tutorial.exe 的时候都会存放在不同的位置,所以正常的(固定的)地址列表就不管用了。
我们要先找到这个数值的存储地址(要如何去做,确信不用我再啰嗦了)。
当你找到地址后,右击 CE 中的这个地址,在菜单中选择 "查找写入该地址的代码" 的选项,会弹出一个空白的窗口。
接着,点击 Tutorial.exe 窗口上的 "Change Value" 按钮,并且回到 CE ,如果操作没问题,在刚才弹出的空白窗口中,会出现一些汇编代码,选中它,点进 "替换" 按钮,将它替换成什么也不做的代码,同时,修改后的代码也将放置在 高级选项 的 代码列表 中去(当你保存地址列表时它将会同时保存)。
点击 "停止" ,这样游戏将会接着以正常的方式运行下去,然后,点 "关闭" ,关掉这个窗口。
好了,点击 Tutorial.exe 窗口上的 "Change Value" ,没问题的话,"next" 将变成可点击的了。
提示:如果你以足够快的速度锁定住这个地址,"next" 按钮也会变成可点击的。
本关对于不懂汇编的可能有点难,即便找到了关键的代码,又该如何修改呢?别被吓的打了退堂鼓,幸亏改游戏用不着太多的汇编指令,嘿嘿。
用 CE 打开 Tutorial.exe 的进程,按第一关的方法查找数值的地址,结果如下图所示:
在 CE 下方的地址上点击鼠标右键 ,弹出菜单如下:
选择 "查找写入该地址的代码" ,弹出下图的警示框:
大意是:这将使用CE来调试进程,无视它,选择 "是",弹出了两个窗口,如下图:
点击 Tutorial.exe 窗口上的 "Change Value" ,返回 CE ,刚才空白的窗口中出现了一条汇编代码,选择它,点击 "替换" ,如下图:
当你将鼠标放置在 "替换" 按钮上足够长的时间,你会发现有条提示信息,“将替换内存无关紧要的代码。 (Nops)”,呵呵,它告诉我们两个信息,1.万一改的不对,可能会影响程序的使用;2.那条让计算机什么也不做的代码就是 "nop" (汇编指令中 nop ,表示空指令)。
点击 "替换" 按钮,在对话框中填入空指令,如下图:
点击 确定 ,在刚才 "替换" 按钮 的下方有 "更多信息" 按钮,现在,你可以点击它,或是双击窗口上的那条汇编代码,弹出如下图所示的 更多信息窗口:
可以看出,在原本代码行(红色标识),已经更改了新的指令(空指令),关闭信息窗口,点击 "停止" 按钮,如下图:
点击后,该按钮上的文字会变为 "关闭" ,没错,关闭它,随手关掉刚才我们需要忽视的那个窗口~
Tutorial.exe 窗口上的 next 按钮还不能点击?再 "Change Value" 一下吧。记下第五关的密码 (PW=098712) ,休息一下~
Cheat Engine Tutorial 闯关手记 第五关
我记得《植物大战僵尸》的太阳数值就是变动的,第四关的学习,我想便能解决这个问题了~
第五关的说明翻译如下:
步骤 6: 指针 (PW=098712)
上一步解释了如何使用 代码查找 功能对付变化位置的数据地址,但这种方法往往不能达到预期的效果,所以,我们需要用到指针。
在本关的 Tutorial.exe 窗口下面有两个按钮,一个会改变数值,另一个不但能改变数值而且还会改变数值在内存中存储的位置。
在这一步,你不需要懂汇编,但如果你懂的话会很有帮助。
首先找到数值的地址,然后,再找到是什么在改写这个地址。再次改变数值,CE 便可以将找到的汇编代码列出来,双击一行汇编代码(或选择它 并点击 "更多信息"),打开的 更多信息窗口 将显示详细的信息,来告诉你当这个指令运行时发生什么事情。
如果这条汇编指令中,没看到方括号([])的存在,我们就应该换另外一条汇编代码查看详细信息,如果看到了方括号,那就表示我们找到了需要的指针了。
除了 更多信息窗口我们暂时保留以外(如果你已经关掉了,那么要记好方栝号中间的代码),剩余的窗口请关闭掉,回到CE主窗口,做一次4字节的扫描,扫描 更多信息窗口 中告诉你的一串十六进制数值。
当扫描完成时,它可能返回一个或几百个地址。大多数情况下你想要的会排在地址列表中的最上面。
点击 手工添加地址 按钮,并在勾选 "指针" 选项。
添加地址窗口 将发生变化,多出了 "Address of Pointer" 和"Offset (Hex)" 的文本框,在 "Address of Pointer" 那一栏中填入刚才扫描到的地址。
如果汇编指令中的方栝号中存在计算(例如:[esi+12]),那么应当把数值部分填在 "Offset (Hex)" 的文本框中,如果不存在,则让它保持为 0 。
如果看上去是更复杂的计算指令的话,不若举例说明一下:
[EAX*2+EDX+00000310] eax=4C 并且 edx=00801234 (在更多信息窗口的下方,会列出寄存器中的值)
这种情况下 EDX 便是数值的指针,而 EAX*2+00000310 则是它的偏移量,所以你要填在 "Offset (Hex)" 将是 2*4C+00000310=3A8 (这些都是在十六进制下计算的,你可以使用WINDOWS的计算器,在科学方式下用十六进制计算)。
点击确定,这个地址便会加到 CE主窗口下方的列表上,如果没做错,在地址处将显示 P->xxxxxxxx,而 xxxxxxxx 会和你扫描到的地址数值是一致的,如果不一致,那么你可能哪里出错了。
现在,改变那条指针地址的数值 5000 并锁定它,,然后点击Tutorial.exe窗口上的 "Change pointer" 按钮,如果一切正确,那么 "next" 按钮将变成可点击状态了。
提示:
你也可以使用 "扫描该地址指针" 的方式来找到这个指针地址。
看上去好头晕,我们一步一步的来,用第四关的方式我们可以找到数值的地址,将地址转入CE下方的列表中,点击鼠标右键,选择 "查找写入该地址的代码" ,如下图:
在Tutorial 窗口中点击 "Change Value" 按钮,回到 CE ,出现改动地址的汇编代码,查看更多信息,如下图:
按照本关的说明,只要汇编代码的指令中含有方括号的部分,就象上图中代码里的 "[eax]",我们便可以基本上判断找到了指针数据;并且CE会提示我们应该查找的数值,呵呵,就是中间用英文 "Copy memory" 开头的部分,我们只需要在这部分提示文字上点击鼠标右键,选择 "复制信息到剪贴板",便可以复制数值,以备后用,如下图:
关闭不需要的窗口,回到CE主窗口,点击 "新的扫描" ,将刚才获得的一串十六进制的数值填在数值框中,然后点击 "首次扫描" ,参照下图设置:
扫描后,得到惟一的地址,如下图:
看到地址用绿色的标注,表示我们找到了需要修改的数据其真正的固定地址,现在,我们点击,"手动添加地址" 按钮,参照下图填写:
因为汇编代码方括号中的指令,并不存在本关说明中所说的计算,所以,"Offset (Hex)" 中填入 0,点击确定,在CE 主窗口的下方列表中出现该条地址,如下图:
呵呵,正象说明中所说的,地址以 P->xxxxxxxx 的形式出现,xxxxxxxx 也与扫描到的地址数值一致;最关键的,它所指向的数据与最初找到的也一致,就是列表的 "数值" 部分。
现在可以改数值为 5000,并且锁定它了,如下图:
在Tutorial 窗口中点击 "Change pointer" 按钮,next 接钮可以点击了;记下第六关的密码 (PW=013370) ,让老汉好好休息一下~
Cheat Engine Tutorial 闯关手记 第六关
结合第四关与第五关的教程,可以将数值存储的真正地址找出来,锁定数值或修改游戏中的代码,如果你想制作在任何电脑上都能使用的修改器补丁,那么这两关的学习至少是个前题。
本关的说明解释如下:
步骤 7:代码注入 (PW=013370)
代码注入是将一小段代码注入到目标进程中的技巧,然后使这个进程执行你写入的代码。
在这一步教程中,你将有一个血值和一个每按一次将减少1点血值的按钮,你的任务是利用 代码注入 ,使得每按一次按钮增加2点的血值。
开始查找这个地址,然后查看是什么在改写它("查找写入此地址的代码")。
当你看到那条减少数值的汇编代码已经后,选择 "显示反汇编程序" , 然后打开 自动汇编窗口 (菜单-工具->自动汇编 或 按下快捷键 Ctrl+a ),选择 "模板" 中的 "代码注入" 。CE将自动生成一部分汇编代码并为你输入指令做好准备(如果CE没有给出正确的地址,你可以手工输入它)。
注意 alloc 这部分代码,它会为你的代码分配出一小块空白的内存,过去,在 Win2000 之前的系统,这种行为存在安全隐患,很可能导致系统崩溃,幸运的是,这种情况在 win2000 以后的操作系统得到改善
。
也要注意 line newmem 这部分代码,原代码,以及用文本 "此处放置你的代码" 标示出的空白部分,正如你猜测的,在这儿可以写下每次增加2点血值的代码。
推荐你使用 "ADD" 汇编指令,下面是一些示例:
"ADD [00901234],9" 使 [00901234] 地址的值增加9
"ADD [ESP+4],9" 使地址指针 [ESP+4] 的值增加9
在本关的情况下,你可以使用相同的手法去处理 减血值那条原代码方栝号之间的那部分。
提示:
推荐你从原代码中删除减血值的那行代码, 否则你得加3点生命值(你增加了3点,原代码减去1点,最终结果才会增加2点),这样看上去很容易让人迷惑,但最终方案还是由你来决定好了。
提示:
某些游戏中,原代码可能在多条指令之外,有时候(并非一向如此),它可能由不同的地方跳转至你的指令中并结束运行,其结果可能引起未知的错误;如果出现了这种情况,通常应当查看附近的那些跳转指令,进行修改,或者在尝试使用不同地址进行 代码注入,确认无误后便可以将你修改的代码注入原代码中了。
本关的教程应当是第四关的补充,在第四关找到代码只是简单的改为空指令,游戏运行到你修改后的指令什么都不会做,比如,按照这样的方法,我们可以制作买东西不需要花钱的,又或是不掉血的修改补丁;这一次,我们深入一点,熟悉更多的汇编指令,如果弄明白,便可以制作出买东西倒找你钱,又或是越战血越多的补丁了。
这次我们不啰嗦,按着前几关的介绍,查找到数值地址,右键 "查找写入该地址的代码" ,更改血值后,来到下图这一步:
点击 "显示反汇编" ,打开 "内存查看器" 窗口,如下图:
在 工具 菜单中选择 "自动汇编 或 按下快捷键 Ctrl+a ",如下图:
按下图打开 "代码注入" :
跳出地址填写窗口,如下图:
点击 确定 ,自动汇编已帮我们创建了一部分的代码,如下图:
能看懂汇编的,就不用我多解释了,这是一段很简单的代码,CE帮我们先开出了一小块内存用于注入我们自己的代码,然后在原地址处插入跳转语句,跳入我们输入的代码段,执行完毕后再跳转回原代码继续执行后边的代码。
现在我们要做的就是将加血的代码输入在图中 newmem 的位置,如下图代码所示:
你可以按照说明中所说的那样,在 newmem 区域,写入 "add [ebx+00000310],3",加3的原因是因为在执行完我们输入的代码后,原代码还要再减去1;当然,你也可以灵活运用我们的知识,直接将原代码改为 "add [ebx+00000310],2",那么在 newmem 区域就不用输写任何代码了,如下图:
OK,写完代码,可以点击 "执行" 按钮了,弹出确认对话框,直按点击 "是",弹出 注入成功的窗口,并提示我们,新的代码段放置的位置,如下图:
"确定" ,关闭 "自动汇编" 窗口,在 "内存查看器" 窗口 中的汇编代码部分,可以看到,原代码已被修改,如下图:
回到 Tutorial.exe 窗口 ,点 "Hit me" ,增加了2点血值,next 按钮也可以点击了,记下第七关的密码(PW=525927),我们休息一下~
Cheat Engine Tutorial 闯关手记 第七关
我们直接翻译说明吧,经过前面几个步骤的学习,基本上用不着再铺垫什么了。
步骤 8:多级指针 (PW=525927)
本关,将解释如何使用多级指针。
在第 6 步(手记中的第五关),你已经清楚1级指针的概念和用途, 并可以利用数值的首个地址找到存放数据真正的基址。
在本关中,你将看到4级指针,它由第一个指针指向第二个指针,再由第二个指针指向第三个指针,由第三个指针指向第四个指针,最终指向血值的真正地址。
开始的几步与在第 6 步(手记中的第五关)中的操作基本相同。找出是什么在访问这个数值,然后分析汇编指令,查找指针地址中的数值,以及它的偏移量,将它们记下来。但这次你按的数值找出的仍然是一个指针,你得依据这些数值,使用同样的操作方法找出指向这个指针的指针。
看看是什么访问了你发现的那个指针地址,分析汇编指令, 留意可能的代码和偏移量,并加以利用。
持续这种过程,直到不能更进一步查找为止(通常当基址是静态的地址时,这个地址将以绿色标识)。
点击 "Change value" 改变血值,如果你发现列表中那些指针地址所指向的值发生同样的变化时,那表示你可以试着将基址中的值更改为 5000,并锁定它,以便完成本关的任务了。
备注1:这个问题也可以使用自动汇编程序脚本或者使用指针扫描器加以解决。
备注2:在某些情况下,可以改变CE软件 "代码查找器" 的相关设置,当你遇到像 mov eax,[eax] 的指令时,调试程序将显示改变之后的寄存器中的值,也许利用它更容易找出指针的位置。
备注3:你还在读?!当你查看汇编指令时你可能已经注意到,这些指针是在相同的代码块(相同的程序,如果你懂汇编,可以查看程序的起始代码)位置被读写。这种情况并不总会发生,但是当你在查找某个指针遇到问题的时候,没准能起到很大的用处。
这一关很让人迷惑,关键点在于如何累加指针地址与偏移量,我们一步一步的来,先按照第五关所说的,查找到数值的第一个地址,将其加入CE的下方列表中,鼠标右键 选择 "查找写入该地址的代码" ,并查看该汇编指令的详细信息,如下图:
记下详细信息中需要查找的数值,记下方括号中的偏移量:18,关闭除CE主窗口外的其他CE窗口,点击 "新的扫描" ,勾选数值框前的Hex选项,并在数值框中填入需要查找的数值,点击 "首次扫描" ,CE主窗口的左侧列表中会列出扫描到的地址,点击 "手动添加地址" 按钮,在弹出的 "添加地址" 窗口中勾选 "指针",分别将查出的指针地址及偏移量填入对应的文本框中,如下图:
"确定" ,CE 将所地址添加在 主窗口下方的地址列表中,至此,我们已用完在第五关中所学到的知识,可以看到,本次扫描后,左侧所列地址的颜色仍然是黑色标识的,这说明虽然我们找到了地址,但它仍然不是静态的(不是真正的基址),需要继续深入下去。
在加入的地址上点右健,选择 "查找访问该地址的代码" ,如下图:
这和第一次查寻指针时选择的不一样了,要注意一下,弹出下图所示的窗口:
强烈抗议,汉化不全面……,选择第一项 "找出是什么访问了该指针"。
在 Tutorial.exe 窗口上 "Change value" 后,双击 CE 中那条汇编代码,查看详细信息,如下图:
记下需要查找的数值,还有偏移量(这次方括号中不存在偏移,那么偏移量为 0),关闭CE主窗口外所有CE窗口,按上面所说的查找新的数值,然后手动添加地址,如下图:
下面是重点哦,此时不能点击 "确定",我们还要完成一项任务!要知道,我们得出的这个地址是指针,这个指针指向的是上次我们找到的指针地址,而上次找到的指针地址才是指向我们在 Tutorial.exe 窗口上看到的那个数值地址,所以我们得将这样的关系标注出来~在添加地址窗口上,点击 "添加指针" 按钮,如下图:
我们只需要将上次的偏移量填在相应的位置上就可以了,现在可以点击 "确定" 了;CE又将新的地址在下方的列表中列出;这次扫描的地址仍然不是以绿色标识的,看来我们还没有找到真正的地址哦,继续吧,重复上述的步骤,"查找访问该地址的代码" ,"Change value" ,查看汇编代码详细信息,如下图:
查找数值,添加地址,添加指针,累计偏移量,如下图:
还不是真正的地址,继续!重复上述步骤,查看详细信息,如下图:
查找数值,你会发现,找到的地址是绿色标识的哦,如下图:
这说明我们终于来到了源头~添加地址,添加指针,累计偏移量,如下图:
"确定",地址出现在CE的下方列表中,如下图:
还有什么疑问?赶快修改数值,并锁定,在 Tutorial.exe 上点击 "Change pointer" ,next 按钮变为可点击,同时我们还能发现,除了我们找到的真正的地址数值保持不变,其他的指针地址都不再起作用了,如下图:
本关结束,记下第八关密码(PW=31337157),老汉看会电影休息一下,哈~
Cheat Engine Tutorial 闯关手记 第八关
步骤 9:注入++ (PW=31337157)
这一步基本上和步骤 7(代码注入,手记中的第六关)的做法是相似的,不过会稍稍有点难度。
本关你必须用一小段代码来修改减少血值的原代码,并且做到,如果当前时间的秒数大于或等于 30 将血值设置为1000,如果当前时间的秒数小于 30 将血值设置为 2000。
我们可以用 API 调用函数获取当前的时间,并利用 自动汇编 完成这项任务,但这里好象有更简单的做法:C语言脚本注入。
找到血量的地址,然后打开 CE 脚本引擎 (内存查看器窗口 快捷键:ctrl+alt+a ,或是点击 工具->脚本引擎)。
然后,和其它的教程不同的是,这在里我会多给你一些提示(假设你从未接触过C语言)。
----------------
#include <time.h>
struct tm *timep;
time_t c;
c=time(0);
timep=localtime(&c);
if (timep->tm_sec>=30)
*(int *)addresstochange=1000;
else
*(int *)addresstochange=2000;
-------------
使用血值的地址替换代码中的 addresstochange,另外,不要忘记在地址的前面加上 0x 。比如,地址是 0012345,则输入 0x0012345
选择 "注入" ,"注入到当前进程" ,将代码注入到当前进程,此时,"自动汇编"窗口 弹出,并自动生成调用代码(Call)。
现在,就象步骤 7 (手记中的第六关)那样,在 "内存查看器"窗口 选择代码地址,在 "自动汇编"窗口 选择 "模板","代码注入",输入刚才获取的调用代码(Call)。 要注意的是,调用代码(Call)将更改 寄存器 EAX 的数据,因此,有必要的话,你应该在压栈之前和出栈之后保存它, 你也可以将原代码移除,它在这里也起不到什么作用了。
点击 "执行" ,点击 Tutorial.exe 窗口上 "Hit me" 。
如果没什么问题的话,血值会按照当前的时间变动。
额外信息:
正如前面所说,CE 支持标准的汇编语言。所以,你可以在代码中使用函数名称来调用函数。
你也可以在脚本中引用 DLL 文件,例如:
injectdll(mydll.dll) // 可以使用你喜欢的语言去写DLL文件
codecave:
call functionofmydll
jmp exit
这一关,多少得了解一点点的C语言,不过,作者怕我们没有接触过C语言,给了我们一段C语言的代码,在说明的结尾又告诉我们,可以引用我们自己用任何语言写的DLL文件,增加CE脚本的灵活性;虽然有点头蒙,不过完成本关不需要那么麻烦,还是一步一步的来。
我们先查找 Tutorial.exe 中的数值地址,找到后,"查看写入该地址的代码",点击 Tutorial.exe 中的 "Hit me" ,"显示反汇编",如下图:
在 "内存查看器"窗口 中打开 "脚本引擎" ,如下图:
在 "脚本引擎" 窗口 填入说明中的那段代码,并将 addresstochange 替换成我们查找到的数值地址,如下图:
你可以按上图在原代码中加入 红框标识出的 代码(声名变量并赋值,值为地址,记得地址前要加 0x),也可以直接用地址替换掉 addresstochange ;将写好后的代码注入当前进程,如下图:
在打开的 "自动汇编"窗口 中 生成了调用代码,如下图:
在 "内存查看器" 选择查找到的汇编地址,回到 "自动汇编"窗口 选择 "模板" 中的 "代码注入",如下图:
CE 自动将选择的汇编地址填入(如果不正确,可以手动填写),如下图:
"确定" ,生成如下图代码:
我们需要将代码修改一下,将 call 这一条放置在 newmem 区域,将原代码注销掉,如下图:
小提示:好多网友在这段代码改写完,出现了结果为 999 或 1999 的这种情况,这可能是我没标注清楚的原因,请大家留意上图中代码 "dec [ebx+00000318]" 前边我添加了 "//" ,这表示将这条代码注释掉了,好多网友出现了这种情况应该都是忘了注释掉它的结果;感谢78461 网友的提醒!
原理在第六关已解释过了,在这就不多讲了吧,点击 "执行" ,回到 "内存查看器" 窗口,可以看到,原代码地址处的代码已修改,如下图:
OK,我们已完成代码段的注入,现在可以点击 "Hit me" 了,说明中给出的C语言代码,是调用了本地的时间,如果秒数大于等于30秒,就将血加到 1000 ,小于30秒,将血加到2000,如果一切没问题的话,next 按钮激活。我给出两张不同时间的对比图:
点击 next 按钮,通关画面,,可惜不是动画的……
至此,教学八关就完成了,但这仅仅是个基础,有空我们再研究如何实战,以及如何制作游戏的修改器~
Cheat Engine >=6.2 step9 cracked
最近才看到Cheat Engine6.2 教程增加了step9,没研究透,卡了一天,百度了一下发现国内好像还没有人研究,或者是大牛觉得都很简单没必要发布...
托同事的福,下面是过程。
之前我把step9 想的太简单了,这一步必须得懂汇编。
首先找到玩家1的生命地址,然后是基址。这步不说了,很简单。 原文中有这么一句话,
某处代码可以区别两队。我原来没仔细看,不过也实现了目标。
我的作法是,敌人生命始终大于100,只要判断大于100的生命,就置0.
代码注入:
===============================================
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)
label(cao2109)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
cmp [ebx+04],(float)200 //敌人的生命是500,无论是和200比,还是和100比都可以。
ja subhp
fldz
jmp returnhere
cao2109:
xor eax,eax
originalcode:
mov [ebx+04],eax
fldz
exit:
jmp returnhere
"Tutorial-i386.exe"+250C6:
jmp newmem
returnhere:
==================================================
点击auto的结果是敌人会被秒杀,我方不掉血。
标准作法是这样,分析两队结构,看图。
写入生命的地址是[ebx+04],那就去ebx+04 看看。右下角的几行都是结构的内容,依次取出4个人的结构。
-----------------------------------------------------------------------------------------------------------------------------------------------
play1
28 FC 54 00 00 00 BC 42 FE 26 00 00 C9 A8 1B 00 0100 00 00 04 44 61 76 6500 00 00 00 00 00 00
play2
28 FC 54 00 00 00 B0 42 EF 04 00 00 DA AE 34 00 0100 00 00 04 45 72 69 6300 00 00 00 00 00 00
play3
28 FC 54 0000 80 F7 4314 10 00 00 89 14 2E 00 0200 00 00 03 48 41 4C00 00 00 00 00 00 00 00
play4
28 FC 54 00 00 80 F8 43 6B 10 00 00 F0 DE 13 00 0200 00 00 04 4B 49 54 5400 00 00 00 00 00 00
-----------------------------------------------------------------------------------------------------------------------------------------------
我标出的黄色区域就是表示两队的一个特征。还是代码注入:
=====================================================
alloc(newmem,2048) //2kb should be enough
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
cmp [ebx+10],1 //10和A要分的清啊。
jne originalcode
fldz
jmp returnhere
originalcode:
mov [ebx+04],eax
fldz
exit:
jmp returnhere
"Tutorial-i386.exe"+250C6:
jmp newmem
returnhere:
=======================================================
这个是目前最简单的解决办法。