PE文件的内存映射

本文详细介绍了PE文件内存映射的关键概念,包括文件偏移地址、装载基址、虚拟内存地址和相对虚拟地址。通过公式和实例解释了如何在已知装载基址和虚拟内存地址的情况下,计算文件偏移和相对虚拟地址,从而理解PE文件在内存中的布局和转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果想要理解PE文件与虚拟内存之间的映射关系,首先要理解一些概念:

1.文件偏移地址(file offset) PE文件数据在硬盘中存放的地址就叫做文件偏移地址。用winhex程序查看文件时的offset就是文件偏移地址了。文件偏移地址就是指文件在磁盘上存放时相对于文件开头的偏移。

2.装载基址(image base) 装载基址就是指pe文件装入内存时的基地址,一般情况下,EXE文件的装载基址都是0x00400000,但是也可以更改的,尤其是dll文件。

3.虚拟内存地址(virtual address,VA) 虚拟内存地址就是指pe文件被装入内存之后的地址。

4.相对虚拟地址(relative virtual address ,RVA) 相对虚拟地址指的是没有加算装载基址情况下的内存地址。

然而虚拟内存地址和装载基址和相对虚拟地址之间的关系如下

虚拟内存地址(VA)=装载基址(image base)+相对虚拟地址(RVA)

下面是我偷来的一张图片

不难看出,PE文件映射到虚拟内存变化很大很大。

在这里还有说明一下文件偏移的第一个字节是从0x00000000处开始的,而虚拟内存地址是从装载基址处开始的,也是就是从0x00400000处开始。

由于操作系统在装载pe文件的时候还是按照pe文件中的各种数据结构来映射的,所以文件偏移地址与相对虚拟地址还是有一定的相似之处的,他们之间的差异是由于数据单位存放位置不同而造成的。

pe文件的数据一般都是按照0x200字节为基本单位进行组织存放的,当一个数据区段不够0x200的时候,没有用到的空间用00填充,而当一个数据区段超过0x200的时候,就会再申请一个0x200的空间存放数据,空出的地方还是用00填充。所以pe文件的区段大小永远都是0x200的整数倍。

而当pe文件装入内存的时候,数据区段一般都是以0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值