02授人以鱼不如授人以渔基址的寻找.docx
《02授人以鱼不如授人以渔基址的寻找.docx》由会员分享,可在线阅读,更多相关《02授人以鱼不如授人以渔基址的寻找.docx(13页珍藏版)》请在冰豆网上搜索。
02授人以鱼不如授人以渔基址的寻找
02授人以鱼不如授人以渔●(基址的寻找)
游戏例一
游戏名:
刀剑英雄2
现在当前生命是273 我们在CE里查找273
搜出一大堆先不管他
我们让生命变动一下
被怪打了几下 血变少了
这个时候我们发现血恢复的很快根本来不及找这个时候我们可以用更改过的数值来查找
*因为相对于第一次找的273的值来说我们目前的血值 已经改变了.
好了还是有一大堆地址.
这个时候我们发现有一个绿色的地址.并且他的值是当前血的值,并且随之变化.
*绿色的地址就是基址,这里面的数值不会因为游戏重开的原因而发生改变.
好了当前血的基址已经找到了.并且重新打开游戏也不会发生改变.
游戏例二
游戏名:
星尘传说
我们还是来找当前血的基址
当前血的值是88
在CE里搜索88 找出一堆地址 我们让血的值变化一下
因为血的值恢复的很慢所以我们可以直接输入当前血的值来寻找.
剩下一个,但是这个地址并不是基址(基址在CE中是绿色的) 也就是说下次游戏启动后这个地址就不是当前血的地址了.所以我们需要找出他的基址.
添加进去后 我们右键点击选择 查找写入改地址的代码
然后 我们在游戏里 把血的值变动下,(找个怪打2下)
然后切换到CE一看发现列表里出现2个地址
到底2个谁是我们要找的呢?
我们先打开第一个双击一下第一个地址
这里的代码是
mov[ecx],edx
@ mov 通用数据传送指令
说明:
1.MOVOPRD1,OPRD
OPRD1为目的操作数,可以是寄存器、存储器、累加器.
OPRD2为源操作数,可以是寄存器、存储器、累加器和立即数.
@ 2.MOV指令以分为以下四种情况:
<1>寄存器与寄存器之间的数据传送指令
<2>立即数到通用寄存器数据传送指令
<3>寄存器与存储器之间的数据传送指令
<4>立即数到存储器的数据传送
图中的汇编指令就是把edx的值传入到 [ecx] 这里去.
* [ecx] [] 这个括号在汇编里表示指针的意思 指针的意思后面再讲.
这个是第二行的代码
mov[ecx+4a0],eax
代码的意思就是 把EAX的值放入 ECX+4A0 这个地址中去.EAX=55 转换成10进制=85
跟我们刚刚找的血值很像 ,为什么不是刚刚我们第二次搜的值呢 ,因为血的值在这段时间内已经恢复了一点.
这个就是我们要找的偏移 [ecx+4a0]
在mov[ecx+4a0],eax 这个代码里我们知道EAX就是当前血的值,那么[ECX+4A0] 就是血的地址. 而这个代码的意思就是把当前血的值放入这个存放当前血的地址里面去. 这里的地址是[ecx+4a0]
但是我们发现重进游戏后 ECX的值也是会变的!
看来还得找ECX的值
*不要忘记勾上HEX 因为ECX的值是16进制的
找到5个值好了全部选上 这次我们用查找访问该地址的代码来寻找
*这里为什么要用查找访问该地址的代码而不是用写入?
因为这里的值再不重启游戏的情况下是不会发生改变的, 而当我们人物血值发生改变的时候游戏会先访问并读取这个偏移地址然后找到 当前血值存放的地址来更新当前的血.
所以按照这个思路我们就可以认为 当去血的时候CE的监视列表里如果出现代码 那就表明在血值改变过程中访问了这个代码.
每一个都粗略的找一次 发现后面2个无论怎么操作都没有出现代码.所以我们放弃,现在剩下3个
我们先来看第一个 列表里的代码很多. 我们来去掉一点血. 仔细看列表我们会发现在掉血的过程中列表的代码会增加 这表明掉血的时候读取了这个地址~
再来看看第二个 在血减少的过程中 并没有代码增加.
第三个也是一样.
我们来看下第一个 我们发现他的偏移都是[*+64]
哪一个是我们要找的呢?
*其实基本上来说 任何 一个都是可以的有些时候基址并不只有一个~
所以我们只需要找偏移最少的一个就可以了
我们先拿第一个来看~
movesi,[eax+64]
P:
我们刚刚找的090BE268 这个数值 到底是ESI还是[EAX+64]?
我们说了在movesi,eax中 前面的表示被存入的寄存器 而后面的就是值了.
所以我们这里搜索的是090BE268这个值也就是[EAX+64]=090BE268
*这里初学者可能会迷茫,不过只要多找几个不同的游戏然后就会明白了.
然后我们需要找EAX的地址
这里我们又发现一个问题 在
movesi,[eax+64] 上面的那行代码是
moveax,[007c1b90]
我们上面说到我们需要找到EAX的值,而汇编代码是从上面开始一行一行往下面运行的,所以上面的EAX就是我们要找的数值 EAX=[007c1b90]
这里的[007c1b90] 就是基址了. 因为这里已经是一个明确的数值了.
我们来整理一下:
[ecx+4a0]
ECX=[EAX+64]
EAX=[007c1b90]
========================
[[[007c1b90]+64]+4a0]
这个就是血的基址+偏移 我们来试试
呵呵88就是当前血的地址.而且重新进游戏也可以正常显示.
这里已经告一段落了如果你细心的话会发现在第二步中监视地址090BE268
的过程中会出现很多[*+64] 的偏移在这里我们来试试另外一个
movecx,[edi+64]
这里我们看看附近 并没有 往EDI写入的代码 所以我们直接搜索EDI的值(不要忘了勾上HEX)
出现一个绿色的地址,上面我们说了 绿色的就是基址了.这个值跟我们上面找的是一样的.
这个时候我发现又一个不同的.
这里的ECX=90BE268 这个是不是有点眼熟?
其实就是我们上面第二步搜的那个值.呵呵如果你在去搜的话就是绕圈子了.
好了这次教程到此结束~