【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
    
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是使用树状结构展示Windows的PE结构的所有细节: PE结构 ├─DOS头(64字节) │ ├──e_magic(2字节)- DOS标识符(MZ) │ ├──e_cblp(2字节)- 最后一页字节数 │ ├──e_cp(2字节)- 文件中页数 │ ├──e_crlc(2字节)- 重定位项数 │ ├──e_cparhdr(2字节)- Header段的段字节数 │ ├──e_minalloc(2字节)- 所需的最小内存量 │ ├──e_maxalloc(2字节)- 所需的最大内存量 │ ├──e_ss(2字节)- 初始SS值 │ ├──e_sp(2字节)- 初始SP值 │ ├──e_csum(2字节)- 校验和 │ ├──e_ip(2字节)- 初始IP值 │ ├──e_cs(2字节)- 初始CS值 │ ├──e_lfarlc(2字节)- 重定位的文件偏移 │ ├──e_ovno(2字节)- Overlay编号 │ ├──e_res(4 x 4字节)- 保留字 │ ├──e_oemid(2字节)- OEM标识符 │ ├──e_oeminfo(2字节)- OEM信息 │ ├──e_res2(10 x 2字节)- 保留字 │ ├──e_lfanew(4字节)- 新的文件头偏移 │ └──(共64字节) ├─PE头(20字节) │ ├──Signature(4字节)- PE标识符(PE\0\0) │ ├──Machine(2字节)- 目标机器类型 │ ├──NumberOfSections(2字节)- 节数量 │ ├──TimeDateStamp(4字节)- 时间戳 │ ├──PointerToSymbolTable(4字节)- 符号偏移 │ ├──NumberOfSymbols(4字节)- 符号项数 │ ├──SizeOfOptionalHeader(2字节)- 可选头大小 │ ├──Characteristics(2字节)- 特征标志 │ └──(共20字节) ├─可选头(可变长度) │ ├──标准字段(24字节) │ │ ├──Magic(2字节)- 魔数 │ │ ├──MajorLinkerVersion(1字节)- 链接器主版本号 │ │ ├──MinorLinkerVersion(1字节)- 链接器次版本号 │ │ ├──SizeOfCode(4字节)- 代码段大小 │ │ ├──SizeOfInitializedData(4字节)- 已初始化数据段大小 │ │ ├──SizeOfUninitializedData(4字节)- 未初始化数据段大小 │ │ ├──AddressOfEntryPoint(4字节)- 入口点地址 │ │ ├──BaseOfCode(4字节)- 代码段基址 │ │ └──BaseOfData(4字节)- 数据段基址 │ ├──Windows特定字段(可选) │ │ ├──ImageBase(4字节或8字节)- 图像基址 │ │ ├──SectionAlignment(4字节)- 节对齐大小 │ │ ├──FileAlignment(4字节)- 文件对齐大小 │ │ ├──MajorOperatingSystemVersion(2字节)- 操作系统主版本号 │ │ ├──MinorOperatingSystemVersion(2字节)- 操作系统次版本号 │ │ ├──MajorImageVersion(2字节)- 文件主版本号 │ │ ├──MinorImageVersion(2字节)- 文件次版本号 │ │ ├──MajorSubsystemVersion(2字节)- 子系统主版本号 │ │ ├──MinorSubsystemVersion(2字节)- 子系统次版本号 │ │ ├──Win32VersionValue(4字节)- 保留字段 │ │ ├──SizeOfImage(4字节)- 加载后图像大小 │ │ ├──SizeOfHeaders(4字节)- 文件头大小 │ │ ├──CheckSum(4字节)- 校验和 │ │ ├──Subsystem(2字节)- 子系统类型 │ │ ├──DllCharacteristics(2字节)- DLL特征标志 │ │ ├──SizeOfStackReserve(4字节或8字节)- 栈保留大小 │ │ ├──SizeOfStackCommit(4字节或8字节)- 栈提交大小 │ │ ├──SizeOfHeapReserve(4字节或8字节)- 堆保留大小 │ │ ├──SizeOfHeapCommit(4字节或8字节)- 堆提交大小 │ │ ├──LoaderFlags(4字节)- 加载器标志 │ │ ├──NumberOfRvaAndSizes(4字节)- 数据目录项数 │ │ └──DataDirectory(8 x 数目)- 数据目录 │ ├──(共64字节或112字节) │ └──(可变长度) ├─节(可变长度) │ ├──节头(40字节) │ │ ├──Name(8字节)- 节名 │ │ ├──VirtualSize(4字节)- 节虚拟大小 │ │ ├──VirtualAddress(4字节)- 节虚拟地址 │ │ ├──SizeOfRawData(4字节)- 节大小 │ │ ├──PointerToRawData(4字节)- 节在文件中的偏移 │ │ ├──PointerToRelocations(4字节)- 重定位偏移 │ │ ├──PointerToLinenumbers(4字节)- 行号偏移 │ │ ├──NumberOfRelocations(2字节)- 重定位项数 │ │ ├──NumberOfLinenumbers(2字节)- 行号项数 │ │ ├──Characteristics(4字节)- 特征标志 │ │ └──(共40字节) │ ├──节数据(可变长度) │ ├──(共节数量 x 40字节 + 节大小之和) │ └──(可变长度) └──(PE头大小 + 节大小之和) 以上是PE结构的详细展示,中文解释已经附带在每个字段后面,同时也包括了每个字段的大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值