注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

风雨夜归人

专业收集资料,个人爱好!

 
 
 

日志

 
 

【原创】CE入门教程 -BY CCB  

2009-05-19 16:04:38|  分类: CCB的教程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

CHEAT ENGINE(以下简称CE)是我见过的最优秀的游戏作弊工具。它的优点多不胜数,虽然单独从搜索游戏里面的数值来说,它并不比其他同类软件强多少,但它不仅仅是个游戏修改工具,它还有其他游戏修改软件所没有的一些特点,例如:它有强大的反汇编功能,这个是别的游戏工具中几乎没有的;还有,它本身就自带了外挂制作工具,可以直接由它生成外挂。而它的界面非常简洁朴素,这也是我喜欢它的原因之一。同类软件中,我觉得TSEARCH可以和它媲美,但TSEARCH的界面比较混乱,操作过于复杂,所以我个人并不喜欢TSEARCH。

在这个教程里面,你不会看到任何图片,因为我觉得我能用纯文字教你使用CE,如果你觉得没有图片就一定学不会,我想你没必要看下去了,因为我没空做图片,并且我觉得文字已经足够表达,没必要用多余的图片。

还有如果你喜欢这个入门教程,你可以把它转载到任何地方,但在转载之前,请你征得本人的同意,并且在转载时注明作者为CCB及广海游戏(http://www.ghoffice.com/bbs/thread.php?fid=74&u=1742)或本帖连接。

好了,废话少说,进入正题吧。

其实,使用CE的基本步骤,可以简单到一句话:

1.运行CE->2.运行游戏->3.在CE中指定要修改的游戏->4.首次搜索一个数值->5.回游戏中让这个数值增加或减少->6.回CE按数值增减的情况再次搜索->7.重复5和6直到得到一个或很少的几个结果->8.在这几个结果中判断哪一个是真正的结果。

而下面的这个教程,就是要对上面说的这些步骤进行详细的解释,然后再用一个具体的例子来让大家真正掌握CE的用法。

当然,要用一个具体的例子来讲解CE的用法,需要一个游戏,以这个游戏的修改来讲解。不过,如果真正的用一个游戏来做例子,那么大家也得找到我用的游戏,就算找得到,还有可能要安装,确实比较麻烦。幸好,CE本身带了一个TUTORIAL,就是教程的意思,不过这个TUTORIAL,本身也是一个程序,它是作者为了让使用的人进行练习而编写的,它不但会一步一步地教你怎么用CE,而且它本身也和游戏差不多,除了没有游戏的画面。如果你能使用CE按这个TUTORIAL的要求对它进行修改,我想你也应该能用CE对真正的游戏进行修改了。

OK,LET'S GO!

-------------------------------------------------------------------------------------------

CE操作入门

一,如果你还没安装CE,那么开始这一切之前,当然是把它安装上,CE的安装也和其他的软件一样,很简单,没必要再罗嗦。安装后,在开始菜单上会有CE的程序组,而在桌面上会有CE的快捷方式。

二,安装好之后,就可以运行CE了,运行后,会看到CE的主界面。其实CE的主界面真的非常非常简单,简单到不能再简单了,以至于我本来想给它做汉化,结果看到它的主界面上的英语单词少得可怜,根本不需要汉化。如果你连这几个单词都没办法或者不想去弄懂,我想,你的智商应该不足以用来修改游戏,那么赶快把CE删了吧,这不是你玩的东西。

三,现在我来描述一下CE的主界面,并且解释上面的各个部分的功能和简单的用法介绍,至于使用上的具体细节,请看后面的实例。

在CE主窗口的标题栏下面,左上方有三个按钮。

第一个按钮,是指定进程的按钮。在刚运行CE,还没指定所要修改的进程时,它的外框会不停地闪动,这个是作者提醒你,使用CE要做的第一件事,就是指定一个进程(什么叫进程?简单地说,就是你系统当前正在运行的程序)。这样CE才知道你要修改的是正在运行的程序中的哪一个。点击之后,会出来一个新窗口,窗口的标题是Process List,就是当前在你的系统上运行的所有进程的列表。这个窗口的下方,还有几个按钮,你暂时不用管(一个好的学习方法,就是在接触一个新的东西的时候,先弄懂那些非知道不可的东西,然后再更细致地学习,当然最后是要什么都知道。就是说要分主次先后来学。如果一开始就去注重很多暂时不需要知道的细节,结果反而会忽略了最需要先弄懂的东西,这样的学习方法就不好了)。在这里可以找到并选择你要修改的游戏,然后点OK按钮,或者简单地就双击要修改的进程。

左上方另外的两个按钮,图标就象其他的软件一样,一个是打开的文件夹,这个是用来打开以前保存的CE的地址列表(*.CT)的打开按钮,另一个是一张软盘的图标,这个是把地址列表保存下来的。

在这三个按钮的右边,上面是一行英文,下面是一个进度条,上面的英文,当CE还没选择要修改的进程时,它会显示“No Process Selected”,表示你还没选择进程,如果已经选择了一个进程,那么它会显示你选择的进程的ID和进程名,进程ID是一个由8个十六进制代码组成的标识号,后面的进程名就是你所选择的程序,即游戏的名称。而下面进度条,是当你在进行扫描的时候,显示当前的进度。

然后,在左上角三个按钮的下方,有个英文FOUND后面有个数字,这个是表示找到的结果的数目,当还没开始扫描或最后的扫描结果是0时,显示FOUND:0。如果某次扫描时,找到的结果很多,也暂时不会显示,但在这里可以看到目前为止找到的结果数量是多少。

在主窗口中间的左边,是一个扫描结果的地址列表,一般找到的结果少于某个数(默认的设置是少于50个)时,找到的结果会全部显示在这个列表中,而如果目前找到的结果多于设置的数量时就暂时不显示。这个列表有两个栏,Address是内存地址,而Value是该地址当前的数值。地址当然是十六进制表示的,而数值是十进制的。

在主窗口中间的右边,是CE的扫描部分,上面是三个按钮,First Scan,Next Scan和Undo Scan。下面是一个输入数值的地方Value,再下来,是选择扫描方式的Scan Type,选择数据类型的Value Type,再下面是设置内存扫描选项的Memory Scan Options,这里一般不需要修改,暂时不用管它。还有右边有个Enable Speedhack的选项,这个也先不管。第一次扫描时选择好扫描类型,输入好数值后点First Scan,这是开始一个全新的扫描,当数值变化之后输入新的数值再点Next Scan直到找到正确的内存地址。扫描后First Scan会变成New Scan,如果想开始一个新的扫描,点New Scan之后会清除以前扫描的结果,并且释放上次扫描所占用的内存,这样你就能重新开始。而有时当你在扫描中间选错了而影响了结果,可以点Undo Scan,这样会清除掉最后一次你做的选择,并把结果恢复到前一次扫描时的状态。

在主窗口的下方,又是一个地址列表,这个和上面那个不一样,上面那个是CE扫描的临时结果,而下方的这个,是你选择了的地址。它有五个栏,Frozen是对地址进行锁定用的,Description是对该地址的注释,Address是地址,Type是数值的类型,Value是该地址的数值。

在主窗口的中间,有一个斜向右下的红箭头的按钮,这个用于从左边的地址列表中把地址移到下方的地址列表的。你可以在左边列表中选择一个或多个地址,然后按这个按钮把它们移到下方的地址列表中。当然,你双击左边的地址列表,也能把它移动到下方的列表中。

在中间还有另一个红色停止符号的按钮,这个是清除下方地址列表中所有的地址的。

最后,在下方地址列表的左上和右上,各有一个按钮。左边的一个是Memory View,这个是CE最有用的按钮之一,它是用来查看和修改内存的,而它的功能还不仅仅是查看和修改内存,CE的最有用的一个功能——反汇编,也是在这个里面,不过暂时不想详细介绍这个按钮里面的功能,你知道它是做什么的就行了。右边的一个Add address manually,这个是用于手工向下方的地址列表添加地址的,如果你以前找到过某个地址,知道具体的地址,可以不用扫描,手工把地址加上。

CE的主界面基本就是这些,其实你用一秒钟就能看清楚,我却要打字打了半天:)

