PE文件中如何使用.reloc部分?

逆向工程 聚乙烯 动态链接
2021-06-16 05:02:40

我已经阅读pecoff_v83了微软的文档.reloc部分部分,我已阅读:

修正表包含图像中所有修正的条目。可选头中的总修复数据大小是修复表中的字节数。修正表被分成修正块。每个块代表一个 4K 页面的修正。每个块必须从 32 位边界开始。

而且,我知道每个块都包含:页面 RVA 和块大小。每个块大小包含:类型和偏移量。

我用过peview

视图显示

我有几个问题:

  1. 每个块必须以 32 位边界开始” - 我不明白,你能解释一下吗?

  2. PE文件有用IMAGE_BASE_RELOCATION吗?

  3. 从这个SO 问题('所以大部分二进制文件都是由 reloc 表组成的? ')

    如果您的程序频繁访问全局变量和常量,它将有一个巨大的重定位表,因为加载程序需要更新的地方太多了

    加载器如何使用重定位表并更新它?

1个回答

“每个块都必须从 32 位边界开始” - 我不明白,你能解释一下吗?

这意味着即使在块完成后您还有空间,您也必须为 RVA 使用下一个 32 位对齐地址。在我看来,这主要是因为页面优化。您可以阅读文档以进一步了解。

PE 文件是否使用 IMAGE_BASE_RELOCATION 来工作?

IMAGE_BASE_RELOCATION 是一种数据结构,可以表示为:

typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress;
    DWORD   SizeOfBlock;
} IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION;

PE 文件不使用 IMAGE_BASE_RELOCATION 结构来工作,PE 加载器(动态链接器)使用它来构建重定位表。如果您想了解有关重定位表的更多信息,可以阅读主题。

JosephH 说:

“如果你的程序频繁访问全局变量和常量,它将有一个巨大的重定位表,因为加载器必须更新的地方太多了”加载器如何使用重定位表并更新它?

由于您在标题问题中使用了 .reloc,我将在 .reloc 部分向您解释重定位信息。此部分包含基址重定位的信息,这意味着如果无法加载所需文件的首选地址(因为已经映射到它的某些内容),则使用该信息重定位的指令或变量。

Loader 使用虚拟地址、偏移量和加载地址来解析和重定位,这是调整地址的另一种方式。