转一个 CT表的制作方式及原理!!供大家参考研究!!大家一起DIY

社区服务
高级搜索
猴岛论坛DNF地下城与勇士转一个 CT表的制作方式及原理!!供大家参考研究!!大家一起DIY
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
52个回复

转一个 CT表的制作方式及原理!!供大家参考研究!!大家一起DIY

楼层直达
skyking777

ZxID:1608503

等级: 上等兵
举报 只看楼主 使用道具 楼主   发表于: 2008-09-10 0
自学CE,自己做CT表!(一)2008-08-04 17:00首先,CE4.4下载地址:http://www.ghoffice.com/ccb/ce44.zip(也可以用ME,ME与CE原理相同)
然后开始教程
CHEAT ENGINE 这是老外编的内存修改工具,我在网上找了很久才找到这个教程.现把它放这里,主要是怕它失传了.内容比较乱,不过这也是网上唯一一篇教材了.
---------------------------------------------------------------------
CHEAT ENGINE(以下简称CE)是我见过的最优秀的游戏作弊工具。它的优点多不胜数,虽然单独从搜索游戏里面的数值来说,它并不比其他同类软件强多少,但它不仅仅是个游戏修改工具,它还有其他游戏修改软件所没有的一些特点,例如:它有强大的反汇编功能,这个是别的游戏工具中几乎没有的;还有,它本身就自带了外挂制作工具,可以直接由它生成外挂。而它的界面非常简洁朴素,这也是我喜欢它的原因之一。同类软件中,我觉得TSEARCH可以和它媲美,但TSEARCH的界面比较混乱,操作过于复杂,所以我个人并不喜欢TSEARCH。

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

还有如果你喜欢这个入门教程,你可以把它转载到任何地方,但在转载之前,请你征得本人的同意,并且在转载时注明作者为CCB。

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

其实,使用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并学习一下其他的扫描方法怎样工作的】

另外:
cheat engine教程-代码注入实例教程
转自http://hi.baidu.com/xgwk/blog/item/67fcab8622d8673b66096e6d.html
本教程由CCB原创,转载时请征得本人同意并注明。

代码注入(CODE INJECTION)是对付动态内存分配(DMA)游戏的常用方法。这个教程目的是想让你了解有关代码注入方面的相关知识,并以CE的TUTORIAL为实例来说明一下实际的操作。

选择CE的TUT来做实例是因为大家手头上基本上都有CE,并且TUT第六步使用的就是DMA,这样可以以最简单的方法让大家最快地接触和理解代码注入的 原理和实际操作。这个教程面向那些已经掌握了CE操作的人,特别是按TUT的要求做完CE的教程的,并且要有一定的汇编语言基础。如果你还不能熟悉CE的 操作,或者CE的教程你还没完成,或者你完全不懂汇编,可能很难看懂,请先去学些基础,学好了再来看这个教程。

我手头上用的是CE4.4,大家可能都在用5.2了吧,不过没关系,基本上都一样。好了,让我们开始吧!

第一步:

运行CE,运行TUT,然后输入密码098712直接进到第六步。

现在我们先来找TUT窗口上那个数值的地址,找到地址后,象原来做教程第六步一样,找到改写这个地址的指令。这一次,这条指令的所在内存地址对我们来说比 较重要,找到指令后要把它的地址记下来。然后,我们还是象做教程第六步一样找到指针,并把它以指针方式加到地址列表上,因为后面我们还要来看看我们做代码 注入的效果。

我这里找到的这条指令是:
004560CF MOV [eax], edx

这一步做的基本上就是CE教程里面的第六步,没什么特别的,只是指令的地址要记下来,因为后面还要用到。

第二步:

现在我们要为代码注入做些准备了。首先要做的就是找一个地方来放我们的代码,就是找一个CODE CAVE。在CE主菜单上点MEMORY VIEW,打开内存察看窗口。在内存察看窗口上点菜单:VIEW->MEMORY REGIONS,这个时候就会弹出一个MEMORY REGIONS(内存区域)的窗口,在这个窗口中我们可以看到TUT所使用的各个内存块。我们要找的地方应该是在某一个块的尾部,并且这个块应该是可读写 的,就是在这个内存区域窗口上看PROTECT那一栏应该是Read+Write的,这样才不会导致出错。