其实到现在为止,你还没真正掌握CE的使用,当然了,如果你会了,我就不用再继续写下去了,我早就去睡觉了。不要紧,下面结合实例来说明,你会真正掌握CE的使用的。

----------------------------------------------------------------------------

CE使用实例:

现在,我们来开始一步一步学习CE的使用吧,通过完成CE带的那个TUTORIAL,按它的要求一步一步做完,如果你做得到,你就基本上算是掌握了CE的用法了。

CE带的TUTORIAL,是英文的,不过没关系,我在教你使用CE来完成这个TUTORIAL的同时,会把TUTORIAL上面的所有英文都翻译出来让你看明白,所以不用怕。

CE带的这个TUTORIAL,是CE作者做的用来让你练习的一个程序,它里面也和游戏一样,在每一个步骤都会有一些类似血(HEALTH)或子弹数量的东西,并且你点了上面某个按钮之后,这些数值也会象游戏中一样减少,这样让你象是修改游戏一样,去找到它的地址,并按TUTORIAL上面的要求修改,当你按它的要求做到了,才让你做下一步。而在第一步时那个输入密码的地方,不是说这个TUTORIAL要输入密码才能运行,而是有时你需要从中间某一步开始时,输入相应的密码会直接从某一步开始,而不用每一次都从第一步开始的。而你每完成一步之后,它也会给你相应的密码。

好了,也许你等不及了,那么我们现在就开始吧。

第一步:

先在开始菜单上找到CE的程序组,找里面的“Cheat Engine Tutorial”(以下简称TUT),点击运行。这个时候就出来这个TUT的对话框,上面一大段英文,而Next这个按钮是灰的,为什么呢?让我翻译一下上面的英文吧,你就明白。TUT上面的英文的译文,我会用【】号把它们括起来。

【欢迎你来到CE的教程(V2.4)

这个教程试图解释在游戏中作弊的基本步骤,并让你更熟悉CE的使用。

首先运行CE,如果你还没运行的话(CCB:因为还没运行,所以Next按钮才是灰色的:)。

然后点击"open process"按钮(在左上角那个有电脑图标的那个)

当进程列表窗口打开后,找到这个教程,进程的名字应该是“tutorial.exe”,除非你把它改名了。选择它,并点击OK。现在先不要管其他所有的按钮,如果你喜欢,以后再研究它们。

当这一切都做对了之后,进程选择窗口将会消失并且在CE上方会显示进程名。

现在,点击NEXT按钮继续到下一个步骤(或者输入密码而进到你想去的其他步骤)。

好了,上面的这些英文,我翻译过来了,所以这一步应该不需要我再补充什么,看这些译文应该能明白怎么做,就是开TUT,开CE(哪个先开都没关系),然后点击CE左上的那个选择进程的按钮,选择这个TUT的进程,这样就可以点NEXT进到下一步了。

第二步:

【第二步:精确数值扫描(密码:090453)

现在你已经在CE中打开了TUT,让我们进入到下一步吧。

你看到在这个窗口的下方的文字Health:XXX

每次你点击"Hit me"(打我)时,你的Health(血)会减少。

要进到下一个步骤,你必须找到这个数值并把它改为1000

要找到这个数值,有几个不同的方法,但我会告诉你一个最简单的,'Exact Value(精确数值扫描)':

首先确认数值类型设置为2字节或4字节,1字节也可以的,但当你最后在修改它时你会遇到麻烦(虽然很容易解决)(CCB:大家不会忘了吧?1字节表示的最大数值是255,而这里要你改为1000,所以虽然用1字节能找到,但要改却要连前一字节一起改,所以有点麻烦,不过不是大麻烦)。8字节可能也可以,如果这个地址后面是0的话,不过我不敢打赌。Single, Double, 以及其他的扫描方式不行,因为它们储存数值的方式不同。

当数值类型设置正确后,确认扫描方式设置在'Exact Value'

