问题是如何将可移植的可执行映像加载到随机地址。
让我们以kernel32.dll为例,加载在0x75A00000。
我可以看到,在偏移量从图像0x10e15,有一个汇编程序指令,这取决于图像的位置。
地址: 75A10E13字节: 8B 35 18 03 AE 75命令: MOV ESI,DWORD PTR DS:75AE 0318
结果是,通过启动可执行文件,我们必须告诉系统我们需要重新定位到这个地址。
系统查看可执行文件中的重新定位表,并看到以下内容:基重定位表
要获得要移动的第一个元素的绝对地址,我执行以下操作:将虚拟地址添加到图像的地址,然后将块的第一个元素添加到结果数字中。
0x75A00000 + 0x10000 + 0x3E15 = 75A10E15
这是一个不错的数字,但总是比我预期的多0x3000。我只要减去0x3000就行了。请帮我找到答案,x86的0x3000从哪里来?
发布于 2022-08-07 15:20:18
可移植可执行文件中的重新定位在文件链接时得到解决。您所指的基重定位表有一个不同的功能:当PE无法在链接器(通常是0x0040_0000 )指定的首选ImageBase地址加载时,它由Windows使用。MS附带的动态加载库链接到每个核心DLL的ImageBase地址不同,并且选择不与其他库合并,因此导入通常的库组合的可执行文件不必重新定位它们。
您误解了基地搬迁段 .reloc的格式。遵循PageRVA和BlockSize的16位单词PageRVA和BlockSize的基重定位类型以编码,四个最重要的位。
例如,转储0x3E15中的第一个TypeOrOffset条目具有IMAGE_REL_BASED_HIGHLOW (3)和偏移量0x0E15,这是要添加到PageRVA中的数字。
https://stackoverflow.com/questions/73267391
复制相似问题