|
发表于 2010-3-11 21:47:08
|显示全部楼层
第二步:
【第二步:精确数值扫描(密码: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并学习一下其他的扫描方法怎样工作的】 |
|