把血的数值填在数值输入框上,并点击'First Scan(首次扫描)'

过一会儿(如果你有一个非常慢的电脑的话)扫描完成并且扫描的结果会显示在左边(如果找到的地址的数量少于设置的数值的话)。

如果你找到多于一个地址而你不知道哪一个是正确的地址的话,点击TUT上的'Hit me',并把新的血的数值填到数值输入框,并点'Next Scan(再次扫描)'

重复这些步骤直到你确认你已经找到它的地址了(在地址列表上只有一个地址)

现在双击左边列表上的地址,这样会让这个地址移动到下方的列表上并显示它的当前数值。

双击(下方列表的)数值栏(或者选择它,并按回车),并把它修改为1000。

如果一切都OK,NEXT按钮将会变成可点击的了,你就准备好了进入下一步了。】

这一步,也不用我再补充什么了,这个TUT已经说得很清楚,这是使用CE的最基本功能,即找到数值,如果扫描结果太多,试图改变数值然后再次扫描,直到结果剩下很少或者1个为止,这样你就找到了要修改的数值的地址,并且也就能修改它了。到这一步,你已经能对付很简单的游戏了,不过现在的大多数游戏都没这么简单,但至少你已经学到最基本的一步,就是精确数值的扫描和修改了。现在就点击NEXT进入下一步吧!

第三步:

【第三步:未知初始数值(密码:419482)

OK,看来你已经理解了怎样使用精确数值扫描找到一个数值了,让我们进入下一步吧。

在上一步中我们知道初始数值所以我们进行了精确数值扫描,但现在我们有一个进度条,我们不知道它开始时的数值。

我们只知道这个数值是在0到500之间,并且每次你点'Hit me'之后你会减一些血,每次减的血量会显示在进度条的上方。

同样的有好几个方式找这个数值,(例如使用“减少了什么数值”的扫描方式),但我只解释最简单的方式,“Unknown initial value”(未知初始数值)和“Descreased value(减少了的数值)”。

因为你不知道现在它的数值是多少,所以使用精确数值不行了,所以选择扫描方式为"Unknown initial value",同样的,数值类型选择4字节,(大多数WINDOWS应用程序使用4字节数据)

点击'First scan'并等它扫描完成。

当扫描完成后点击'Hit me',你会掉一些血(掉的血量多少会在血条上方显示几秒然后消失,但你不需要这个数值)

现在回到CE,并选择'Decreased Value'(减少了的数值),并点击“Next Scan”

当扫描完成后,再次点击'Hit me',并重复上面的步骤,直到你找到了若干地址。

我们知道这个数值是在0到500之间,所以选择比较象我们要的那个地址是,并把它加到下边的列表。

现在,把它改为5000,才能进到下一步。

这一步,稍为复杂一点了,这是对那些血条之类的东西的扫描。作者说知道数值是0到500之间,但没说是怎么知道的。我的看法是,这东西一方面靠猜,另一方面靠试。你也许会说,比如血条或蓝条,上面或下面不是有数字吗?是的,有些有,有些没有,但有时,血条上面有个表示血的数字,说血是548,但你就知道它是真的按这个值存在内存的吗?不一定的哦,很多游戏的开发者,可能会用某一个方式存真正的血的数值,而用另一个方式显示,例如,最简单的就是,真正的血是你看到的数值的3倍,例如上面说的548,其实在内存可能是1644,而当它要显示的时候才把1644除以3然后显示出来,所以如果你受这个显示数字的误导,结果就有可能找不到真正的地址。所以关于那些以长度表示的数值,一般还是靠猜,然后根据猜测来找。还有,CCB友情提醒一下,其实有时在找到的数值比较多的时候,试试在扫描的过程中,确认数值确实没改变的情况下,多加几次"Unchange"(无变化)扫描,这样可以再减掉一些无关的结果。另外,其实在这一步,如果你够聪明,每次点了Hit me之后记住血条上面显示的减少的数字,再在CE中输入刚才的数字(负号不要,负号只是表示它是减少的),并选择'Decreased value by',即“减少了什么数值”,这样也能更快地找到准确的地址,但这种方式是在要知道减少了多少这个具体数值才有用。好了,继续下一步吧。

第四步:

【第四步:浮点数(密码:890124)

在前面的教程中,我们使用字节来扫描,但有些游戏使用了叫做“浮点数”的记数方法。

(可能是为了防止简单的内存扫描)

浮点数是带有小数点的一些数字(如5.12或11321.1)

如下边你看到你的血(Health)和子弹(Ammo)。两者都以浮点数储存,但血是储存为float(浮点数)而子弹是储存为double(双精度浮点数)(CCB:这是数据类型的术语,float和double都是浮点数,但float为单精度数,而double为双精度数,它们在电脑里面占用的字节数长度不同,而所能表示的精度也不同,看不懂不要紧,反正知道这是两种不同的浮点数就行)。

点击Hit me可以减少一些血,而点击shoot(CCB:其实是Fire)可以用掉0.5的子弹。

你得把这两者都修改到5000或者更多才能进下一步。

精确数值扫描方式在这一步能工作得很好,但也许你想试试其他的扫描方式。(CCB友情提示:扫描子弹的时候试试'Decreased value by'方式就不错,数值填入0.5,很快就能找到)

这一步,其实也没什么,只是让你熟悉不同数据类型的扫描。再次提醒一下,其实有时游戏的开发者为了不让你太容易扫描到数值的地址,所以有时故意颠倒黑白,例如你看到有小数的地方,有时在内存却是用整数来保存,而你明明看到是显示为整数的数值,却有可能在内存中是用小数来保存,所以有时不要轻易地被你看到的东西误导,特别是在多次搜索不到结果的时候,有时要换换别的方式,不要让狡猾的游戏开发者骗了:)。

第五步:

【代码寻找(密码:888899)

有时一些东西的保存位置在你重新开始游戏时会改变,甚至是在你玩的时候也会变,在这种情况下,你用二件事仍然能做出可以用的内存列表。

在这一步我会描述怎样用寻找代码功能。

