【问题标题】:Does the PointerToRawData entries within section headers in a PE file hold offsets in ascending order?PE 文件中节标题中的 PointerToRawData 条目是否按升序保存偏移量?
【发布时间】:2016-08-19 17:10:56
【问题描述】:
PE 文件的节头中的PointerToRawData 条目是否按升序保存偏移量?
我可以假设 PE 文件中的节标题的PointerToRawData 条目相对于它们在节表中的顺序按升序保存偏移量吗?
我看到文档说:
在图像文件中,节的 VA 必须由链接器分配
使它们按升序排列且相邻,并且它们必须是
可选标头中SectionAlignment 值的倍数。
但是,我找不到有关PointerToRawData 成员的任何信息?
如果可能,请提供信息来源。
谢谢。
【问题讨论】:
标签:
windows
assembly
x86
windows-10
portable-executable
【解决方案1】:
是的,节数据,即 PointerToRawData 值所指向的内容,需要与节标题的顺序相同,正如您所指出的那样,它们需要按 VA 顺序排列。
根据 Microsoft 可移植可执行和通用对象文件格式规范 - 修订版 8.3 - 2013 年 2 月 6 日:
部分数据
[...] 部分数据必须按顺序出现
相应部分的 RVA 值(与中的各个部分标题一样)
节表)。
如果 SectionAlignment 值在
可选标头小于体系结构的页面大小。对于此类文件,
文件中节数据的位置必须与其在内存中的位置相匹配,当
图像被加载,因此节数据的物理偏移量与 RVA 相同。
【解决方案2】:
在节表中,节头的VirtualAddress和PointerToRawData字段都必须是升序,即第一个节头持有最低的VirtualAddress和PointerToRawData。
我猜微软做出这个决定是为了加快加载过程。
官方 PE 文档在名为“Section Data”的部分中说:
在图像文件中,部分数据必须在边界上对齐
由可选标头中的FileAlignment 字段指定。部分
数据必须按照相应的 RVA 值的顺序出现
节(节表中的各个节标题也是如此)。