Windows PE文件格式的基本重定位表是什么?

Windows PE文件格式的基本重定位表是什么?,windows,visual-c++,reverse-engineering,malware,malware-detection,Windows,Visual C++,Reverse Engineering,Malware,Malware Detection,我正在分析一个可执行文件的格式,我在image\u optional\u header中找到了基重定位表,这个基重定位表是什么?重定位表是一个查找表,列出了PE文件在非默认基地址加载时需要修补的所有部分 以下是有关PE文件的microsoft规范: 还有一篇好文章:有两个重定位表。COFF重定位表,它仅存在于.obj文件中,包含访问目标文件中本地/外部链接符号的所有指令的rip相对偏移字节的地址,并与符号表中指向其引用符号项的索引配对。该节的COFF重定位表由COFF头之后的节表中该节的节头指

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

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

以下是有关PE文件的microsoft规范:


还有一篇好文章:

有两个重定位表。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*
条目(节号将是
*UNDEF*
节),与
*UNDEF*
节的偏移量始终为0。对于已定义的符号,它将在符号表中具有正确的部分和到部分的正确偏移量,如果符号名称无法内联到字符串表条目中,它将指向字符串表中符号名称的索引。链接器将使用静态符号的这些节+偏移量以及它包含的外部符号的节+偏移量来计算从
r\u vaddr
的末尾到符号的节+偏移量的正确偏移量。然后用该值替换
r\u vaddr
处的地址,即用正确的相对值替换
call-1
call 0

基本重新定位表用于运行时,构建在.obj文件中,并合并到final.exe中,由PE标头中的
BaseRelocationTable
指向,通常位于
.reloc
中。如果图像加载的地址不是链接器选择并放置在PE头中的ImageBase,则需要应用base重定位表中的修补程序。基本重定位表由基本重定位块组成,每个块描述一个4kib页面。块标题包含页面的RVA和块结构的大小。块的其余部分包含一个2字节字段数组,其中2个字节的前4位表示重定位类型,后12位表示与页面RVA的偏移量,需要应用重定位。这将是指令中地址字段的偏移量。要重新定位,加载程序只需计算PEB中进程的ImageBase和实际基址之间的差异,并从地址中加/减。因为代码中的大多数符号使用寄存器间接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

两个链接都已断开:(.您可以更新链接吗?@imtiazshakilsidique两个链接都已更新,一个指向web.archive.org,另一个指向文件的镜像。