SizeOfHeaders
не используется для определения положения таблицы разделов, даже если они могут совпадать в некоторых файлах (но я этого не ожидаю).
Вот как это делается в Windowsзаголовки (и, следовательно, системный загрузчик):
#define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER) \
((ULONG_PTR)(ntheader) + \
FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) + \
((ntheader))->FileHeader.SizeOfOptionalHeader \
))
Обратите внимание, что фактическое значение SizeOfOptionalHeader
не проверяется;он может быть очень большим или даже отрицательным - некоторые вредоносные программы используют его, чтобы обмануть инструменты анализа.
См. здесь для получения дополнительной информации и еще более неприятных уловок.