1、01 授人以鱼不如授人以渔什么是基址作者:topdog 下文参考过同名贴子,部份语言表达完全相同。由于原文以 C 作解释,但现在外挂新人中用 VB 的稍多点。故以 VB 做解释。 参考贴地址:http:/ 全局基址:它是所有地址的基础。 人物基址: 【全局基址】+某个偏移值 1 人物各个属性地址:【人物基址】+某个偏移值 1 技能基址: 【全局基址】+某个偏移值 2 包裹基址: 【全局基址】+某个偏移值 3 怪物基址: 【全局基址】+某个偏移值 4 物品基址: 【全局基址】+某个偏移值 5 也就是说,全局基址是一切的基础,而不同的其他各个基址是在它的基础上再次偏移。 为什么会有偏移呢? 关于为
2、什么会有偏移一说,粗略解释一下. 现在的程序编写都是面向对象的,就是用类来封装对象的属性和方法. 我们假设游戏大致是由以下几个类构成的: 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
3、 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
4、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
5、物品类的一级基址与基址的偏移量是 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