【问题标题】:PE: Relation between SizeOfRawData and VirtualSize fields of the section headerPE:节头的 SizeOfRawData 和 VirtualSize 字段之间的关系
【发布时间】:2016-08-16 12:32:38
【问题描述】:

我看到对于图像文件中的部分,VirtualSize 字段是加载到内存中时该部分的总大小,而 SizeOfRawData 字段是该部分在磁盘上的初始化数据的大小。

在检查 .idata 部分时,VirtualSize 字段设置为 0x14,而 SizeOfRawData 字段设置为 0x400。

为什么链接器(在本例中为 MinGW ld)会使文件部分如此之大,而加载到内存中的部分只是它的一小部分?

另外,VirtualSize 字段的用途是什么?为什么不总是加载整个部分,即加载 SizeOfRawData 字节?

我在官方 PE 文档中没有看到描述或它们之间的关系。

【问题讨论】:

    标签: windows assembly windows-10 portable-executable


    【解决方案1】:

    SizeOfRawData(图像文件中原始数据部分的大小)总是多个IMAGE_OPTIONAL_HEADER.FileAlignment

    文件对齐

    图像文件中各个部分的原始数据的对齐方式,以字节为单位。 该值应该是 512 和 64K(含)之间的 2 的幂。这 默认为 512。如果 SectionAlignment 成员小于系统 页面大小,此成员必须与 SectionAlignment 相同。

    VirtualSize 字段的用途是需要为部分分配和复制多少内存。没有这个字段 loader 怎么知道这个?

    VirtualSize 可以大于或小于 SizeOfRawData

    例如,我们可以在节中只有几个字节的已初始化实际数据并且没有未初始化的数据 - 所以 VirtualSize 将只有几个字节大小,而 SizeOfRawData 512 个字节

    .data.bss 部分的另一种情况下 - 可以根本没有初始化数据(所以 SizeOfRawData == 0)但 VirtualSize != 0。

    所以加载器为部分分配(VirtualSize + SectionAlignment - 1) & ~(SectionAlignment-1)字节并将min(VirtualSize, SizeOfRawData)字节从文件复制到它

    【讨论】:

    • 非常感谢。 .data 不总是只保存初始化数据吗?另外,你从哪里得到“(VirtualSize + PAGE_SIZE - 1) & ~(PAGE_SIZE-1)”?如果可能的话,你能指出我的来源吗?我想阅读更多关于这个主题的内容:-)
    • @NicolasLykkeIversen 部分的大小必须与 SectionAlignment 大小对齐(通常这是 PAGE_SIZE(默认情况下) - 可以看看这里 - MiCreateImageFileMap - gate.upm.ro/os/LABs/… - MI_ROUND_TO_SIZE(LENGTH,ALIGNMENT) 宏
    • 如果部分包含未初始化和已初始化数据怎么办?那么loader拷贝太多了,因为SizeOfRawData是512?
    • @NicolasLykkeIversen 是的,你说得对 - .data 通常包含未初始化和已初始化的数据。例如我们有 cbInit(0xc0 bytes) 和 cbUninit(0x160 bytes),FileAlignment = 0x200 SizeOfRawData = ROUND_TO_SIZE(cbInit, FileAlignment) = 0x200 VirtualSize = cbInit + cbUninit = 0x220 loader copy min(SizeOfRawData,VirtualSize)=min(0x200,0x220)=0x200 bytes - 所以部分覆盖未初始化的数据。但这不是问题,因为链接器用 0 字节填充初始化的数据填充。
    • @NicolasLykkeIversen 但是你可以自己做一些小测试——用小初始化数据和大 uninit 编写程序(比如 char g_test[0x200];)——查看一些 PEView 生成的内容,而不是更改.data 结尾到非零并查看 exe 启动后 g_test[0x200] 内存中的内容
    猜你喜欢
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多