我应该更改我的Image Base吗?

时间:2009-05-14 00:53:47

标签: delphi dll executable

在Delphi中, Image Base 链接器选项默认为 00400000

根据帮助:

  

指定首选加载地址   已编译的图像。这个值是   通常只在编译时更改   DLL文件。默认值= 400000

在EXE上更改它没有效果吗?效果会是什么?地址是相对于每个流程的吗?

2 个答案:

答案 0 :(得分:28)

可执行映像(EXE和DLL,以及其他伪装DLL的东西,如BPL和OCX)由OS加载程序在其首选加载地址(映像库)加载(如果可能);如果虚拟地址空间的该区域被保留用于某些其他目的(另一个图像,线程堆栈,堆分配),则OS加载器将重新定位图像。重新定位图像涉及将其放在地址空间中的其他位置,然后将新加载地址与首选加载地址之间的差异加上并将此差异添加到图像内的每个重定位修正。重定位修正指向可执行映像中代码或数据引用自身的所有位置,例如从全局变量加载值的代码,或者对其他例程进行绝对跳转。

因为重定位涉及操作系统修改图像数据的内存中版本,所以需要更长时间,需要更多I / O并提交更多页面(整个图像需要重新定位重定位)和操作系统虚拟内存子系统将无法与已加载相同可执行映像的其他进程共享加载的映像(因为它将在内存中不同)。因此,希望在加载时避免重新定位。

可执行映像的首选地址是$00400000按照惯例在32位Windows上,而其他DLL(包括OS DLL)依赖于此约定,因为没有可能与主可执行文件重合的默认加载地址。因此他们避免搬迁。事实上,重新定位EXE图像的频率很低,因此重定位数据通常可以从EXE图像中剥离而不会造成伤害。

为DLL更改它是有意义的,以避免与任何默认的操作系统DLL和通常随DLL / EXE一起提供的任何其他DLL冲突。由于为EXE更改它会增加操作系统重新定位DLL的可能性,因此不建议更改EXE加载地址。

对于特别是DLL,以及可能有许多实例运行的可执行文件,不建议使用像UPX这样的可执行映像压缩程序,因为内存中的解压缩就像重定位一样,可以防止内存之间的映像共享多个过程。

答案 1 :(得分:3)

改变EXE的图像基础几乎是无用的,除非你做了一些非常低级别的黑客攻击。

  

地址是否与每个流程相关?

是的,每个进程都有自己的地址空间。