在windows pe文件的地址导出表中空条目的原因是什么?

时间:2016-07-08 15:49:15

标签: dll export portable-executable user32 shell32

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

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

1 个答案:

答案 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文件中所有直接设定序数的理由都不清楚