下面的数值每次你开始这个TUT的时候会存放在不同的位置,所以一个普通的内存地址列表将会不适用。

首先找到这个数值的内存地址(你能进到这一步,我假设你已经知道怎么做了)

当你找到地址后,右击CE中的这个地址,并选择“Find out what writes to this address”(找到是什么改写这个地址),一个窗口将会出现,上面会有一个空的列表。

然后,点击这个TUT上的'Change value'(改变数值)按钮,回到CE,如果一切都做得对,会看到一个地址和一些汇编代码。

点击这个地址并选择Replace(替换)选项把它替换成什么也不做的代码,这样还会将代码地址加到高级选项窗口上的代码列表(它将会一起保存,如果你保存地址表的话)。

点击Stop,这样游戏(CCB:指这个TUT)将会再次正常地运行下去,并点Close关闭这个窗口。

现在,点击这个TUT上的Change value按钮,如果一切都做对,NEXT按钮将会变成可点击的了。

注:如果你以足够快的速度锁定这个地址,这个NEXT按钮也会变成可见的。

]】

越来越精彩了,现在不但教你找地址,还教你找那条修改这个地址的指令了,虽然,你还不太清楚怎样手工修改找到的地址,但至少也比单纯地找数值的地址并修改和锁定要好一些了,不是吗?别急,更精彩的还在后面呢。

第六步

【指针(密码098712)

在上一步我解释了怎样用代码寻找功能对付变化位置。但单独用那个方法不容易找到地址来修改为你要的数值。

这就是为什么要用到指针了:

在TUT下面你会找到两个按钮,一个会改变数值,另一个不但会改变数值并且还会改变数值在内存中的位置。

在这一步,你不需要真的懂汇编,但如果你懂的话会很有帮助。

首先找到数值的地址,当你找到后,再找找是什么在改写这个地址。再次改变这个数值,这样会找到一个代码地址,双击这个代码地址(或者选择它并点击More info),这样一个新的窗口会打开并显示详细的信息告诉你当这个指令运行时会发生什么事(CCB:这个新出来的窗口上,那条指令会是红色的)。如果这个汇编指令里面没有包括一个在方括号中的东西,(CCB:说明这个不是我们要的)那么再看看代码地址列表中另一个代码地址。如果有方括号,就是说CE认为找到了数值的指针了。

回到CE主窗口,(你可以让那个扩展信息窗口开着,但如果你关了,要记住在方括号中间的内容)(CCB:要关了那个有代码地址列表的窗口,才能回到CE主窗口,但扩展信息窗口可以不用关掉),并做一次4字节的扫描,扫描扩展信息窗口告诉你的十六进制数。(CCB:就是方括号里面的内容,如果方括号里面是[eax],那么看看扩展信息窗口下面EAX=后面的数值)。当扫描完成时它可能返回一个或几百个地址。大多数情况下你要的会是最小(CCB:指地址最小,也就是排在列表的最上面)那一个。现在点击手工添加内存地址(Add address manually)并在pointer(指针)这个选项上打勾。

这个窗口将会改变,并允许你填入指针的地址和偏移量。

在地址那里填入你刚才扫描到的地址。

如果汇编指令在后面有一个计算(例如:[esi+12])那么把数值填在后面,否则让它保持0(CCB:就是如果有类似那样的计算,把12这个数值填在偏移量(OFFSET)那里,否则那里填0),如果是更复杂的指令,看看它的算式。

举例说明更复杂的算式:

[EAX*2+EDX+00000310] eax=4C 并且 edx=00801234.(CCB:这时各个寄存器的值到底是多少,要看扩展信息窗口下方,那里有各个寄存器在执行这条指令时的值)

在这个情况下EDX会是数值的指针,而EAX*2+00000310则是它的偏移量,所以你要填的偏移量会是2*4C+00000310=3A8.(这些都是在十六进制下计算的,使用WINDOWS的计算器在科学方式下用十六进制计算)。

回到TUT(CCB:?),点击OK,这个地址将会加到列表上,如果没搞错,将会显示P->xxxxxxxx,xxxxxxxx会是你找到的数值的地址。如果不正确,那你一定是哪里做错了。

现在,使用那个指针改变数值为5000并锁定(就是在下面的地址列表中,点最前面FROZEN那一栏的勾)它,然后(CCB:应该是这里才回到TUT吧?),点击'Change pointer'按钮,如果一切正确,那么NEXT按钮将变成可见的了。

额外信息:

在这个TUT中,事实上数值是由一个指针指向另一个指针(CCB:再指向真正的数值,就是使用了“指针的指针”,有点象绕口令:),但要完成这个TUT只需要一个指针。要找到这个指针(CCB:是说要找到指向指针的另一个指针),只要搜索是什么改变那个指针。

如果你懂汇编,你可能会看到类似这样的:

mov eax,[ebp-4]

mov eax,[eax+310]

这些别搞混了,只使用扩展信息窗口告诉你的数值。ebp-4指向堆栈中保存了指向这个指针的指针,但堆栈的位置总是在变化,所以不要搜索ebp,而要搜索eax的数值。

这一步,确实就够复杂了,也许你到这一步真的有点想放弃了。不过,如果我告诉你,这是这个TUT的最后一步了,你还会想放弃吗?呵呵,坚持啊,看不懂就问,把CCB这家伙问倒了才好呢:)。其实这就是对付DMA的方法之一了,就是先找到地址然后找到指针,找到指针就好办了。

【做得好,你完成了CE的教程了,再玩玩这个TUT并学习一下其他的扫描方法怎样工作的】

==============================================================

如果你一边看一边做,已经做到了这一步,CCB要恭喜你,你已经领到2005年第一学期的GH小学入学证书了,呵呵。以后就是个小学生了,可要听家长和老C的话哦,不要捣乱,不要迟到旷课,知道吗?

其实,这个教程,本身也并不很详细,而且本身可能由于作者疏忽并且英语也不是作者的母语吧,所以里面也有些不正确的地方,有些地方我是根据我的理解做了修正的,虽然即使你做完成了这个教程,也不是说你就很了不起了,但至少,你已经学会了CE的基本操作了,只要再多做练习,熟悉CE的操作和各种扫描方式的使用,对付一些简单的游戏,已经是游刃有余了,但要更深入地使用CE的更高级的功能,还要再多学习的。

