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

全部博文(65)

文章存档

2011年(4)

2010年(1)

2009年(60)

我的朋友

分类: 系统运维

2009-11-19 15:08:02

作者:topdog
本人成长于广海,本着全心支持广海发展,写了以下教程!!不能很好的表达要说的知识,也不知道能否教明白。请读者纠正,谢谢。


下文参考过同名贴子,部份语言表达完全相同。由于原文以C作解释,但现在外挂新人中用VB的稍多点。故以VB做解释。
参考贴地址:
全局基址:它是所有地址的基础。
人物基址: 【全局基址】+某个偏移值
1
人物各个属性地址:【人物基址】+某个偏移值
1
技能基址: 【全局基址】+某个偏移值
2
包裹基址: 【全局基址】+某个偏移值
3
怪物基址: 【全局基址】+某个偏移值
4
物品基址: 【全局基址】+某个偏移值
5
也就是说,全局基址是一切的基础,而不同的其他各个基址是在它的基础上再次偏移。

为什么会有偏移呢
?
关于为什么会有偏移一说,粗略解释一下
...
现在的程序编写都是面向对象的,就是用类来封装对象的属性和方法
...
我们假设游戏大致是由以下几个类构成的
:
Type
游戏类


  角色 as 角色类

  怪物 as 怪物类

  物品 as 物品类

End type



type 角色类
当前生命 as long

最大生命 as long

当前经验 as double

升级经验 as double

......
end type

type
怪物类


.....
怪物生命
as long

怪物X坐标 as float

怪物Y坐标 as float

End type

......

type
物品类

......
物品名称 as string
物品数量
as long
.......
end type

好,我们举列来说明什么是基址,一级基址,偏移。

通过以上定义的类,可以看出,程序一开始运行时,会定义游戏类

例:public Game as 游戏类

当执行这一句时,程序既将所需的内存地址分配出来了。假定它如下:

   
005000    00 01 02 03      04 05 06 07      08 09 0A 0B    0C 0D 0E 0F

00500000

00 50 00 0C

00 50 00 24

00 50 00 30

00 00 00 FF

00500010

00 00 00 FF

00 00 00 00

00 00 FF FF

00 00 00 00

00500020

00 00 FF FF

00 00 00 FF

00 00 00 01

00 00 00 0A

00500030

00 B4 A0 98

00 00 00 00

00 00 00 20

.......

(下图为彩色数据截图,方便会员查看)



从上面,我们可以看到整个Game类的开始的地址是00500000,这个就是传说中的基址了。
再看一级基址:蓝色的都是一级基址了,分别是角色类,怪物类,物品类的首地址。


再看看偏移。
角色类的一级基址与基址的偏移量是0,也就是
角色基址=【全局基址】+偏移0=00500000+0=00500000
    怪物类的一级基址与基址的偏移量是4,也就是
      怪物基址=【全局基址】+偏移4=00500000+4=00500004

  物品类的一级基址与基址的偏移量是8,也就是

      物品基址=【全局基址】+偏移8=00500000+8=00500008

我们在看看一级基址

  角色类基址=00500000

  内存编号00500000处的值是0050000C

  0050000C是内存编号00500000处的值,它表示的是一个内存编号,也就是指针,于是我们去内存编号0050000C处看看,桔黄色字体。

  0050000C处的四字节值是:FF,等于十进制的255,这个就是角色类的第一个元素:当前生命的值了,紧接着下一个四字节的数字就是生命最大值,

                    再往下8字节就是当前经验,再下8字节是升级经验。

  因此,角色生命的地址就是 [全局基址]+0]+0

        角色生命最大值地址 [全局基址]+0]+4

                经验      [全局基址]+0]+8

              升经验验    [全局基址]+0]+10



  同理,怪物基址=00500004

  内存编号 00500004处的值是 00500024

    看紫色字体,可知,分别是怪物生命,X坐标,Y坐标。

        生命 [全局基址]+4]+0

        X坐标[全局基址]+4]+4

        Y坐标[全局基址]+4]+8
阅读(1427) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~