在内存区域窗口中,我们可以看到第三个区域00459000,PROTECT那一栏写的是Read+Write,看来这个块就是我们要找的了,再看看它下 面的一个块,是00460000,也就是说,我们找的00459000这个块,范围是从00459000-0045FFFF。那么我们就从它的尾部来找地 方。

现在关了内存区域这个窗口,回到内存察看这个窗口。我们在上半部点右键->GO TO ADDRESS,输入00460000,然后再往上翻。嗯,不错,这个位置全是00 00,基本上可以确定是我们可以用的地方了。然后我们还要规划一下,特别是我们不太确定我们要写入的代码有多少,所以尽量留多一点,以免破坏下一个块 (00460000),所以我们确定把代码放在0045FF10这里,另外我们要确定一个地址来放我们得到的数值的地址,就放在0045FF40吧。

这一步主要做的就是找地方放我们的代码,现在就基本确定了。

第三步:

这一步就要真正动手了,不过动手之前,要先看看原来的指令所在的位置那里(就是004560CF)后面的几条指令,并注意这些指令所在的地址。我这里看到的三条指令是这样的:
004560cf 89 10    mov [eax], edx
004560d1 8b 45 fc mov eax, [ebp-04]
004560d4 8b 80 10 03 00 00 mov eax, [eax+00000310]

我们要把这里改成一条JMP指令,由于一条JMP指令是五个字节,所以这里要破坏两条指令,注意如果被破坏的指令总字节数超过五字节,后面多余的要用NOP补上。

现在我们要先写好我们的代码,就是0045FF10那里的代码,这个次序不能搞错,不管我们是在CE中直接汇编还是以后用外挂写入机器码,都要注意这个次 序,因为如果在我们自己的代码没处理好之前就先改原始位置的代码,结果程序如果在这个时候刚好执行到那里的话,就会跳到我们还没准备好的这个位置来,结果 出现不可预料的结果,所以要先写好我们的代码再说。

现在,在内存察看窗口上半部点右键->GO TO ADDRESS,输入0045FF10,然后我们在0045FF10这一行上点右键->ASSEMBLE,然后输入我们的代码,输入完后CE会问, 我们输入的代码字节数和原来代码不兼容,是否要用NOP填掉,因为这里原来放的不是真正的代码,所以点NO就行了。输入一行完了之后再在下一行点右键- >ASSEMBLE输入下一行代码,。我们要输入的代码其实很简单:
mov [0045ff40], eax ---------->这一行是把当前EAX的值,也就是那个数值当前的地址放到我们的地址
mov [eax], edx    ---------->这两行是恢复原始位置上被我们破坏了的原来的代码。
mov eax, [ebp-04] ---------->
jmp 004560d4    ---------->这一行是跳回去执行。

四行代码输入完了,0045FF10这个位置上的情况应该是这样的:
0045ff10 89 05 40 ff 45 00 mov [0045ff40], eax
0045ff16 89 10    mov [eax], edx
0045ff18 8b 45 fc    mov eax, [ebp-04]
0045ff1b e9 b4 61 ff ff    jmp 004560d4

现在回过头来改原始位置的代码,同样是右键->GO TO ADDRESS,再输入004560CF,再点右键->ASSEMBLE,把原始位置上那两条代码改成JMP,改了之后的情况如下:
004560cf e9 3c 9e 00 00 jmp 0045ff10
004560d4 8b 80 10 03 00 00 mov eax, [eax+00000310]

从上面总共六行代码,我们可以看出,当程序执行到004560CF时,是跳到0045FF10执行我们的代码,而我们的代码首先是把EAX的值放到我们指 定的内存地址0045FF40那里,然后就是恢复原始位置上被我们的JMP破坏掉的那两条代码。再然后是跳到原始位置我们那个JMP后面的一行代码去执 行。注意,如果我们先恢复原始位置上那两行代码,再把EAX放到我们所指定的位置的话,就有问题了,因为原始位置上那个第二行代码MOV eax, [ebp-04]已经破坏了EAX的值了。还有跳回去是要跳到JMP后面的一行,否则会造成死循环。

这一步就是代码注入的关键,该解释的上面应该都解释清楚了吧。

