PE文件重定位概念学习

PE文件基址重定位,Base Relocation。
程序编译时每个模块有一个优先加载地址ImageBase,这个值是连接器给出的;因此连接器生成的指令中的地址是在假设模块被 加载到ImageBase前提之下生成的;
那么一旦程序没有将模块加载到ImageBase时,那么程序中 的指令地址就需要重新定位。
这是重定位的基本概念。

基址重定位项,加载器就是利用它来知道模块是否按预期的 位置加载,哪些指令是需要修改的。
加载器也是通过数据目录来定位【基址重定位项】,【基址重定位项】被包装 为一系列连续区段,每一个区段来描述一个4K PAGE(也就是一页)的重定位信息,它们以一个IMAGE_BASE_RELOCATION结构作为 开始。

在PE文件中,基址重定位表一般放在一个单独的 ".reloc" 区,可以通过IMAGE_OPTIONAL_HEADER 中 的DataDirectory[5] 查看 基址重定位表 的RVA。

也就是,可选头中包含数据目录表,数据目录表的第6项,是重定位表的偏移;

数据目录表的说明见,
https://blog.csdn.net/bcbobo21cn/article/details/115035483

IMAGE_BASE_RELOCATION 结构:
    typedef struct _IMAGE_BASE_RELOCATION {
        DWORD   VirtualAddress;
        DWORD   SizeOfBlock;
    //  WORD    TypeOffset[];
    } IMAGE_BASE_RELOCATION;
    typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;

下面先用010 Editor来了解一下;打开的exe是记事本,notepad.exe;

看数据目录表的第6项,是重定位表的偏移;

如下图,NT头之后是节头,节头之后是节数据; 节数据中包含.reloc节;

在工具的最后,又列出重定位表,其中包含数个IMAGE_BASE_RELOCATION结构;  这个 BASE_RELOCATION_TABLE应该是包含在.reloc节中的;

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/115038116