windows - 虚拟地址中的 ImageBase 地址之前有什么?
问题描述
我从Microsoft 文档中知道,对于 64 位图像,图像基址设置为 0x140000000,它是可执行文件首次加载到内存中的基址。
所以我的问题如下
- 0x140000000 地址和虚拟地址第一页的开始 (0x0000000) 之前的内容
- 可执行文件首先加载是什么意思?是程序的入口点(当然不是main函数)还是别的什么
解决方案
我不知道 64 位默认值如此之高的技术原因,也许只是为了确保您的应用程序没有模块中的数据/代码的 32 位指针截断错误?而且需要注意的是,这个默认值来自微软的编译器,Windows 本身会接受一个较低的值。32 位应用程序的默认值是 0x00400000,这有实际的硬件和技术原因。
在大多数操作系统中,从 0 开始的第一页是禁区,以防止取消引用 NULL 指针时出现问题。前几兆字节可能映射有 BIOS/固件或其他遗留的东西。
通过第一次加载,这意味着加载器会将文件映射到从该地址开始的内存中。首先是 MZ 部分(DOS 标头和存根代码)和PE 标头。之后是 PE 标头中列出的各个部分。
现在大多数应用程序都在使用 ASLR,因此基地址将是随机的,而不是 PE 中列出的首选地址。ntdll 和 kernel32 在 exe 之前映射,因此如果您选择它们的基地址,您也将被重新定位。
推荐阅读
- reactjs - Angular 9 中的 Auth 组件在控制台中给出如下错误。这可能是版本问题。如何解决这个问题?
- php - 将 Woocommerce variable.php 从表更改为 div
- arrays - 进行二分搜索时选择范围?
- elasticsearch - elasticSearch:一个字段上具有多个值的布尔查询
- css - 如何在多行上平等地放置多个 div?
- r - R:删除地图地图中的岛屿
- scale - Azure Kinect - 设置世界比例
- javascript - 根据对象中的其他值对对象的值求和
- php - 正则表达式仅获取不在标签之间的文本
- python - 如何用 Python 中的列表值替换字符串中的特定单词?