【PE结构】重定位表

一、前言
二、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结构】资源表

猜你喜欢

转载自blog.csdn.net/chy_chenyang/article/details/80864627