Я работаю над парсером PE, просто для обучения. Как сказано в документе, заголовок первого раздела должен быть сразу после OptionalHeader, но в моем случае у меня много пустых данных перед первым заголовком. Вот мой код для расчета, где должен быть первый раздел:
IMAGE_NT_HEADERS* inth = get_nt_headers(buffer);
DWORD optional_headers_size = inth->FileHeader.SizeOfOptionalHeader;
DWORD calculated_ptr = (DWORD)inth + optional_headers_size;
printf("Pointer to IMAGE_NT_HEADERS: %p\n", inth);
printf("Size of optional headers: %x\n", optional_headers_size);
printf("Pointer to first section header: %p\n", calculated_ptr);
BYTE* pointer = (BYTE*)calculated_ptr;
Когда я перебираю «указатель», я вижу много данных, допускающих значение NULL, поэтому это не тот раздел, который мне нужен. PEView или Heexplorer тоже показывают пустые данные. Почему это? Эта обнуляемая часть данных занимает около 24 байт.
Приложение, которое я анализирую, представляет собой простой HelloWorld.exe.
Меня смущает еще одно.
В FileHeader я установил 13 разделов, но если я взгляну на PEView в IMAGE_OPTIONAL_HEADER, я увижу 16 разделов, но последние 3 раздела имеют какие-либо назначенные значения, что означает, что RVA и размер установлены на 0. Эти разделы: DELAY_IMPORT_DESCRIPTORS, CLI_HEADER, но у последнего нет имени.
Я подсчитал, что размер этих трех последних разделов составляет 24 байта. Это точно так же, как я упоминал ранее.
Итак, как я могу вычислить, где именно находится первый IMAGE_SECTION_HEADER?
Проблема решена, но я не уверен в своем решении.
DWORD padding = (IMAGE_NUMBEROF_DIRECTORY_ENTRIES - inth->FileHeader.NumberOfSections) * sizeof(IMAGE_DATA_DIRECTORY);
DWORD calculated_ptr = (DWORD)inth + padding + optional_headers_size;
SizeOfOptionalHeader
) к этому указателю. как это сделать? например, путем временного приведения кULONG_PTR
илиBYTE*
. 15.08.2018