第四步:

现在我们来检验我们代码注入的结果。

首先,我们在内存察看窗口的下半部点右键->GO TO ADDRESS,输入0045FF40,这样内存察看下半部会显示我们用来放数值地址的这个位置。然后调整内存察看这个窗口的位置,让CE主窗口上地址列 表也同时能看到。然后我们回到TUT,点击CHANGE VALUE,这个时候在内存察看窗口上我们就可以看到0045FF40那里原来的00 00 00 00四个字节的内容变了,我们再看CE主窗口上的内存地址列表,我们刚开始以指针方式添加的内存地址,P->后面的数字就和0045FF40这里的 地址是一样的(后者的四个字节的次序相反),现在我们再点TUT上面的CHANGE POINTER,这个时候CE主窗口上地址列表中的指针地址变了,而我们在内存察看窗口上看到的0045FF40这个位置也变了,而且数值和地址列表上显 示的一样。这样就说明我们的代码注入成功了。

最后再补充一些内容:

一,上面这个代码注入的过程,其实就是让程序转到我们自己的代码,并且把当前保存数值的地址放到我们指定的静态地址0045FF40上,然后再跳回去执 行。要注意的是它实现的功能仅仅是把变化后的数值地址给我们放到一个我们知道的,固定的内存地址,其实这样做离一个外挂还差很远,不过如果你要做对付 DMA的游戏的外挂的话,这个代码注入就是最基本的东西,从某种意义上说,它就是变动态为静态,让使用DMA的游戏也能象静态内存分配的游戏一样容易处 理。

二,关于代码注入后如何运用的问题,如果一个游戏经过我们象上面这样的代码注入之后,那么不管保存数值的内存地址怎么变,我们的代码都会把它保存在我们知 道的位置上,那么我们就可以通过我们的外挂来在这个固定的位置(0045FF40)上读取到当前数值所在的地址,进而就能象对付静态内存分配的游戏一样, 可以读取或者修改这个数值。

三,上面这个代码注入的过程,我们是手工在CE中完成的,在实际应用中当然这样不方便,我们可以把它也做到外挂上。反正在外挂初始化的时候把上面修改的这 些指令的机器码写入到相应的地址上就行。当然写入同样要注意次序,就象上面说的。如果你用TMK来生成外挂,代码注入这一部分就是:
POKE 0045ff10 89 05 40 ff 45 00 89 10 8b 45 fc e9 b4 61 ff ff
POKE 004560cf e9 3c 9e 00 00
这样就完成了代码注入了。很简单是吧?呵呵。

四,关于代码注入的地方,上面这个例子我们是选择注入到TUT改变数值的时候,也就是说当程序每次改变这个数值的时候就把它所在的位置放到我们指定的位置 上。为什么不是在改变地址的时候呢?因为一般来说在游戏中,改变数值的时候比较多,而改变内存位置的时候相对少些,一般只是在重新运行游戏或重新开始游戏 时才发生。所以,改变数值的时候比较多,我们比较容易找到这条指令,而且也因此让我们指定的这个地址更新更及时。而缺点只有一个就是当数值不改变的时候, 我们也就读不到地址了。当然如果你能找到程序改变数值地址的那条指令,在那里做代码注入也是完全可以的。

总之,上面只是用CE的TUT给大家说个代码注入的基本原理和实例,在实际应用中,要涉及的内容和要考虑的因素还更多,不过只要大家掌握了基本的原理和方法,要在实践过程中去改进自己的做法和完善自己的外挂就不难了。

如果你前面看过我写的代码注入实例教程并且理解里面的做法,也成功地做了代码注入了,那么今天我们再来改进一下我们前一次的做法,这次做得更复杂点,也更完善点。


skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 沙发   发表于: 2008-09-10 0
自学CE,自己做CT表!(二)2008-08-04 17:00
友情提醒:如果你完全不懂汇编,估计看了这些会很不明白,建议你先去补充一些必要的汇编知识,这个教程是写给那些有一定的汇编基础的人看的,看不懂的话自己去看汇编教程,我不想再浪费我的时间来说一些别人早已经写得非常清楚详细的汇编基础。

