我有一个用于Windows的64位hello world应用程序。它是使用平面汇编程序(fasm)创建的。我没有源代码了,但这是一个非常简单的示例,它调用:
我在PE编辑器(CFF Explorer)中打开了文件,然后看到:“导入目录表”中“导入查找表”的RVA为0x0。但是,“导入地址表” RVA存在,包含指向API名称的指针,Windows 10启动该程序不会产生任何投诉。
我的问题是:是否存在定义此类二进制文件的PE规范?其他编译器是否具有相同的行为?是PE +的东西吗?
从技术上讲,缺少“导入查找表”没什么大不了的,因为“导入地址表”中有相同的数据(尽管被PE加载程序覆盖了)。但是Microsoft文档(https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format#the-idata-section)没有涵盖此类.idata部分。
答案 0 :(得分:1)
我正在编写一些分析.EXE文件的工具,我也看到过此类.EXE文件。
您链接的Microsoft文档中提示了存在此类文件的原因:
导入查找表的RVA。 ...(在Winnt.h中使用了“特性”名称,但不再描述了此字段。)
对我来说,括号中的句子和“不再”一词意味着较旧的Windows版本使用“导入查找表的RVA”字段存储不同类型的信息,因此为这些Windows版本编写的.EXE文件具有没有导入查找表。
并且因为较新的Windows版本应该能够运行旧的可执行文件,所以最新的Windows版本似乎仍然接受使用该字段获取其他信息的可执行文件。
另一方面,由于Windows仍在此处接受零值,因此某些链接器或编译器仍在此字段中填充零。
但是,据我所知,只有32位版本的Windows使用此字段来存储不同类型的信息。如果是这样,则此字段设置为零的32位.EXE文件(为较早的Windows版本编写)应该是有效的。
这意味着Microsoft将来可能会禁用对该字段设置为零的64位.EXE文件的支持。这意味着将此字段设置为零的64位链接器或编译器存在错误。
答案 1 :(得分:0)
您正在查看本机映像(仅导入ntdll),已绑定了导入,或者正在延迟加载所有内容。或者您使用的浏览器无法处理PE32 +,因为它在可选标头中缺少字段。
编辑:我重新阅读了问题。如果您在导入表条目中查看时间戳,则该时间戳可能不为零,表示绑定的导入。