【PE结构】重定位表

本文详细介绍了PE文件中的重定位表,包括其概念、使用规则、表结构和定位方法。重定位表用于记录PE文件中需要修正的地址位置,以适应不同的加载基址。在程序加载时,根据加载基址变化对表中的地址数据进行调整,确保程序正常运行。重定位表是一个结构体数组,每个元素描述4KB区域内重定位信息,包含起始RVA、大小和重定位元素个数等关键信息。

一、前言
二、PE整体结构
三、DOS头
四、NT头
五、区段头
六、导出表
七、导入表
八、资源表

九、重定位表


1.概念

重定位表 存的是PE文件中需要修改(变量数据)的地址的位置。
全局变量和局部静态变量在PE文件数据段中。
程序代码在寻址这些变量时,用的不是偏移RVA,而是直接地址VA。

2.使用规则

我们知道VA=基址+RVA,而基址默认是0x400000,实际可能会发生变化。
所以在每次加载程序时,需要先判断程序加载基址是否是0x400000,如果是,重定位表内容不需要变动,如果不是,重定位表中的地址数据=原数据-原基址+新基址。

3.表结构

重定位表也是一个结构体数组,以全零元素节为,每一个数组元素描述了一页(4KB)内的重定位信息。

typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;     // 需要重定位的区域的位置RVA
    DWORD   SizeOfBlock;        // 结构体大小,包含TypeOffset
    //  WORD    TypeOffset[1];  // 存放相对于VirtualAddress的偏移
} IMAGE_BASE_RELOCATION;
  • VirtualAddress
    一个区域(4KB)的起始位置RVA
  • SizeOfBlock
    当前结构体+TypeOffset数组的整体大小
    区域内(4KB)重定位元素个数=(SizeOfBlock-8)/2
  • TypeOffset
    并不是这个结构体的成员,而是紧挨着IMAGE_BASE_RELOCATION的一个不定长数组。
    TypeOffset是一个以2字节为一个元素的数组
    其中元素的低12位才是偏移地址,高4位是属性
    这个数组内有多少个元素,就代表当前4KB区域内有多少个要修改的地址。
    这个数组里的每个元素,是当前4KB区域内,需要修改的地址,的区域内偏移。
    也就是说,区段内,第N个,需要修改的地址=VirtualAddress+TypeOffset[N]

4.重定位表定位

FOA = 表RVA - 段RVA + 段FOA
= 0x75A000 - 0x75A000 + 0x741E00
= 0x741E00

内部具体值的解析,我们可以通过LoadPE来看一下
这里写图片描述


上一篇: 【PE结构】资源表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值