1

我有一个检查 Windows PE 文件的项目。在处理某些文件(例如 User32 和 Shell32)时,我注意到导出地址表中有条目为 0。导出地址表中有一个空 (0) 条目的目的是什么?(条目 0 不会解析为有效的虚拟地址)

仅供参考 - 使用 NikPEViewer 和 Dll Export Viewer 等应用程序根本不会显示这些条目,DumpBin 会显示未包含在导出名称表和序号表中的导出,但它会跳过空条目。

4

1 回答 1

1

我只有部分回应。假设我们编写下一个 exports.def (win 8.1 x64 user32.dll) 文件:

EXPORTS
...
wvsprintfW          @2412 
NtUserDelegateInput @2503 NONAME
...

并且在 @2412 和 @2503 之间没有任何序数 - 所以链接器,为了保留您的序数,需要在导出地址表中生成 90 个零条目。所以链接器的原因很清楚 - 它符合我们的指定。但这将我们重定向到另一个问题 -编写这种 def 文件的原因是什么? 认为这与从一个版本到另一个版本重写这个文件有某种关系。在 win7 x64 的 user32.dll 中说 - 最高序号是 @2502(与 NtUserDelegateInput @2503 相比)

在 win 10 x64 user32.dll 中可以查看:

...
NtUserUpdateWindowTrackingInfo  @2585 NONAME

; interval [@2586, @2700) is zero

GetDialogBaseUnits96            @2700 NONAME

; @2701 is zero

EnablePerMonitorMenuScaling     @2702 NONAME

新的 API 集导出从序号 @2700 开始(空间 [@2586, @2700) 已保留?)。但 user32.dll 通常不会导出已知(稳定)序数 - 所以它不能在版本之间保留。所以我不清楚DEF文件中所有直接设置序数的原因

于 2016-07-09T15:30:33.393 回答