windows pe文件的地址导出表中出现空条目的原因是啥?

Posted

技术标签:

【中文标题】windows pe文件的地址导出表中出现空条目的原因是啥?【英文标题】:What is the reason for null entries in address export table of a windows pe file?windows pe文件的地址导出表中出现空条目的原因是什么? 【发布时间】:2016-11-11 06:24:38 【问题描述】:

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

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

【问题讨论】:

【参考方案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 文件中所有直接设置序数的原因

【讨论】:

以上是关于windows pe文件的地址导出表中出现空条目的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取PE到导出表中的函数地址

PE 导出表

PE 导出表

关于PE盘导出window注册表的问题

开机出现:windowS 启动配置数据(BCD)存储文件包含一些无效信息

请问啥是WINDOWS下的PE病毒 ?