更新时间: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++写的辅助,能教我下么
大佬,这些有书看的吗?
还没看,先给大佬顶一下