我们这次要来对前面的代码注入做两个方面的改进:
一,利用代码注入来锁定数值。
二,让CHANGE VALUE按钮和CHANGE POINTER按钮两个都同时把数值的新地址写到我们的指定位置。

前面已经说过的一些做法我就不再重复了,我现在只重点解释一些新的内容。

一,利用代码注入来锁定数值:
今天我们的做法仍然和前一次一样,只不过在0045FF10这里我们多加了几行代码,所以其实重点就是在这新加上的几行代码上,要加上的代码如下,为了后面的叙述方便,我给这几行新加上的代码加上编号:

0045FF10 - 89 05 40 ff 45 00 mov [0045ff40], eax
0045ff16 - 89 10        mov [eax], edx
0045ff18 - 8b 45 fc        mov eax, [ebp-04]
----------------------------------------------------
0045ff1b - 50      push eax        (1)
0045ff1c - 8b 05 40 ff 45 00 mov eax, [0045ff40] (2)
0045ff22 - c7 00 88 13 00 00 mov [eax], 00001388 (3)
0045ff28 - 58      pop eax      (4)
----------------------------------------------------
0045ff29 - e9 a6 61 ff ff jmp 004560d4

其实除了新增加的四行代码,其他的四行和原来完全一样。就是转到这里来之后,我们先把地址放到我们指定的位置,然后恢复原始位置上被破坏的两行代码,接 着,在跳回去之前,我们又加了些代码,其实就是要往那个保存数值的地址上写入我们指定的值(1388是十六进制数,就是十进制的5000),(3)这一行 就是做这件事的,那么为什么还要(1),(2)和(4)呢?

这就涉及了汇编的规则了,我们要往一个地址写入数值,先要把这个地址放到寄存器,然后才能写入数值,这是汇编的规定。(其实我的汇编水平也不高,为什么会 有这样要求等等,自己看教程。顺便说一下,我写的这些代码和我说的这些,也不一定是最正规的甚至不一定是正确的,一切以汇编教程和书本上的为准)。因此, 才需要(2)这一步先把我们已经保存在0045FF40上的这个数值的地址先调入到EAX寄存器中。

那么,又为什么还要用到(1)和(4)这两行呢?因为我们在(2)和(3)的时候借用了EAX这个寄存器,由于这个寄存器原来里面有数值(天知道原来的数 值是多少,还有原来的数值对程序来说有多重要!),所以我们要先把数值保留起来,然后我们开始使用EAX寄存器,使用完了之后,我们再把原来的数值放回到 EAX,这样才不会破坏程序的正常运行,有借有还,再借不难嘛,嘿嘿。PUSH和POP这两个指令就是用来保存和恢复寄存器的数值的,PUSH的作用是把 指定寄存器的值压到堆栈中,而POP则相反,是从堆栈中把数值恢复到指定的寄存器。有关PUSH和POP的用法请自行参看相关汇编教程。

所以,这一次我们这么修改,就是由原始位置(004560CF)处跳到我们的代码(0045FF10)处执行,先把放有数值地址的寄存器放到我们指定的位 置上,然后恢复被我们破坏的两条指令,再然后(1)保存EAX的值,再(2)用EAX来调入我们保存的数值地址,然后我们(3)往数值地址写入我们指定的 数字,然后(4)恢复EAX的值,最后是跳回原处执行后续的指令。

经过我们这么修改之后,现在按CHANGE VALUE按钮之后,除了0045FF40这里会保存数值的地址之外,TUT上的数字还会被我们改成5000,其实也就是数值被我们锁定在5000了。

上面只是用这个例子来说明代码注入实际上能做到的比我们想象的要多,只要你有足够的汇编水平,并且有一块足够大的内存空间给你放你的代码,事实上代码注入 几乎可以做任何你想象得到的事。比如说大家熟悉的珊瑚虫版的QQ,在早期的版本其实就是用代码注入的方法直接把查IP的代码注入到QQ主程序里面的,想不 到吧?

