Winapi 我对PE文件的重新定位感到困惑

Winapi 我对PE文件的重新定位感到困惑,winapi,portable-executable,Winapi,Portable Executable,Wikipedia这样说关于重新安置: PE文件通常不包含与位置无关的代码。相反 它们被编译成一个首选的基址和所有的地址 编译器/链接器发出的消息提前修复。如果一个PE文件 无法在其首选地址加载(因为它已被占用) 通过其他方式),操作系统将重新设置其基础。这涉及 重新计算每个绝对地址并修改代码以使用 新的价值观。加载程序通过比较首选和实际值来实现这一点 加载地址,并计算增量值。然后将其添加到 内存新地址的首选地址 地点。基地重新定位存储在列表中,并根据需要添加, 到现有的内存位置 我不明白为什么

Wikipedia这样说关于重新安置:

PE文件通常不包含与位置无关的代码。相反 它们被编译成一个首选的基址和所有的地址 编译器/链接器发出的消息提前修复。如果一个PE文件 无法在其首选地址加载(因为它已被占用) 通过其他方式),操作系统将重新设置其基础。这涉及 重新计算每个绝对地址并修改代码以使用 新的价值观。加载程序通过比较首选和实际值来实现这一点 加载地址,并计算增量值。然后将其添加到 内存新地址的首选地址 地点。基地重新定位存储在列表中,并根据需要添加, 到现有的内存位置


我不明白为什么在
0x00400000
(默认首选基址)除了进程的基址之外还有其他任何东西。我的理解是,在虚拟内存中,进程有一个空内存空间的视图,它是其中唯一存在的东西。考虑到这一点,在进程开始之前会有什么呢?

事实上,在大多数情况下,当进程开始时,首选的基址没有问题!在某些情况下,如“进程空洞化”(一种应用程序替换内存中另一个应用程序的技术),首选基址是一个必须处理的重要问题。有关此问题与首选地址相关的更多(低级)技术详细信息,请参阅以下链接


事实上,在大多数情况下,当进程启动时,首选基址没有问题!在某些情况下,如“进程空洞化”(一种应用程序替换内存中另一个应用程序的技术),首选基址是一个必须处理的重要问题。有关此问题与首选地址相关的更多(低级)技术详细信息,请参阅以下链接


对于DLL来说很重要,DLL也是一个PE文件。在0x00400000加载EXE的日子已经过去了。这对DLL很重要,DLL也是一个PE文件。在0x00400000加载EXE的日子已经过去了。是的,这就是我所困惑的。我不相信进程会共享内存空间,那么从内存的角度来看,0x00400000是否总是对进程可用?ASLR是否不太可能在其首选基址上生成进程?是的,因为ASLR,人们不能再依赖于进程将在其首选基址上启动。我已经实现了您给我的链接中提供的代码。每当我运行它时,它都会一致地说源库是
0000000000 400000
,然后说目标库是
00007FF68CE20000
。你能解释一下为什么我会得到这个输出吗?是的,这就是我所困惑的。我不相信进程会共享内存空间,那么从内存的角度来看,0x00400000是否总是对进程可用?ASLR是否不太可能在其首选基址上生成进程?是的,因为ASLR,人们不能再依赖于进程将在其首选基址上启动。我已经实现了您给我的链接中提供的代码。每当我运行它时,它都会一致地说源库是
0000000000 400000
,然后说目标库是
00007FF68CE20000
。你能解释一下为什么我会得到这个输出吗?