【发布时间】:2019-05-14 14:34:23
【问题描述】:
我有一个用于 Windows 的 64 位 hello world 应用程序。它是使用平面汇编程序(fasm)创建的。我没有源代码了,但这是一个非常简单的例子,它调用:
- MessageBoxA()
- 退出进程()
我在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 部分。
【问题讨论】:
-
在技术上是可行的,导入可以通过名称或序数(一个简单的数字)来定义。使用序数时不需要查找表。这是不寻常的,但是您不能再向我们展示您的导入语句,并且对链接器只字未提。最好不要纠结于此。
-
澄清事情:这不是“按名称导入”与“按序号导入”。 “导入查找表”和“导入地址表”中的每个条目都可以是指向名称或序数的指针(取决于是否设置了最后一位)。我的问题是:应该有两个具有相同值的表(根据 MS 文档),但只有“导入地址表”存在。
-
我怀疑您弄错了,或者 CFF Explorer 向您显示了错误的数据。导入目录表中应该有三个条目,一个用于 USER32.DLL,一个用于 KERNEL32.DLL,一个空的,所有零值标记表的结尾。这三个条目中的每一个都有自己的“导入查找表 RVA”和“导入地址表 RVA”值。
标签: assembly 64-bit portable-executable fasm