内存相关的一些概念

/ 2评 / 1

内存

内存是计算机中重要的部件之一,它是与 CPU 进行沟通的桥梁,计算机中所有程序的运行都是在内存中进行的。

虚拟内存

通过操作系统的某些指令对物理内存进行映射,使得每个程序都拥有物理内存那么大的内存。假如我们电脑插入4G的内存条,每个程序的虚拟内存就是4G。

内存地址

bit: 位(比特)是传输数据的单位,是计算机中存储数据的最小单位,每一位的状态只能是0或1。

byte:字节是处理数据的基本单位,是指一组相邻的二进制数码,通常8位为一个字节。

内存地址的单位是 byte,一般是使用十六进制来表示。

每次静态编译出某个应用程序后,它的内存布局固定了,也就是我们可以通过固定的地址去获取程序中的函数和变量。

程序运行后的真实函数/变量的地址 = IDA中分析出来的固定地址 + 模块的基址

偏移量

这里的偏移量指的是地址的偏移量,在内存中 0x000x50,就是偏移了 0x50,单位是 byte。比如在现实中我和你的距离是50米,我要找到你的位置,也就是偏移50,单位是米。

基址

基址指的是程序每次打开都不会变化的地址,也叫基地址静态地址

我们可以通过 CE 工具来理解这个概念:

静态地址:地址颜色是绿色,地址格式:xxx.exe+123456xxx.dll+123456,程序关掉再打开地址不会变,静态地址也叫基地址基址

动态地址:地址颜色是黑色,程序关掉再打开地址会变。

在易语言中,程序集变量、全局变量都是静态地址,子程序的局部变量是动态地址。

在 C/C++ 中,全局变量是静态地址,局部变量是动态地址。

可执行模块

通过 OD 工具附加到测试程序的进程,然后 ALT+E 查看加载的所有模块列表窗口:

可以获取到 EXE 可执行模块的信息:

可执行模块, 条目 0
基址=00400000
大小=00950000 (9764864.)
入口=00B755E2 ELEMENTC.<ModuleEntryPoint>
名称=ELEMENTC
路径=D:\PGP\games\口袋西游\element\ELEMENTCLIENT.EXE

根据模块的基址和模块大小,可以计算出模块的内存地址范围为 0x00400000 - 0x00D50000。入口地址相当于程序的 main 函数的地址。

在 CE 工具中也附加到测试程序的进程,然后根据我们计算出来的模块内存地址范围,指定内存扫描范围,随便搜索一个值,可以验证这个范围中的地址都是基址。

  1. 容添下说道:

    麻雀虽小五脏俱全

  2. rantrism说道:

    您好~我是腾讯云+社区的运营,关注了您在分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
    作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器、域名等,另外还有些周边礼物。 我们诚挚的邀请您并期待您的加入~
    腾讯云+社区是由腾讯云全新打造的一个技术交流社区,正在引入更多的作者与优质文章,就此社区推出一个自媒体的分享计划。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注