为什么重定位表的所有元素都有一个额外的偏移量?

0 windows dll x86 relocation portable-executable

问题是将可移植可执行映像加载到随机地址。

我们以kernel32.dll为例,加载于0x75A00000。

我可以看到在图像的偏移 0x10e15 处有一条汇编指令,这取决于图像所在的位置。

地址:75A10E13 字节:8B 35 18 03 AE 75 命令:MOV ESI,DWORD PTR DS:[75AE0318]

事实证明,通过启动可执行文件,我们必须告诉系统我们需要重定位到这个地址。

系统查看可执行文件中的重定位表,并看到以下内容: 基本重定位表

为了获取要移动的第一个元素的绝对地址,我执行以下操作:将虚拟地址添加到图像的地址,然后将块的第一个元素添加到结果数字。

0x75A00000 + 0x10000 + 0x3E15 = 75A10E15

这是一个很好的数字,但总是比我预期多 0x3000。我只需减去 0x3000 就可以了。请帮我找到答案,x86 的 0x3000 从哪里来?

vit*_*oft 7

链接文件时,可移植可执行文件中的重定位已解决。您所指的基重定位表具有不同的功能:当无法在链接器指定的 首选ImageBase地址(通常为 0x0040_0000 )加载 PE 时,Windows 加载程序将使用它。MS Windows 附带的动态加载库链接到每个核心 DLL 不同的ImageBase地址,并选择不相互冲突,因此导入常用库组合的可执行文件不必重新定位它们。

您误解了基本重定位部分 .reloc的格式。PageRVABlockSize之后的那些 16 位字TypeOrOffset 的基本重定位类型编码在四个最高有效位中。 例如,转储 0x3E15 中的第一个TypeOrOffset条目具有类型 IMAGE_REL_BASED_HIGHLOW (3) 和偏移量 0x0E15,这是要添加到 PageRVA 的数字。