其实我都说了,上面这个只是扩展我们上次实例教程中所注入的代码的功能的一个例子,要锁定数值,可以做得更简单些,如果你看得懂汇编代码,知道哪一句是做什么的,就很容易用更简单的方法来锁定数值,其实在004560CF这一句:
004560CF mov [eax], edx
EDX里面就是你按CHANGE VALUE按钮之后产生的新数值,这一句就是把新数值放到数值的地址里。那么如果把这一句修改成mov [eax], 00001388,而不是把EDX放进去,这样不就行了?不过因为这个新代码比原来的代码长,直接在原始位置上修改会破坏后面的指令,所以不能直接在原始 位置上修改,要在跳转到0045FF10之后再那里修改。如果是原来的指令比我们要修改的指令长,那么还可以直接在原始位置修改,连代码注入都不用!

所以,在0045ff10那里如果你改成这样:
0045ff10 - c7 00 88 13 00 00 mov [eax], 00001388
0045ff16 - 8b 45 fc        mov eax, [ebp-04]
0045ff19 - e9 b6 61 ff ff jmp 004560d4
这样就是不用做任何外挂,直接在游戏中修改成无敌了!当然,别忘了004560CF仍然要改成JMP 0045FF10。

第一行是把原来按了CHANGE VALUE按钮之后写入新产生的数值,修改成写入固定的5000(1388),第二句仍然是恢复原始位置上被破坏的这条指令,第三行就是跳回去,就这样, 简单吧?不过这个已经是超出这个教程的本意了,我们的重点是在研究代码注入,而不是在研究游戏修改,呵呵。

再说一遍,汇编教程里面能查到的内容,别再问我,自己去看,我不会再回复汇编教程里面已经说得清楚的东西。

二,让CHANGE VALUE按钮和CHANGE POINTER按钮两个都同时把数值的新地址写到我们的指定位置。

现在我们再接着前面的续一来看看我们的第二个目标。

在我们最开始的代码注入实例中,我们利用了CHANGE VALUE这个按钮的执行代码注入了我们自己的代码,不过这样做不是很完美,因为只有在数值改变时我们才能得到新地址,而在我们按了CHANGE POINTER时,真正地址有变化的时候我们却没有及时得到新的地址,所以这次我们就来完善一下,让程序在我们按了CHANGE VALUE和CHANGE POINTER两个按钮的任何一个时,都把新的地址写到我们指定的位置。

如果你看完这个实例教程的前两篇,那么我想你对代码注入的原理和具体操作应该不陌生了(如果你还没真正弄清楚,那么先把前两篇多看几遍直到弄懂为止!)。这次的做法其实在代码注入方面没什么特别的新内容,倒是在寻找指令方面要学些新的东西。

为了让大家不致混淆,我把后面说到的几个概念再明确一下:
HP:指TUT上面显示的那个数字,为了表达方便,我们就暂且称它为HP。
HP的地址:指目前存放HP的内存地址,TUT每次运行时这个地址不同,并且按了CHANGE POINTER时它也会变化。
指针:存放“HP的地址”的一个内存地址,它在固定的位置上(以TUT2.4为例,这个地址是00BD4E64)。

我们先回顾一下我们是怎样找到指针的,就是先根据HP的变化找到HP的地址,然后看哪一条指令往这个地址里面写东西(写的就是HP),从而找到那条指令, 再根据这条指令我们知道,当程序执行到这一条指令的时候,EAX里面放的就是HP的地址,于是我们用代码注入的方法把HP的地址(也就是EAX的值)放到 0045FF40这个位置。总结起来,我们是“根据写入HP地址的指令找到指针”。

而我们这次要找的东西不一样,我们先来看看CHANGE VALUE和CHANGE POINTER两个按钮实质上的不同。CHANGE VALUE这个按钮做的事情是:把HP的值,写到HP的地址。而CHANGE POINTER要做的却不一样,它做的事情是:把变化了的HP地址,写到指针这个位置。

如果你想不明白这两个按钮之间的差别,那么趁现在先弄清楚,在没完全弄清楚之前,看下去只会越看越糊涂。

那么,如果你都弄明白了,我们就接着来开始我们这次的行动吧。

首先我们根据HP的值来找到HP的地址,再根据HP的地址来找到指针,我假设你都清楚具体该怎么做。找到指针后,我们直接把指针添加到地址列表上(地址为 00BD4E64),我们需要地址列表上有这一项,另外我们还要以指针方式把指针添加到地址列表上(勾选指针方式,地址00BD4E64,偏移量0),这 一项是最后用来检验我们的劳动成果的。