其实到这里为止,CE界面上的一些东西还没有详细的讲过呢,不过在你做完这个教程之前,其实讲了可能你也听不太清楚,所以我会在大家熟悉了CE的操作后,再另外写一个相对全面一点的介绍CE各个部分和各个功能的帖子。

怎么写了一夜,都不觉得是自己在写东西,倒象是在翻译呢?也许是职业病吧,告诉你,在很久很久以前,CCB还不懂电脑的时候,就是专业做翻译的,不过不是做英语的翻译:)。

有时真的搞不懂,我自己三分钟就能做完的这个教程,翻译起来再拼凑上自己的几句,就竟然要花掉我五六个小时?也许,这就是创作和享受的差别吧。种田的人,从一棵谷苗到一把米,要花多长的时间?你却一口就能把它吃下:)

最后,欢迎大家提问题和扔臭鸡蛋,当然,扔几个魔功120的魔灵,我也绝对不反对的。不过一定要记得扔在小青蛇,别的区,你扔了我还不想捡呢:)

补充一

我想大家在最后一步都被搞糊涂了,大概有两个原因,最主要的一个原因是大家对DMA还不了解,另外一个就是CE作者在TUTORIAL里面也没说得很清楚,而我基本上是翻译的,只做了一些简单的补充,没有更详细和深入地说明所以大家都被搞糊涂了。

先来说说DMA,其实以前和椰子树有讨论过,论坛这里能找到我们当时聊天的记录。
DMA是动态内存定位,相对来说,不使用DMA的游戏,就是静态内存定位,意思是说例如HP之类的位置每次运行游戏都在一个固定的位置,而DMA则不然,每次运行游戏,或者每次重新开始游戏,HP的位置都会变。所以你第一点要明白的就是DMA这个概念。

因此,使用DMA的游戏,就算你找到了HP所在的位置,只做了这一点的话意义也不是很大,因为你把地址记下来或者把地址表保存下来也没用,因为下次运行游戏(或者重新开始游戏)时HP的位置又变了。而游戏使用DMA其中有一个方面就是不想让人家用简单的内存扫描来修改游戏,这是第二点要明白的。

但反过来说,虽然HP的位置有变化,但游戏程序本身也要知道这个变化了的位置,它才能去读写HP的数值,所以虽然HP位置变化了,但我们还是有办法找到变化后的地址的。这就是指针,指针其实也是一个地址,不过这个地址的内容不是直接保存着游戏的HP数值之类的东西,它的内容是一个内存地址,就是现在保存着HP数值的内存地址。所以你还要搞清楚指针这个概念。

听到这里可能有些人又开始糊涂了,不过不要紧,听我再继续说下去。
如果我举个例子,你应该就能明白了。比如说一个DMA的游戏,现在的HP是95,我们之前经过搜索知道这个HP现在是保存在00400023这里,而内存中有个地址00410056这里保存的内容是00400023,这个00410056就是指针,即:

地址     内容
00400023 95
00410056 00400023

那么下次运行游戏,HP的位置可能就不在00400023这里了,假设现在是在00400078了,那么现在的情况就是这样的:

地址     内容
00400078 98
00410056 00400078

就是说,保存HP的内存地址每次变化,但保存这个地址的位置却不变,那么这个不变的位置就是指针。所以回过头来说,记住00400023或者00400078这些地址没什么用,因为它是每次变化的,反而只要找到指针,就是说找到00410056这个地址,以后要找HP保存在哪里还不容易吗?简单地读出00410056里面的内容就是当前HP的内存地址了。

那么剩下的问题就是如何找指针这个问题了。其实这个问题也不难,其实和找HP的地址一样简单,也许你不信。
想想我们是怎样找HP,怎样找MONEY的,我们都是通过数值的变化来找的,那么,保存HP位置的这个内存地址不是变化的吗?我们根据它的变化来找它不就是很简单的事吗?

首先当然是先找到HP目前在什么位置,得到当前HP的内存地址,在内存中搜索这个地址,看看哪些地址的内容是这个地址,然后等HP的位置变化了,再在搜索结果中再次搜索变化后的地址,按上面的过程重复就能找到指针了。以上面的例子来说,我们先找到了00400023这个地址,然后在内存中搜索“00400023”,等地址变化为00400078之后,我们再次扫描,这次输入的值是“00400078”,依此类推,这样就能找到指针了,即找到00410056了。其实由于内存地址长度是四字节,所以一般第一次搜索到的结果就很少,有时甚至一次就能判断出哪一个是正确结果。

而在CE的教程中,做法有点复杂,以上面的例子来说,在找到了当前HP的位置是00400023之后,教程要求大家用CE的FIND OUT THAT WRITES THIS ADDERSS这个功能来找到是哪一条指令修改了HP的值(或者说修改了00400023这个地址的内容),找到这条指令后再根据这条指令算出这个00400023,再去搜索“00400023”,其实我个人觉得不用使用FIND OUT,,,,这个功能,找到当前HP的地址之后直接搜索就行,我想就是这一点把大家搞糊涂了吧。不过CE作者这样做有他的道理,因为对付DMA的游戏,这条修改HP值的指令(就是用FIND OUT THAT,,,,找到的那条指令)是很关键的,特别是要做外挂的时候,因为DMA要写补丁(CODE CAVE)来处理,但一般如果你只是想直接用CE来修改游戏,只要能找到指针就行,在地址表中以指针形式添加这个指针就能直接在CE的地址表上修改或锁定HP值了,也主只可以不用FIND OUT,,,这个功能去找指令了。

补充二:
单机游戏一般比较容易,因为可以暂停,但网络游戏就不行,所以只能想办法,例如冒险岛中,挂在绳子上和梯子上是不会回血的,就只好这样来找,有些游戏不行了,就只好通过升级时上限的改变来找了,不过有时一般来说HP和MP应该都在不远的地方,找到其中一个,再在内存中浏览一下说不定能找到。例如你找到MP了,那么等血满了(这样就不会再变)之后把HP的值转换为十六进制之后再在找到MP的位置前后找找看,也许就能找到。反正每个游戏都不一样,要靠个人的奇思妙想去解决,没有统一的办法的。

