我最近一直在研究 Window 的 PE 格式,我注意到在大多数示例中,
人们倾向于设定ImageBase
中的偏移值optional header
到一些不合理的高的东西,比如0x400000
.
什么可能使它不利not在偏移处映射图像0x0
?
首先,这不是 Windows 或 PE 文件格式的默认设置,而是当您使用链接器的 /BASE 选项链接 EXE 时的默认设置。 DLL 的默认值是 0x10000000。
选择 /BASE:0 是一个糟糕的选择,任何程序都不能在该基地址上运行。地址空间的前 64 KB 被保留,永远无法映射。主要是为了捕获空指针解除引用错误。并扩展到 64KB,以捕获以 16 位开始并重新编译为 32 位的程序中的指针错误。
为什么默认值是 0x40000 而不是 0x10000,这也是一个历史事故,并且至少可以追溯到 Windows 95。Windows 95 为“16 位/MS-DOS 兼容性区域”保留了前 4 MB 的地址空间。我不太记得了,Windows 9x 的 16 位 VM 实现与 NT 非常不同。您可以在这篇古老的文章中阅读更多相关内容知识库文章 http://support.microsoft.com/kb/125691。现在它肯定不再相关了,64 位操作系统将很容易在 0x010000 和 0x400000 之间的空间中分配堆内存。
更改 EXE 的 /BASE 选项没有任何意义。然而,有lots将其更改为 DLL 的要点。如果它们不重叠,则不必重新定位,它们不会占用分页文件中的任何空间,并且可以在进程之间共享,它们会更有效。甚至还有一个 SDK 工具,因此您可以在构建后更改它,rebase.exe
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)