目录

【飞郁2022新课程】21 - 基地址和动态地址

基地址

每一次程序启动,内存都会重新分配,我们在CE中扫描的地址大多会发生改变,但也有一些是不会随着游戏重启而变化的,这里面就有一部分是基地址.

基地址是相对静态的,我们所说的基地址不变,只是说这个地址不会变,他指向的内容的意义通常也是不变的,但是指向的数值大多会随着程序重启而变化.

内存的角度和程序的角度看基地址

基地址在程序中的本质是全局变量

如果我们在CE中取扫描一个数值,可以发现有一部分结果是绿色的

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/134055zf2u5eulifio7iu5-20211220190336360.png

这些绿色的地址,往往就是基地址,他们是不会随着程序重启而发生变化的

我们选中这些地址并双击,将他们提取到下面的列表中,并且在列表中双击https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/134100irj4wqtgf4e2fe4t.png 下面的地址,可以看到他们是由"XXXX.exe+xxxx"表示的.

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/134100yjfst2ala2k31zxi-20211220190331304.png

这个XXXX.EXE是模块名,这个值代表的是模块句柄,很多32位程序的主模块都是固定不变的,即0x400000,当然也有很多的模块是随着程序重启而变化的.

无论是否变化,我们使用GetModuleHandleA(“模块名”) 获取即可

基地址也是模块范围内的地址

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/134100exin5deid63gjiid.png

偏移

把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或偏移量”。

简单点说,就是一个内存地址相对于另外一个内存地址的距离,这距离的单位是字节

内存地址A+偏移=内存地址b

例如 0x50000 和 0x50050 的偏移就是 0x50

再比如前面我们提到的基地址是由模块句柄+“一个值"得来的,其实这"一个值"就是基地址相对于模块句柄的偏移,

而且在程序不更新的前提下,这个值是不会变化的.

动态地址

在我们扫描教案小游戏的人物血量后,可以得到一个地址

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/134100q34qup4aqkm4a4bq.png

当我们重新启动游戏后,发现这个地址失效了

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/134100r79hw00w3tp33y3q.png

这里显示的是”??",这种就是动态地址,他所代表的含义并不是固定的

那么如果遇见动态地址,我们怎么处理呢?

我们需要找到这个地址的偏移与所在的基地址,

例如[基地址]+偏移(当然也可能更多层偏移)

这里的基地址我们用了一个中括号括起来,他代表的是读基地址里面的值,也就是我们后面会讲到的指针,这里有一个简单的了解即可.