我正在研究PE文件格式以及Windows如何加载它们。我已经了解了大多数部分,以及它们如何在内存中加载/映射。但是我不知道资源部分会发生什么,因为其中的所有地址似乎都是顺序的,并且似乎不需要任何更改。
我已经制作了一个测试加载器,可以进行基本加载,但是目标.exe文件中包含资源,并且它们永远都不会加载。
答案 0 :(得分:2)
重要的是要认识到PE文件没有作为单个内存映射文件加载到内存中。Windows加载程序(也称为PE加载程序)会遍历PE文件并确定要映射文件的哪一部分。此映射方法将文件的较高偏移量映射到较高的内存地址。 PE文件结构在磁盘和内存中基本相同,但是在加载到内存中时不会完全复制。 Windows加载程序决定要加载的部分以及不需要加载的部分。此外,由于磁盘对齐方式和内存对齐方式不一致,因此加载到内存中的PE文件的分布将与磁盘上PE文件的分布有所不同。
这是一张图片:应用程序已加载到内存中
基址值由PE文件本身设置。根据默认设置,由Visual c ++建立的EXE文件的基地址为00400000h,而DLL文件的基地址为10000000h。但是,在创建应用程序时,可以通过连接到应用程序时使用connector / BASE选项或在链接后通过REBASE应用程序对其进行设置来更改此地址。
此外,该问题与您提出的问题类似。您可以参考它。