在 Dll 的 .edata 部分中指定的 Dll 名称的作用

Role of the Dll name specified in the .edata section of a Dll

Dll 的 .edata 部分除了单独的函数导出规范外,还包含一个指定 Dll 名称的字段(参见 this reference,字段 "Name RVA")。然而,在我能找到的所有文档中,导入的解析总是引用 Dll 文件名和路径,当然这些可能与本条目中指定的 "recorded" Dll 名称不同。

此字段的用途是什么?对导入的解析有什么作用吗?

调试原始内存时,加载 DLL 的文件名(和路径)可能不容易获得,导出 table 中的这个字段是识别特定内存区域的便捷方法被特定的 DLL 占用。

除了足以作为包含它的理由的调试值之外,Windows 加载程序还可以在递归解析导入时使用此字段来确定特定模块是否已加载或作为系统的安全完整性检查DLL 等。即使在 Windows 的现代版本中完全忽略此字段的情况下,PE/COFF 规范至少提供了这种可能性。

直接回答你的问题,这个字段在导入的解析中没有作用——至少以前没有。这可能在 Windows 的最新版本中已更改,但如果它应用于非系统 DLL,则会破坏向后兼容性。我的猜测是,对于任何类型的导入解析,此字段都将被忽略。

为了好玩,我 运行 使用以下标准在 Windows 7(64 位)机器上使用 32 位 PE 模块进行了快速测试:

  • 尝试加载通过其模块导入部分引用私有 DLL 的测试 EXE
  • 在私有 DLL 的导出目录中,我将 Name 字段十六进制编辑为一个不同的名称以及一个空字符串

当我启动测试 EXE 时,两个版本的私有 DLL 都成功加载,只要测试 EXE 的引用导入部分具有正确的文件名,DLL 在启动时恰好被命名。