【问题标题】:PE Loading: What to do with resource section?PE 加载:如何处理资源部分?
【发布时间】:2019-03-25 14:55:07
【问题描述】:

我正在研究 PE 文件格式以及 windows 如何加载它们。我已经知道大多数部分以及它们如何在内存中加载/映射。但我不知道资源部分会发生什么,因为那里的所有地址似乎都是连续的,似乎不需要任何更改。

我制作了一个测试加载器,它执行基本加载,但目标 .exe 文件中有资源,它们永远不会被加载。

【问题讨论】:

  • 程序尝试加载资源时不是按需发生吗?
  • 不需要任何特殊处理。 @DavidHeffernan - 不,资源在加载时映射到内存。 LoadResource实际上并没有加载任何数据,而是返回内存中已经映射资源的地址。
  • @RbMm 那是的,虚拟内存系统在第一次访问时会在页面错误时加载数据
  • @DavidHeffernan 它可能不需要任何手动映射如果 PE 在默认地址 (0x00400000) 加载。但由于 PE 可以手动加载任何虚拟地址,LoadIcon 和朋友将永远无法在预期位置找到资源。
  • 你说的不是映射。你说的是搬家。资源不需要搬迁。您需要了解映射是什么。

标签: windows winapi portable-executable


【解决方案1】:

根据PE Format

重要的是要认识到PE文件不会作为单个内存映射文件加载到内存中。Windows加载器(也称为PE加载器)遍历PE文件并决定文件的哪一部分被映射。这种映射方法将文件的较高偏移量映射到较高的内存地址。 PE文件结构在磁盘和内存中基本相同,但加载到内存时并没有完全复制。 Windows 加载程序决定加载哪些部分以及不需要加载哪些部分。而且,由于磁盘对齐和内存对齐的不一致,PE文件加载到内存中的分布与PE文件在磁盘上的分布会有所不同。

这是一张图片:应用程序加载到内存中

Memory mapping picture

基地址值由PE文件自己设置。根据默认设置,Visual C++建立的EXE文件的基地址为00400000h,DLL文件的基地址为10000000h。但是,您可以在创建应用程序时更改此地址,方法是在连接到应用程序时使用连接器/BASE 选项,或者在链接后通过 REBASE 应用程序设置它。

另外,这个问题和你问的类似。你可以参考一下。

When Resources of a PE file are loaded

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2011-05-05
    相关资源
    最近更新 更多