在 Delphi 中,Image Base链接器选项默认为00400000。
根据帮助:
指定已编译映像的首选加载地址。此值通常仅在编译 DLL 时更改。默认 = 400000
对EXE的修改没有影响吗?会有什么效果?地址是相对于每个进程的吗?
在 Delphi 中,Image Base链接器选项默认为00400000。
根据帮助:
指定已编译映像的首选加载地址。此值通常仅在编译 DLL 时更改。默认 = 400000
对EXE的修改没有影响吗?会有什么效果?地址是相对于每个进程的吗?
如果可能,操作系统加载程序会在其首选加载地址( Image Base )处加载可执行映像(EXE 和 DLL,以及其他伪装成 DLL 的东西,例如 BPL 和 OCX);如果虚拟地址空间的该区域被保留用于其他目的(另一个图像、线程堆栈、堆分配),则 OS 加载程序将重新定位该图像。重定位映像涉及将其放在地址空间中的其他位置,然后获取新加载地址和首选加载地址之间的差异,并将此差异添加到映像内的每个重定位修复中。重定位修正指向可执行映像中代码或数据引用自身的所有位置,例如代码从全局变量加载值,或绝对跳转到其他例程。
因为重定位涉及到 OS 修改镜像数据的内存版本,耗时更长,占用更多 I/O 并提交更多页面(需要将整个有重定位的镜像分页),以及 OS 虚拟内存子系统将无法与已加载相同可执行映像的其他进程共享加载的映像(因为它在内存中会有所不同)。因此,最好避免在加载时重新定位。
可执行映像的首选地址是$00400000
32 位 Windows 上的约定,而其他 DLL(包括 OS DLL)依赖此约定,因为没有可能与主可执行文件一致的默认加载地址。因此,他们避免了搬迁。事实上,重定位 EXE 映像的情况非常罕见,以至于通常可以从 EXE 映像中删除重定位数据而不会造成任何伤害。
为 DLL 更改它是有意义的,以避免与任何默认 OS DLL 以及通常随 DLL / EXE 一起提供的任何其他 DLL 发生冲突。由于为 EXE 更改它会增加操作系统需要重新定位 DLL 的机会,因此不建议更改 EXE 加载地址。
像UPX这样的可执行映像压缩器尤其不推荐用于 DLL,以及可能运行许多实例的可执行文件,因为内存中解压缩的作用类似于重定位,以防止内存中映像在多个进程之间共享。
除非您正在做一些非常低级的脏黑客,否则更改 EXE 的图像库几乎是无用的。
地址是相对于每个进程的吗?
是的,每个进程都有自己的地址空间。