我正在审查有关可移植可执行文件(EXE文件)的Microsoft规范。特别是,我正在审查.edata(导出数据)部分。这是what the specification says about the edata section:
名为.edata的导出数据部分包含有关其他图像可通过动态链接访问的符号的信息。导出的符号通常在DLL中找到,但DLL也可以导入符号。
非DLL文件可以有edata部分吗?具体来说,编译和链接后,C程序能否生成包含edata部分的EXE文件?如果是的话,你会展示一个简单的C程序,在编译和链接之后会产生一个包含edata部分的EXE文件吗?
任何PE映像文件都可以包含导出表,无论它是EXE还是DLL。但是,导出表不一定包含在.edata
部分中。例如,在.rdata
部分中查看导出表是常见的。
要找到导出表,应使用“导出表”数据目录,而不是完全依赖“节表”。
以下是一个示例C程序,在编译时,将生成带有导出表的EXE。但是,它可能不会被放置在.edata
部分内(并且EXE可能根本没有.edata
部分)。
#include <stdio.h>
__declspec(dllexport) void some_func(void)
{
printf("Hello\n");
return;
}
int main()
{
return 0;
}
当我在我的系统上使用Visual Studio 2017编译此程序,并在生成的EXE上运行dumpbin /HEADERS /EXPORTS
时,我看到以下内容:
...
SECTION HEADER #3
.rdata name
2A94 virtual size
19000 virtual address (0000000140019000 to 000000014001BA93)
2C00 size of raw data
7E00 file pointer to raw data (00007E00 to 0000A9FF)
0 file pointer to relocation table
0 file pointer to line numbers
0 number of relocations
0 number of line numbers
40000040 flags
Initialized Data
Read Only
...
Section contains the following exports for SampleApp.exe
00000000 characteristics
FFFFFFFF time date stamp
0.00 version
1 ordinal base
1 number of functions
1 number of names
ordinal hint RVA name
1 0 0001108C some_func = @ILT+135(some_func)
这证实了在这种情况下出口表被放入.rdata
部分。