我刚刚了解到
ImageBase
是以 PE 格式指定的,操作系统会将其加载到 .EXE
的确切位置,那么问题来了:
如果两个
.EXE
需要相同的 ImageBase
位置怎么办?
对于 2 个 EXE,它们具有完全不同的地址空间。每个可执行文件都有自己的空间。 这意味着,每次执行 EXE 时,它都会被分配自己独立的
4GB
(在 32 位系统上,虽然进程只能使用其中的一部分,但其余部分归内核)有价值的地址空间。它是虚拟地址空间。它与你的物理记忆不同。
所以,不存在冲突。
从技术上讲,PE 几乎可以在任何地方加载,但默认
ImageBase
是0x400000
。
现在,假设您有一个 EXE,它加载了几个 DLL(它们恰好具有相同的 ImageBase)...在这种情况下,第一个 DLL 加载正常,第二个 DLL 被重新定位(或“重新基址”)。每个 DLL 都有一个
.reloc
部分,其中包含有关更新代码中引用的数据。
您可以使用 Process Explorer 查看任何正在运行的应用程序(及其 DLL)的 ImageBase 和 Base 地址的值。根据这些值,您可以查看是否已进行变基。