我有一个我构建的项目,用于检查Windows PE文件。在处理某些文件时,例如User32和Shell32,我注意到导出地址表中的条目为0.在导出地址表中有一个null(0)条目的目的是什么? (条目0不会解析为有效的虚拟地址)
仅供参考 - 使用像NikPEViewer和Dll Export Viewer这样的应用程序根本不会显示这些条目,DumpBin显示导出名称表和序号表中未包含的导出,但它会跳过空条目。
答案 0 :(得分:0)
我只有部分回应。 假设我们写下一个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集导出从ordinal @ 2700开始(空格[@ 2586,@ 2700]是保留的吗?)。但user32.dll一般不会导出已知(稳定)序数 - 所以它不能保留从版本到版本。所以我在DEF文件中所有直接设定序数的理由都不清楚