Cheat Engine 训练教程

欢迎你来到 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

你可能感兴趣的:(解释器模式)