4

我正在分析一个可执行文件的格式,我在 中找到了基本重定位表image_optional_header,这个基本重定位表是什么?

4

2 回答 2

8

重定位表是一个查找表,列出了当文件加载到非默认基地址时需要修补的 PE 文件的所有部分。

这是关于 PE 文件的微软规范: https://github.com/tpn/pdfs/blob/master/Microsoft%20Portable%20Executable%20and%20Common%20Object%20File%20Format%20Specification%20-%201999%20( pecoff).doc

还有一篇好文章:http ://web.archive.org/web/20200806080448/http://www.csn.ul.ie/~caolan/pub/winresdump/winresdump/doc/pefile2.html

于 2015-08-13T07:54:52.503 回答
4

有2个重定位表。COFF 重定位表,仅存在于 .obj 文件中,包含访问目标文件中本地/外部链接符号的所有指令的 rip 相对偏移字节的地址,并与符号表中的索引配对它引用的符号。节的 COFF 重定位表由节表中 COFF 头之后的节的节头指向。

typedef struct {
  unsigned long  r_vaddr;   /* address of relocation      */
  unsigned long  r_symndx;  /* symbol we're adjusting for */
  unsigned short r_type;    /* type of relocation         */
} RELOC;   //COFF relocation table entry

对于未在目标文件中定义的符号,它将是符号表*UNDEF*中的一个条目(节号将是节的),并且与节的偏移量始终为 0。对于已定义的符号,它将有一个正确的部分和到符号表中的部分的正确偏移量,如果符号名称不能内联到字符串表条目中,它指向字符串表中符号名称的索引。链接器将对静态符号使用这些节+偏移量以及它包含的外部符号的节+偏移量来计算从符号末尾到节+偏移量的正确偏移量。然后它将地址替换为该值,即它替换或*UNDEF**UNDEF*r_vaddrr_vaddrcall -1call 0具有正确的相对值

基本重定位表用于运行时,内置在 .obj 文件中,并合并到最终的 .exe 中,并在 PE 头中由 指向,BaseRelocationTable通常位于.reloc. 如果图像加载的地址不是链接器选择并放置在 PE 标头中的 ImageBase,则需要应用基本重定位表中的补丁。基本重定位表由基本重定位块组成,每个块描述一个 4 KiB 页面。块头包含页的 RVA 和块结构的大小。该块的其余部分包含一个 2 字节字段的数组,其中 2 个字节的前 4 位指示重定位类型,后 12 位指示需要应用重定位的页 RVA 的偏移量。这将是指令中地址字段的偏移量。为了重定位,加载器只需计算 ImageBase 与 PEB 中进程的实际基地址之间的差异,并将其与地址相加/减去。不会的 基址重定位并不多,因为代码中的大多数符号使用寄存器间接 rip 相对寻址(用于 mov 和 dllimport 调用)和直接相对寻址(用于常规调用)。在 COFF 对象中,相对地址和绝对地址都需要重定位,在 PE 可执行文件中,只有绝对地址需要重定位。

typedef struct _IMAGE_BASE_RELOCATION {
    DWORD   VirtualAddress; //Page RVA
    DWORD   SizeOfBlock;
    WORD    TypeOffset[1];
} IMAGE_BASE_RELOCATION;   //base relocation table
于 2020-05-23T11:37:04.207 回答