Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249799
  • 博文数量: 65
  • 博客积分: 2758
  • 博客等级: 少校
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-25 00:23
文章分类

全部博文(65)

文章存档

2011年(4)

2010年(1)

2009年(60)

我的朋友

分类:

2009-11-19 15:12:23

作者:重楼
时间:2009.08.20

游戏例一
    游戏名:刀剑英雄2




现在当前生命是 273  我们在CE 里查找 273



搜出一大堆 先不管他

我们让 生命 变动一下

被怪打了几下  血变少了




这个时候 我们发现 血 恢复的很快 根本来不及找 这个时候我们可以用 更改过的数值 来查找

*因为 相对于第一次找的 273 的值来说 我们目前的血值  已经改变了.




好了 还是有一大堆 地址.

这个时候我们发现 有一个绿色的地址. 并且 他的值是 当前血的值,并且随之变化.

*绿色的地址就是基址,这里面的数值不会因为游戏重开的原因而发生改变.

好了 当前血的基址已经找到了.并且重新打开游戏也不会发生改变.




游戏例二
    游戏名:星尘传说

我们还是来找 当前血的基址




当前血的值是 88




在CE 里搜索 88  找出一堆地址  我们让 血的值变化一下






因为 血 的值恢复的很慢 所以 我们可以直接输入 当前血的值 来寻找.




剩下一个,但是 这个地址 并不是基址 (基址在CE中是绿色的)  也就是说 下次游戏启动后这个地址就不是当前血的地址了.所以我们需要找出他的基址.






添加进去后  我们 右键点击 选择  查找写入改地址的代码


然后  我们在游戏里  把血 的值 变动下,(找个怪打2下)

然后切换到CE一看 发现 列表里出现2个地址 





到底2个谁是我们要找的呢?

我们先打开第一个 双击 一下 第一个地址


 

这里的代码 是 

mov [ecx],edx

@  mov  通用数据传送指令

        说明:1.MOV OPRD1,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]


 


哪一个 是我们要找的呢?

*其实 基本上来说  任何  一个 都是可以的 有些时候 基址并不只有一个~

所以 我们只需要找 偏移 最少的一个 就可以了

我们先拿第一个来看 ~



 


mov esi,[eax+64]


P:我们 刚刚找的 090BE268  这个数值  到底 是ESI 还是 [EAX+64]?


我们说了 在 mov esi,eax 中  前面的表示 被存入的寄存器  而后面的 就是值了.

所以 我们这里 搜索的是 090BE268 这个值 也就是 [EAX+64]= 090BE268

*这里 初学者 可能会迷茫 , 不过 只要多 找几个不同的游戏 然后就会明白了.

然后 我们需要找 EAX 的地址

这里 我们又发现一个问题  在

mov esi,[eax+64]  上面的那行代码是
mov eax,[007c1b90]

我们上面说到 我们需要找 到 EAX的值 ,而汇编代码 是从上面开始一行一行往下面运行的,所以上面的EAX就是我们要找的数值  EAX=[007c1b90]

这里 的 [007c1b90]  就是基址了.  因为这里已经是 一个 明确的数值 了.

我们来整理一下 :

[ecx+4a0]
ECX=[EAX +64]
EAX= [007c1b90]
========================

[[[007c1b90]+64]+4a0]
 
这个就是 血的 基址+偏移  我们来试试


 


呵呵 88 就是当前血的 地址. 而且 重新进游戏也可以正常显示.



这里已经告一段落了 如果你细心的话 会发现 在第二步中 监视 地址 090BE268
的过程中 会出现 很多 [* +64]  的偏移 在这里 我们来试试另外一个


 

mov ecx,[edi+64]

这里 我们看看 附近  并没有  往EDI写入的 代码  所以我们直接搜索 EDI的值 (不要忘了勾上HEX)


 

出现一个绿色的地址 , 上面我们说了  绿色的就是基址了. 这个值跟 我们 上面找的 是一样的.


这个时候 我发现又一个 不同的.


 


这里的 ECX=90BE268  这个是不是有点眼熟?  其实就是我们上面 第二步搜的那个值.呵呵 如果你在去搜的话 就是绕圈子了 .


好了 这次教程到此结束~
阅读(1368) | 评论(3) | 转发(0) |
0

上一篇:什么是基址

下一篇:游戏找CALL练习实例ONE

给主人留下些什么吧!~~

chinaunix网友2010-10-09 04:45:14

mov eax,[ecx+4a0] 是什么意思

chinaunix网友2010-10-09 04:45:04

mov eax,[ecx+4a0] 是什么意思

chinaunix网友2010-02-10 13:25:57

加我QQ409333224我有个问题当游戏不让查写入或读取时要什么找基址!