作者:topdog 

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

下文参考过同名贴子,部份语言表达完全相同。由于原文以C作解释,但现在外挂新人中用VB的稍多点。故以VB做解释。 

参考贴地址:http://qun.51.com/sxsykj/topic.php?pid=2561 

全局基址:它是所有地址的基础。 

人物基址: 【全局基址】+某个偏移值

人物各个属性地址:【人物基址】+某个偏移值

技能基址: 【全局基址】+某个偏移值

包裹基址: 【全局基址】+某个偏移值

怪物基址: 【全局基址】+某个偏移值

物品基址: 【全局基址】+某个偏移值

也就是说,全局基址是一切的基础,而不同的其他各个基址是在它的基础上再次偏移。 

为什么会有偏移呢

关于为什么会有偏移一说,粗略解释一下... 

现在的程序编写都是面向对象的,就是用类来封装对象的属性和方法... 

我们假设游戏大致是由以下几个类构成的

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 游戏类 

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

从上面,我们可以看到整个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

posted on 2011-10-17 09:51  巅枫  阅读(4032)  评论(0编辑  收藏  举报