Любой файл образа 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 в моей системе и запускаю dumpbin /HEADERS /EXPORTS
в полученном EXE-файле, я вижу следующее:
...
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
.