接着,我们在地址列表上刚才直接添加的指针这一项点右键,仍然是Find out what is writes this address,然后我们回到TUT,点一下CHANGE POINTER,这个时候CE应该能找到一条指令,没错了就是它在改写指针。(前面按CHANGE VALUE找指针的时候找到的那一行指令是在改写HP的地址的内容----即HP的数值,这次按CHANGE POINTER的时候找到的这条指令是在改写指针的内容----即HP的地址。想清楚两者的区别)。

我们先把找到的指令记下来,然后我们在MEMORY VIEW窗口上半部点右键->GO TO ADDRESS,输入这条指令所在的位置,我这里这条指令是在004561A9。然后把这一条指令和它后面的几条指令包括指令前面的地址记下来(主要是要 看清楚一会跳回来时跳到什么位置,也就是说它的下一条指令在什么地址,在这里只要记住这条指令本身和它的下一条指令就行了)。我这里的情况如下:

004561A9 - 89 82 10 03 00 00        mov [edx+00000310], eax
004561AF - b8 e8 03 00 00        mov eax, 000003e8

事实上,上面第一行中EAX就是TUT生成的新的HP地址,这一行就是把这个新生成的HP地址放到指针里面去。刚才在CE找到这条指令的时候,如果你有去 看EXTRA INFO的话,你会看到EDX=00BD4B54,如果你用WINDOWS的计算器以十六进制算一下BD4B54+310,你就不难发现结果就是 BD4E64,就是我上面说的指针的地址00BD4E64。从这里也可以很清楚地看到,以前大家一直不明白的方括号里面的算式的问题。

那么,我们现在找到了改写指针的这条指令,并且我们知道在这条指令执行的时候,EAX里面就是新的HP地址。那么我们要做的就是在这里也做一次代码注入, 当然了这次不是跳到0045FF10那里,因为那里已经放了CHANGE VALUE这个按钮的注入代码了(我假设你已经先按第一篇的做法先做好了CHANGE VALUE的代码注入了),所以我们要跟在它后面,刚巧前面注入的代码是到0045FF1F,所以我们的这次新的代码就从0045FF20开始。下面就是 0045FF10这里,两个按钮的两次代码注入之后的情况:

0045ff10 - 89 05 40 ff 45 00    - mov [0045ff40],eax
0045ff16 - 89 10              - mov [eax],edx
0045ff18 - 8b 45 fc              - mov eax,[ebp-04]
0045ff1b - e9 b4 61 ff ff    - jmp 004560d4
---------------------------------------------------------------
0045ff20 - 89 05 40 ff 45 00    - mov [0045ff40],eax
0045ff26 - 89 82 10 03 00 00        - mov [edx+00000310],eax
0045ff2c - e9 7e 62 ff ff    - jmp 004561af

上面四行和本教程第一篇完全一样,我就不再重复了,而下面三行就是我们为CHANGE POINTER按钮所做的代码注入,其实更简单,因为我们知道在004561A9这个地方,EAX里面放的就是新的HP地址,所以跳0045FF20的之 后,我们把EAX直接放到0045FF40,接着仍然是恢复被JMP破坏的指令,跟着就是跳回原始位置后面的一条指令继续执行就行了。


接着
至于原始位置,也就是004561A9那里,修改之后的情况是这样的:
004561A9 - e9 72 9d 00 00        - jmp 0045ff20
004561AE - 90          - nop
004561AF - b8 e8 03 00 00        - mov eax, 000003e8

这次有两点不同:
一,因为被我们破坏的指令这次是六字节,而我们的JMP是五字节,所以这次只破坏了一条指令,所以恢复时也只是恢复一条指令。
二,也因为这次被破坏的指令是六字节,而JMP是五字节,所以这次CE问你指令长度不一致,是否要补NOP的时候,记得一定要选YES,让CE帮你补上NOP。

