牧羊人新闻资讯网-牧羊人博客

主页
分享国际,国内,军事,社会,娱乐和财经新闻

谢欣颖:扫盲第一弹,基址到底是什么?

更新时间:2020-11-08 14:15点击:

  最近看贴吧,发现好多人,只会用大佬开源,但是基本概念完全搞不懂。最基本的基址概念,也搞不清楚是什么东西。

  更多的是有人自己也不是很清楚,但是却来顺手发帖带偏一群小白

  今天我就来讲讲,基址到底是什么,偏移到底是怎么来的

  下面是一个虚构的示例程序结构

  可以看到,我们定义了一个人物类,里面包含了背包指针,装备指针,以及一些属性

  这个就是今天讲解的大前提,现在,我们就来具体看看,偏移的来历,以及怎么一步步变成我们需要的数值

  首先,我们定义人物指针为全局变量

  Character * character=new Character;

  一般来说,定义为全局变量后,编译之后,系统分配的内存地址,即是固定地址,也就是我们通常所说的基质。

  在这里,假设系统分配的地址为 0x10000;

  那么,在这个示例里面,人物基址=0x10000,但是,0x10000这个地址,却不是人物类的地址。

  那么,他是什么呢?答案是指针,通俗点说,就是0x10000这个地址,是一个指针,指针存放的内容,指向了人物类的地址

  由此可得,人物类的地址 为 *(int*)0x10000,也就是易语言的 读内存整数(0x10000)

  现在就来看看,偏移到底是什么来的。现在我们读取了0x10000的内容,也就是人物类的内存地址。我们接着看看人物类的结构

  Bag * bag; //背包指针

  Equipment * equipment; //装备指针

  int health; //血量

  int money; //金币

  int level; //等级

  假设我们是32位程序,那指针为4字节,可以得到如下偏移

  Bag * bag; //0

  Equipment * equipment; //4

  int health; //8

  int money; //12

  int level; //16

  现在我们已经计算出了偏移,那如果我们要获取血量,只需读之前获取的地址 + 8的内存地址即可

  易语言的话,也就是 读内存整数(读内存整数(0x10000) + 8);

  就这样,我们就获取了血量

  **,大佬**,666

  真大佬来了

  那么,如果我们要获取背包物品数量怎么办,只需重复之前的步骤,读取背包的指针内容,再读取即可

  在这个示例程序里面,背包指针偏移为0,也就是 读内存整数(读内存整数(0x10000) );

  背包物品偏移为0,再读取上面的获取的地址一次即可。

  基址 和 偏移的概念,其实就这么简单

  下一篇讲解内容,让你完全看懂解密函数,到底是怎么解密的

  

  好像会用一些汇编和了解PE文件大致是怎么回事的的基本都就知道是怎么回事,简单的将就是编译时候就初始化化过的全局变量。一般情况是指针。指向一段堆内存、偶尔是数组。也就是在函数外部的变量和satic 标记的变量

  可以

  楼主可以教下我吗,发下你能教我什么,我付学费,q:728895062

  明天继续第二弹科普,带你看懂解密函数,告别一堆看不懂的置入代码

  大佬66666

  这个可以理解,

  要是自己对照反汇编代码来写的话,

  同一个功能可能有几十种写法

  就看怎么处理堆栈平衡了

  学e的硬是看不懂c。这一堆应该就是 读写内存

  建议加精,这么好的扫盲帖不多了→_→虽然我还是看不太懂

  收藏了 真心看不懂

  顶.希望继续科普.

  坐等更新

  偏移和指针看到脑壳晕

  哎。小白应该从哪学起

  很好,不过没学过c++类与指针的很难看懂。

  可以说讲的很好了 我现在写辅助没有一个思路

  啥也不说,先顶后观

  看不懂啊大佬

  大佬,我是学C和C++的,但对做辅助没头绪,想做C++写的辅助,能教我下么

  大佬,这些有书看的吗?

  还没看,先给大佬顶一下

官方微信公众号