欢迎你来到 Cheat Engine 训练教程
这个教程是为了讲解游戏中作弊的一些基本步骤,并让你熟悉 Cheat Engine 的使用方法。
首先运行 Cheat Engine ,如果你还没运行的话。然后点击 "选择进程" 图标按钮 (左上角有电脑的那个图标)
当进程列表窗口打开后,找到这个教程,进程的名字应该是 "tutorial.exe" ,除非你把它改名了,选择它,并点击 打开 。现在暂时不要理会其它的按钮,如果你愿意的话,以后再研究它们。
如果没什么问题,进程列表窗口将会消失并且在 Cheat Engine 主界面的上方会显示选择的进程名。
好了,点击 "下一步" 按钮进入下一个步骤 (或输入密码进入你想练习的步骤)。
步骤 2: 精确值扫描 (密码=090453)
现在你已经在 Cheat Engine 中打开了 训练教程 ,为我们进入到下一步作好了准备。
在这个窗口的左下方的 健康:XXX ,每次你点击 "打我" 时,健康值便会减少。
要进入下一关,你必须找到这个数值并把它改成 1000 。
有不少方法都可以找到这个数值的位置,但我会告诉你一个最简单的方法,“精确数值扫描”:
首先确认数值类型设置为2字节或4字节,当然,设置成1字节也可以的,但最终修改它的时候便会有点麻烦了(虽然很容易解决),如果该地址后边的字节数值都是 0 ,那么你设置成 8 字节也未尝不可,不过在这我们就不必尝试了。单浮点数,双浮点数,以及其他的扫描方在这里行不通的,因为它们储存数值的方式不同。
(注:1个字节所表示的最大数值为十进制的 255 ,十六进制为 FF ,2个字节所表示的最大数值为十进制的 65535 ,十六进制表示为 FF FF ;通常在游戏中很少有用8个字节表示数值)
当数值类型设置正确后,确认扫描类型设置在 "精确数值" ,把健康值填在数值输入框上,并点击 "首次扫描" ,一会儿(如果你的电脑非常慢的话),扫描完毕后,扫描的结果将会显示在主界面的左侧。
如果你扫描到不止一个地址,你又不知道哪一个是正确的,那么继续点击 训练教程l 上的 "打我" ,并把变更后 健康值 填到数值输入框中,然后点击 "再次扫描" ,重复这些步骤,直到你能确认你已经找到地址(在地址列表上只有一个地址)。
好,双击左边列表上的地址,这个地址便移动到下方的列表上并显示它的当前数值。
双击下方列表的中数值(或者选择它,按下回车),填入你要修改的数值:1000 。
如果操作正确,下一步按钮将会变成可点击的了,你就可以准备进入下一关了。
提示:
如果你在扫描过程中做错了,可以点击 "新的扫描" 重新再来。当然,你也可以点 "打我" 去找一些更有价值的线索。
步骤 3: 未知的初始值 (密码=419482)
OK,看来你已经理解了怎样利用精确数值扫描并找到一个数值了,让我们进入下一步。
在上一关中我们知道初始数值的大小,所以我们利用精确数值扫描,但这一关中我们仅有一个进度条,我们并不知道它开始时的数值。
我们只知道这个数值在0到500之间,并且每次你点 "打我" 之后你会减些健康值,每次减的健康值会显示在进度条的上方。
同样有好几种方法可以找这个数值,(例如使用 "数值减少了..." 的扫描方式),但我只教你使用最简单的方法,"未知的初始值" 和 "减少的数值" 。
因为你不知道现在数值的多少,利用精确数值进行扫描便派不上了用场,所以选择扫描方式为 "未知初始数值" ,数值类型仍然选择 4 字节(这是因为大多数WINDOWS应用程序都使用 4 字节存放数据)。
点击 "首次扫描" 并等它扫描完成。
扫描完成后,点击 "打我" ,你会掉些健康值 (失去的健康值会显示几秒后消失,不过你并不需要关注它)。
回到 CE,在扫描类型中选择 "减少的数值" ,点击 "再次扫描" 。
当扫描完成后,再次点击 "打我" ,并重复上面的步骤,直到你找到了很少的几个地址。
刚才我们说过,这个数值在0到500之间,所以挑出那个相似的地址,并将它加到下方的列表。
现在,更改健康值为 5000,以便我们进到下一关。
Step 4: 浮点数 (密码=890124)
在前面的教程中,我们使用字节的方式来扫描,但有些游戏使用了 "浮点数" 的来存储数值(这么做是为了给新手制造一些麻烦,让他们没那么容易修改游戏)。
浮点数是带有小数点的数字(如5.12或11321.1)。
正如本窗口中的健康和弹药,两者都以浮点方法储存数据,不同的是,健康为单精度浮点数,而弹药为双精度浮点数。
点击 "打我" 可以减少一些健康值,而点击 "开火" 可以消耗掉 0.5 的弹药。
你得把这两者都修改到5000或者更多才能过关。
"精确数值" 扫描的方式虽然可以完成本关的工作,但也许你应该试试其它的扫描方式。
Step 5: 代码查找 (密码=888899)
某些游戏重新开始时,数据会存储在与上次不同的地方,甚至,游戏的过程中数据的存储位置也会变动,在这种情况下,你还是可以简单几步搞定它。
这次,我将尽量阐述如何运用 代码查找 的功能。
下方的数值在你每次启动 Tutorial.exe 的时候都会存放在不同的位置,所以正常的(固定的)地址列表就不管用了。
我们要先找到这个数值的存储地址(要如何去做,确信不用我再啰嗦了)。
当你找到地址后,右击 CE 中的这个地址,在菜单中选择 "找出是什么改写了这个地址" 的选项,会弹出一个空白的窗口。
接着,点击 Tutorial.exe 窗口上的 "改变数值" 按钮,并且回到 CE ,如果操作没问题,在刚才弹出的空白窗口中,会出现一些汇编代码,选中它,点击 "替换" 按钮,将它替换成什么也不做的代码,同时,修改后的代码也将放置在 高级选项 的 代码列表 中去(当你保存地址列表时它将会同时保存)。
点击 "停止" ,这样游戏会接着以正常的方式运行下去,然后,点 "关闭" ,关掉这个窗口。
好了,点击 Tutorial.exe 窗口上的 "改变数值" ,没问题的话,"下一步" 将变成可点击的了。
提示:如果你以足够快的速度锁定住这个地址,"下一步" 按钮也会变成可点击的。
步骤 6: 指针: (密码=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窗口上的 "改变指屋" 按钮,如果一切正确,那么 "下一步" 按钮将变成可点击状态了。
提示:
你也可以使用 "指针扫描" 的方式来找到这个指针地址。
步骤 7: 代码注入: (密码=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点),这样看上去很容易让人迷惑,但最终方案还是由你来决定好了。
提示:
某些游戏中,原代码可能在多条指令之外,有时候(并非一向如此),它可能由不同的地方跳转至你的指令中并结束运行,其结果可能引起未知的错误;如果出现了这种情况,通常应当查看附近的那些跳转指令,进行修改,或者在尝试使用不同地址进行 代码注入,确认无误后便可以将你修改的代码注入原代码中了。
步骤 8: 多级指针: (密码=525927)
此步骤,将解释如何使用多级指针。
在第 6 步,你已经清楚1级指针的概念和用途, 并可以利用数值的首个地址找到存放数据真正的基址。
在本关中,你将看到4级指针,它由第一个指针指向第二个指针,再由第二个指针指向第三个指针,由第三个指针指向第四个指针,最终指向健康值的真正地址。
开始的几步与在第 6 步中的操作基本相同。找出是什么访问了这个地址,然后分析汇编指令,查找指针地址中的数值,以及它的偏移量,将它们记下来。但这次你按数值找出的仍然是一个指针,你得依据这些数值,使用同样的操作方法找出指向这个指针的指针。
看看是什么访问了你发现的那个指针地址,分析汇编指令, 留意可能的代码和偏移量,并加以利用。
持续这种过程,直到不能更进一步查找为止(通常基址为静态时,地址将以绿色标示)。
点击 "改变数值" 改变健康值,如果你发现列表中那些指针地址所指向的值发生同样的变化时,那表示你可以试着将基址中的值更改为 5000,并锁定它,以便完成本关的任务了。
备注1:
本步骤也可以使用自动汇编程序脚本或者使用指针扫描器加以解决。
备注2:
在某些情况下,可以改变CE软件 "代码查找" 的相关设置,当你遇到像 mov eax,[eax] 的指令时,调试程序将显示改变之后的寄存器中的值,也许利用它更容易找出指针的位置。
备注3:
你还在读?!当你查看汇编指令时你可能已经注意到,这些指针是在相同的代码块(相同的程序,如果你懂汇编,可以查看程序的起始代码)位置被读写。这种情况并不总会发生,但是当你在查找某个指针遇到问题的时候,没准能起到很大的用处。
步骤 9: 注入++: (密码=31337157)
这一步基本上和步骤 7 的做法是相似的,不过稍稍有点难度。
本关你必须用一小段代码来修改减少健康值的原代码,并且做到,如果当前时间的秒数大于或等于 30 将健康值设置为1000,如果当前时间的秒数小于 30 将健康值设置为 2000。
我们可以用 API 调用函数获取当前的时间,并利用 自动汇编 完成这项任务,但这里好象有更简单的做法:C语言脚本注入。
找到健康值的地址,然后打开 CE 脚本引擎 (内存浏览器窗口 快捷键:ctrl+alt+a ,或是点击 工具->脚本引擎)。
然后,和其它的教程不同的是,这在里我会多给你一些提示(假设你从未接触过C语言)。
----------------
#include
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 窗口上 "打我" 。
如果没什么问题的话,健康值会按照当前的时间变动。
额外信息:
正如前面所说,CE 支持标准的汇编语言。所以,你可以在代码中使用函数名称来调用函数。
你也可以在脚本中引用 DLL 文件,例如:
injectdll(mydll.dll) // 可以使用你喜欢的语言去写DLL文件
codecave:
call functionofmydll
jmp exit