补充三:

在这个教程中,目的是为了让大家学习CE各个功能的使用,所以有些东西事先告诉大家了。但在实际应用中,我们不太可能事先知道数据的格式,那么在做搜索之前就一方面靠常识,另一方面靠试了。正常情况下例如金钱之类的数值由于一般来说没有小数,所以基本上是用整数的,毕竟在电脑中整数的运算是相对比浮点数要快的。而有些数值,例如角色整体攻击力之类的可能就会用到小数,也就是浮点数了。还有,一般来说装备的持久,在游戏中看到的都是1,2,5之类的整数,但大多数游戏中内部使用来表示装备持久的数值几乎都是大数,例如1.00023,或者1023等来取整后表示装备的持久为1,因为装备要被怪打很多下才掉一点持久,所以持久的数值一般在内部是要用大的数来记录,或者是用浮点数。另外如果对要找的数值的类型没有把握,就只好先从自己认为比较有可能的格式去试,找不到了再换另一种类型继续试,所以要特别有耐心,呵呵。

补充四:

首先找到数值的地址,当你找到后,再找找是什么在改写这个地址。再次改变这个数值,这样会找到一个代码地址,双击这个代码地址(或者选择它并点击More info),这样一个新的窗口会打开并显示详细的信息告诉你当这个指令运行时会发生什么事(CCB:这个新出来的窗口上,那条指令会是红色的)。如果这个汇编指令里面没有包括一个在方括号中的东西,(CCB:说明这个不是我们要的)那么再看看代码地址列表中另一个代码地址。如果有方括号,就是说CE认为找到了数值的指针了。
回到CE主窗口,(你可以让那个扩展信息窗口开着,但如果你关了,要记住在方括号中间的内容)(CCB:要关了那个有代码地址列表的窗口,才能回到CE主窗口,但扩展信息窗口可以不用关掉),并做一次4字节的扫描,扫描扩展信息窗口告诉你的十六进制数。(CCB:就是方括号里面的内容,如果方括号里面是[eax],那么看看扩展信息窗口下面EAX=后面的数值)。当扫描完成时它可能返回一个或几百个地址。大多数情况下你要的会是最小(CCB:指地址最小,也就是排在列表的最上面)那一个。现在点击手工添加内存地址(Add address manually)并在pointer(指针)这个选项上打勾。

补充五:

作者做这个教程的目的主要是让大家通过这个教程熟悉CE的各个主要功能,所以相对来说比游戏要简单些,所以只搜索到一个结果并不奇怪,不过在游戏中有可能会搜索到多个结果,但应该也不会太多,毕竟整个程序里面用到这个地址(指针)的地方也不是很多。

如果是有看到算式也不奇怪,一般来说在正常的游戏中基本上都是有算式的,因为这涉及到游戏的数据储存方式,或者编程上的类的概念。简单点说,就是人物的资料基本上存在一个块里的,而这整个块的位置
经常是会变化的,不过块的结构却不会变,意思是说,比如人物的所有数据放在一个1K的内存块里,而HP就放在这个块中离开头28字节处,而MP是在离块开头的32字节处,那么这个块在内存的什么位置开始,就是这个数据块的起始位置或者基地址,而28和32就分别是HP和MP相对于基地址的偏移量,比如说这个时候这个内存块是放在500000处,那么HP就是在50001C(十六进制,28=1CH),而MP就是在500020处,如果人物所在的块的起始位置改变了,例如变到500200处,那么HP肯定就是在50021C等等,上面说的500000和500200,如果你找到指针就能取得它当前的值,因为偏移量是不会变的,所以知道之后就不难知道HP和MP当前所在的位置了,这也是为什么找指针那么重要的原因。所以,一般在游戏中基本上都会有算式的,例如假设游戏在前面几个指令已经把人物所在内存块的基址放到EAX这个寄存器了,那么当游戏要读或写HP的时候就会用类似MOV [EAX+1C], ECX之类的算式,意思就是把ECX当前的值放到HP正确的位置,从而改变了HP的值。这么说清楚了没有?

补充六:

OK,谢谢CCB老师,我看了5遍终于学回了第6步!我来说说自己心得吧,这好象是很久以前的贴子,现在发心得是不是有点晚呀?

第六步

【指针(密码098712)

在上一步我解释了怎样用代码寻找功能对付变化位置。但单独用那个方法不容易找到地址来修改为你要的数值。

这就是为什么要用到指针了:

在TUT下面你会找到两个按钮,一个会改变数值,另一个不但会改变数值并且还会改变数值在内存中的位置。

在这一步,你不需要真的懂汇编,但如果你懂的话会很有帮助。

首先找到数值的地址,当你找到后,再找找是什么在改写这个地址。再次改变这个数值,这样会找到一个代码地址,双击这个代码地址(或者选择它并点击More info)[到这里大家都明白吧,不明白就自己去看第5步,也就是对找到的地址点右键点find out what write to this address然后出来一个筐,这时候再点TUT上的change value按纽,这时候会出来一串***,这时候点筐右边的more in就行了,就会出现那个有红色标记的指令],这样一个新的窗口会打开并显示详细的信息告诉你当这个指令运行时会发生什么事(CCB:这个新出来的窗口上,那条指令会是红色的)。如果这个汇编指令里面没有包括一个在方括号中的东西,(CCB:说明这个不是我们要的)那么再看看代码地址列表中另一个代码地址。如果有方括号,就是说CE认为找到了数值的指针了。[前面这句话的意思呢,就是为了方便大家在遇到不同情况下找指针的时候,要出现方括号就是正确的,如果没出现就说明是错误的了,就得采取其他办法进行扫描之类的,当然有了方括号自然不用管这些了,继续下面吧,*^_^*]