现在,0045FF10这里两个注入的代码改好了,004560CF和004561A9这两处的JMP也改好了,我们的工作也完成了,当然最后别忘了检验 一下是否正确。如果你前面没有把指针以指针方式添加在地址列表里,那么现在把指针以指针方式添加到地址列表上,另外MEMORY VIEW窗口下半部也用右键->GO TO ADDRESS并输入0045FF40让它显示我们保存HP地址的指针位置,然后调整CE主窗口,MEMORY VIEW和TUT的位置,让CE主窗口的地址列表,MEMORY VIEW的下半部0045FF40和TUT的窗口都能看得到,分别点击CHANGE VALUE和CHANGE POINTER,你可以在这三个位置看到,地址列表中以指针方式添加的那一项,最后面的VALUE那一栏显示的就是HP的数值,而P->后面显示的 地址和0045FF40显示的一样,当点击CHANGE POINTER之后,0045FF40和地址列表上P->后面的地址同时变化,并且内容完全一致,这样我们的工作就算是圆满完成了。

还有,我这里是用CE4.4带的TUT2.4做的,CE5.2带的TUT是2.5,有可能一些地址例如指针等,会稍有不同,如果你是用TUT2.5,请根 据具体情况调整一下具体的地址。另外CE5.2的EXTRA INFO显示寄存器的情况和CE4.4有点不同,也请大家注意。

希望这三篇教程一方面能让大家理解代码注入的过程和原理,以及简单的应用,同时也可以让大家对DMA有个认识,看看上面关于两个按钮之间的不同,多少应该对理解DMA有一定的帮助。

怎么样?大家都看懂了吗?

看不懂?基础不好不是你的错,不去打好基础就是你的错了,呵呵。再说一遍,去看汇编教程。这个实例教程如果有些地方我说得不清楚甚至是说错了的,欢迎讨论,但如果是你基础没打好看不懂的,那还是请你自己解决吧:)

(完)

PS:这次的教程仍然是没有任何图片。电影虽然很精彩,但你仍然得学会看没有插图的小说。告诉你们,我的知识绝大多数是看那些没有图片的文字学来的,呵 呵。所以我也因此对文字比较有感情,并且学会了用文字来表达思想和传递知识。如果你一定要图片才能看得懂,那恕我直言,你得多培养一下文字理解能力和想象 力了。
sener2222

ZxID:1684592

等级: 中士
一直很沉默...
举报 只看该作者 板凳   发表于: 2008-09-10 0
好帖,但是看不完
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 地板   发表于: 2008-09-10 0
掉的真快一下载到第5页了 顶一个
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 4楼  发表于: 2008-09-10 0
看能顶上不去不
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 5楼  发表于: 2008-09-10 0
我自己也在研究!!不过基础差了点!!难度比较大
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 6楼  发表于: 2008-09-10 0
发这个 总比 发那些 假CT 要好多了  !!
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 7楼  发表于: 2008-09-10 0
这2天 猴岛的 人气也太火了吧 !帖子会瞬间掉到 5-6页 汗啊
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 8楼  发表于: 2008-09-10 0
继续了 !就当给自己赚DB了
4564567aaa

ZxID:1545872

等级: 少校
- -

举报 只看该作者 9楼  发表于: 2008-09-10 0
终于知道那些做CT的辛苦了~
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 10楼  发表于: 2008-09-10 0
顶上去
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 11楼  发表于: 2008-09-10 0
恩 看到就头昏!!我还在继续研究!!
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 12楼  发表于: 2008-09-10 0
然后昨天试了试  改地图!!已经不行了!!虽然能改出图 但是 进不去图!!很郁闷的说
fl2jcj

ZxID:1687448

等级: 下士
举报 只看该作者 13楼  发表于: 2008-09-10 0
厉害我还是去叫朋友帮我做把,吗的就是联系不上,他是做外挂的,最近在闭关做梦幻外挂就是找不到人郁闷!
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 14楼  发表于: 2008-09-10 0
顶起 让多点人看到 兴许 !!基础好的 高手能研究出来!!
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 15楼  发表于: 2008-09-10 0
掉了 10页以后 顶起
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 16楼  发表于: 2008-09-10 0
申精!!!
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 17楼  发表于: 2008-09-10 0
继续
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 18楼  发表于: 2008-09-10 0
继续继续!!
skyking777

ZxID:1608503

等级: 上等兵
举报 只看该作者 19楼  发表于: 2008-09-10 0
继续 继续
« 返回列表
发帖 回复