【问题标题】:what is the base relocation table in the PE file format?PE文件格式的基本重定位表是什么?
【发布时间】:2023-03-18 22:25:02
【问题描述】:

我在分析一个可执行文件的格式,我在image_optional_header找到了Base relocation table,这个base relocation table是什么?

【问题讨论】:

    标签: windows visual-c++ reverse-engineering malware malware-detection


    【解决方案1】:

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

    这是关于 PE 文件的 microsoft 规范: 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

    【讨论】:

    • 两个链接都坏了:(。你能更新链接吗?
    • @ImtiazShakilSiddique 两个链接都已更新,一个指向 web.archive.org,另一个指向文件的镜像。
    【解决方案2】:

    有 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
    

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

    【讨论】:

      猜你喜欢
      • 2012-09-07
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多