回到CE主窗口,(你可以让那个扩展信息窗口开着,但如果你关了,要记住在方括号中间的内容)(CCB:要关了那个有代码地址列表的窗口,才能回到CE主窗口,但扩展信息窗口可以不用关掉),并做一次4字节的扫描,扫描扩展信息窗口告诉你的十六进制数。(CCB:就是方括号里面的内容,如果方括号里面是[eax],那么看看扩展信息窗口下面EAX=后面的数值)。[我觉得这里CCB老师已经说得够清楚了,看红色指令方框中有代码就是方框中的代码要记下,如果没有是EAX就记方框下面的EAX=后面的值,这里的全部数据都已经做了标记我们只要提取我们需要的,我们不需要的不要管他,不要异想天开的找另外的不是红色标记的指令其他的东西,这样可以少走冤枉路哦。]当扫描完成时它可能返回一个或几百个地址。大多数情况下你要的会是最小(CCB:指地址最小,也就是排在列表的最上面)那一个。现在点击手工添加内存地址(Add address manually)并在pointer(指针)这个选项上打勾。

这个窗口将会改变,并允许你填入指针的地址和偏移量。

在地址那里填入你刚才扫描到的地址。

如果汇编指令在后面有一个计算(例如:[esi+12])那么把数值填在后面,否则让它保持0(CCB:就是如果有类似那样的计算,把12这个数值填在偏移量(OFFSET)那里,否则那里填0),如果是更复杂的指令,看看它的算式。

[到这里CCB老师也讲解得很清楚的,如何填写如何改,简单的指针没有偏移量,直接写0,而复杂的指针则会出现很复杂的偏移量计算,所以CCB老师也举出了许多例子,只是为了教大家如何去算,其实也不能说如何去算,而是如何去找,把指针找出来剩下的就是偏移量了,其他的相加减乘除,要注意一点就是偏移量的计算永远只在方括号里面所以不用把括号外面的也算进去了,那样就大错特错了!]

举例说明更复杂的算式:

[EAX*2+EDX+00000310] eax=4C 并且 edx=00801234.(CCB:这时各个寄存器的值到底是多少,要看扩展信息窗口下方,那里有各个寄存器在执行这条指令时的值)

在这个情况下EDX会是数值的指针,而EAX*2+00000310则是它的偏移量,所以你要填的偏移量会是2*4C+00000310=3A8.(这些都是在十六进制下计算的,使用WINDOWS的计算器在科学方式下用十六进制计算)。

回到TUT(CCB:?),点击OK,这个地址将会加到列表上,如果没搞错,将会显示P->xxxxxxxx,xxxxxxxx会是你找到的数值的地址。如果不正确,那你一定是哪里做错了。

现在,使用那个指针改变数值为5000并锁定(就是在下面的地址列表中,点最前面FROZEN那一栏的勾)它,然后(CCB:应该是这里才回到TUT吧?),点击'Change pointer'按钮,如果一切正确,那么NEXT按钮将变成可见的了。

额外信息:

在这个TUT中,事实上数值是由一个指针指向另一个指针(CCB:再指向真正的数值,就是使用了“指针的指针”,有点象绕口令:),但要完成这个TUT只需要一个指针。要找到这个指针(CCB:是说要找到指向指针的另一个指针),只要搜索是什么改变那个指针。

如果你懂汇编,你可能会看到类似这样的:

mov eax,[ebp-4]

mov eax,[eax+310]

这些别搞混了,只使用扩展信息窗口告诉你的数值。ebp-4指向堆栈中保存了指向这个指针的指针,但堆栈的位置总是在变化,所以不要搜索ebp,而要搜索eax的数值。

[这里不大明白,呵呵]

下面说点自己的想法哦,找指针不过就是想要知道某个东西的真正存在的地方,但是这个地方一直在变啊,怎么办呢?只能找他相对不变的拉,什么是相对不变的,就比如一张桌子,桌子上放了2个香蕉,你无论怎么移动那张桌子,2个香蕉之间的位置也不会变的!根据这个,我们就只用确定桌子的位置或者1个香蕉的位置和香蕉与香蕉之间的固定距离等,那么另外的相对的东西的位置也全部都呈现出来了,而指针就是这个固定距离吧?

我只是把自己的想法说出来,不知道对不对哦,还希望CCB老师指点,西西~~~

CCB:

你这样的比喻并不准确,也许你的比喻用来说明游戏中一些变量的相对位置不变这方面还可以,但和指针的意义并没多少联系。

关于指针,我觉得用电话簿来举例可能更合适些。

比如说,你有一个朋友叫张三,这家伙整天换电话号码(泡妞太多?借人家的钱太多怕人家追债?),不过他每次换号码总会在第一时间告诉你新的号码,并且你的手机的电话簿上一直储存着张三的号码,他一告诉你新号码,你就修改你的手机电话簿把“张三”这一项的号码换成最新的。那么,张三的电话号码就象是游戏的HP所在的地址,是经常变的,而你的手机上的电话簿里面“张三”这项记录就是指针,因为不管张三的电话号码怎么变,你只要一查你手机电话簿,就一定知道张三现在用的号码是哪一个。

补充七:

由于最后一步很多人都搞不清楚,因此我在这里再单独重复一下最后一步的详细过程,关于教程上这一步的文字,大家自己看CE里面的英文和主帖里面的翻译,我就不再重复了,我只单独详细地把我自己做这一步的过程记录下来让大家参考,要是还那么多人不清楚我就没办法了。其实有时候大家要从自己这一方面去分析一下做不下去的原因,先想想这一步中教程里面的文字你都看懂了没有?都理解了没有,如果看不懂当然做不下去了。

现在我来开始单独做最后这一步。

一,运行CE,运行TUT,在CE中指定tutorial.exe这个进程,这个我想大家都会了吧。

二,因为是单独做,所以我输入了密码直接跳到最后一步,密码是098712,输入后点后面的OK就直接出现最后一步。

三,根据TUT的要求,我们先找到数值所在的内存地址,现在在TUT上面显示的数字是100,于是我在CE中直接输入100然后FIRST SCAN,这一步得到了83个地址(这个并不重要,也许你的情况不是83,也许更多,也许更少)。

