首页 > 解决方案 > 虚拟地址中的 ImageBase 地址之前有什么?

问题描述

我从Microsoft 文档中知道,对于 64 位图像,图像基址设置为 0x140000000,它是可执行文件首次加载到内存中的基址。

所以我的问题如下

  1. 0x140000000 地址和虚拟地址第一页的开始 (0x0000000) 之前的内容
  2. 可执行文件首先加载是什么意思?是程序的入口点(当然不是main函数)还是别的什么

标签: windowsportable-executable

解决方案


我不知道 64 位默认值如此之高的技术原因,也许只是为了确保您的应用程序没有模块中的数据/代码的 32 位指针截断错误?而且需要注意的是,这个默认值来自微软的编译器,Windows 本身会接受一个较低的值。32 位应用程序的默认值是 0x00400000,这有实际的硬件和技术原因

在大多数操作系统中,从 0 开始的第一页是禁区,以防止取消引用 NULL 指针时出现问题。前几兆字节可能映射有 BIOS/固件或其他遗留的东西。

通过第一次加载,这意味着加载器会将文件映射到从该地址开始的内存中。首先是 MZ 部分(DOS 标头和存根代码)和PE 标头。之后是 PE 标头中列出的各个部分。

现在大多数应用程序都在使用 ASLR,因此基地址将是随机的,而不是 PE 中列出的首选地址。ntdll 和 kernel32 在 exe 之前映射,因此如果您选择它们​​的基地址,您也将被重新定位。


推荐阅读