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 从哪里来?
链接文件时,可移植可执行文件中的重定位已解决。您所指的基重定位表具有不同的功能:当无法在链接器指定的 首选ImageBase地址(通常为 0x0040_0000 )加载 PE 时,Windows 加载程序将使用它。MS Windows 附带的动态加载库链接到每个核心 DLL 不同的ImageBase地址,并选择不相互冲突,因此导入常用库组合的可执行文件不必重新定位它们。
您误解了基本重定位部分 .reloc的格式。PageRVA和BlockSize之后的那些 16 位字TypeOrOffset 的基本重定位类型编码在四个最高有效位中。
例如,转储 0x3E15 中的第一个TypeOrOffset条目具有类型 IMAGE_REL_BASED_HIGHLOW (3) 和偏移量 0x0E15,这是要添加到 PageRVA 的数字。
| 归档时间: |
|
| 查看次数: |
220 次 |
| 最近记录: |