四,然后,我点TUT左下的写着“Change Value”的按钮,现在TUT上的变成723,于是我在CE中输入723然后NEXT SCAN,现在就只得到一个地址了,地址是00BD50BC。

五,接下来的一步就是把这个地址加到CE下边的地址列表中,双击左边的这个地址就自动加到下面的地址列表了。

六,根据TUT的要求,要我们用CE的Find out what writes to this address,于是我在下边的地址列表中对着这个地址点右键,在弹出菜单上点击Find out what writes to this address。接着会出来一个让你确认的对话框,点YES,接着CE的主窗口右边会多出一个新的窗口,窗口标题是"Created processes",它下面的列表框中有一个项目,内容是FFEA10D7,这个就是TUT这个进程的进程号或者叫PID,双击它或者选择它后点下面的Select。这样CE的主窗口前面又会多一个新的窗口,标题是"The following opcodes changed the selected address",现在可以把"Created processes"窗口关掉了。

七,回到TUT,现在仍然是点它左下的Change Value。因为我们现在只想改变它的值,还不想让那个数值的地址也改变,所以只点左边的这个按钮。马上你就能看到在CE前面的那个The following opcodes...那个窗口里出现一条指令,在我这里它显示的是004560cf 89 10 mov [eax], edx。如果是在对游戏进行实际的跟踪而不是在完成这个教程,有时可能这个列表会有三四条指令。事实上这个就是CE告诉我们,它找到了是这条指令改变了那个地址上的数值。不过这还不够,所以还要继续。

八,现在我们先按The following opcodes这个窗口右下角的STOP,先停止CE对TUT的跟踪,然后如TUT所说,双击这条找到的指令,或者单击它然后点右边的MORE INFORMATION。在出来的EXTRA INFO这个窗口,上面说的那条指令显示为红色,在这里我再大概说一下这条指令的意思,它是把edx这个寄存器里面的数值,放到一个内存地址里,是哪个内存地址呢?这个内存地址就保存在eax。记得吧?加了方括号的寄存器就不是指数值,而是指一个内存地址,因此这一步不是把edx的值放到eax这个寄存器里面,而是把edx的数值放到保存在eax中的那个地址。因此,我们要看看刚才程序执行到这一条指令时,eax的数值是多少。在extra info这个对方框下半部,我们可以看到EAX=00BD50BC,因此我们知道EAX的值。

九,现在我们按The following opcodes这个窗口下边的Close按钮,先把它关掉,这样才能回到CE的主窗口。而EXTRA INFO可以留着。现在根据TUT的要求,我们要来做一次十六进制的扫描,点击CE主窗口的NEW SCAN,然后把输入数值的前面那个HEX的选项打上勾,表示我们要输入的是十六进制数,再把在EXTRA INFO中看到的数字,也就是00BD50BC这个十六进制数输入,然后按FIRST SCAN进行扫描,马上一个唯一的结果就出来了,在我这里搜索到的结果是00BD4E64。

十,现在我们来按TUT的要求,以指针的方面把这个结果手工加到地址列表中,并且锁定它。在CE主窗口的右中部有个按钮“add address manually”,点它之后会出现一个添加地址的对话框。在OK这个按钮的上方有个Pointer的选项,因为我们是要以指针方式添加这个地址,所以这个选项要打勾。打勾之后,上面原来填地址的地方就变成问号不让你输入了,现在是要在下面的输入框中输入地址和偏移量了。地址就是上面第九步扫描得到的结果,即00BD4E64,而因为指令中方括号中只有一个EAX,而没有算式,所以偏移量是0,我们不用改动。同时我们也可以注意到,当我们输入完00BD4E64之后,上面刚才不让输入地址的地方再在就变成00BD50BC,也就是现在数值所在的地址,说明我们这个指针确实是指向正确的位置的了。现在点确定,新添加上的地址就会出现在地址列表上,并且显示为P->00BD50BC,表示这是一个指针,它当前指向的内存地址是00BD50BC。现在来试试TUT下边另一个按钮,就是改变数值同时改变内存地址的那个“Change pointer”按钮,看看地址变了我们的指针是否还会正确指向它新的地址。确实我们按这个按钮之后,地址列表上的地址P->后面的内容变了,就是说现在TUT把这个数值放到新的地址了,不过地址表上那个数值仍然和TUT上显示的数值一样。经过这一步的测试我们也可以更好地增加对DMA和指针方面的认识。现在只要按TUT的要求把这个地址前面的FROZEN打上勾,再把它的数值改为5000,然后点TUT上的Change pointer按钮,NEXT就出现了。

其实我想大家在这一步卡住 的原因,一方面是可能对DMA和指针这方面的内容还不够了解,另一方面是没认真看TUT上的文字,我相信大家按照我上面说的步骤做一遍应该就觉得不会那么困难了。

由于TUT中找到的指令比较简单,没有偏移量,因此我在这里再补充一点关于偏移量方面的内容。假设刚才我们上面找到的指令是mov [eax+3C], edx,并且假设EXTRA INFO窗口上的数值和上面说的一样的话,那么,我们要扫描的就是eax+3C,也即方括号中的数值了。上面例子中eax的值是00BD50BC,那么eax+3C=00BD50BC+3C=00BD50F8,在第九步要扫描的就是这个00BD50F8了,而在最后手工添加地址到地址列表的时候,地址要填00BD50BC,偏移量要填3C。

还有,在这个例子中,我们可以把TUT中那个数值看成是游戏中的HP的值,那么,上面的00BD50BC就是在某一时刻HP所在的内存地址,这个地址是会改变的(例如我们点了Change pointer按钮时它就会变化),而00BD4E64这个地址就是这个HP的指针,不管地址怎么变化,但变化后的新地址都保存在00BD4E64这个指针位置上。所以我们只要找到指针,不管内存地址怎么变,我们都能找到数值。从这个例子也可以让大家更好的了解指针到底是怎么一回事。

补充八:




 

  评论这张
 
阅读(1655)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017