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文件的地址导出表中出现空条目的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章