Подскажите эффективный способ поиска оверлеев у EXE/PE файла. Понимаю, что вся задача сводится к определению размера образа PE. Складывать физические размеры всех секций? Или есть методы лучше?
Я проверял так : 1. Проходим по списку всех секций. 2. Для каждой секции считаем адресс последнего байта ( Размер + Виртуальный Адрес округленные в верхнюю сторону ). 3. Максимум полученных значений - размер PE.
Forever, виртуальный адрес??? разве не физические размер/адрес надо проверять? П.С.: если уж и сравнивать виртуальные параметры, то достаточно сравнить только последнюю секцию - в РЕ секции должны идти только в таком порядке, в каком они будут в памяти. Физически да, они могут быть перемешаны, но виртуально порядок должен быть сохранен
Пардон, глупость сказал. Нужно складывать размер и указатель на данные округленные до выравнивания файла. Код (Text): ULONG CountPeSize32( LPVOID Base ) { PIMAGE_NT_HEADERS32 NtHeader = ( PIMAGE_NT_HEADERS32 )( ( LONG_PTR )Base + ( ( PIMAGE_DOS_HEADER )Base )->e_lfanew ); PIMAGE_OPTIONAL_HEADER32 OptionalHeader = ( PIMAGE_OPTIONAL_HEADER32 )&NtHeader->OptionalHeader; DWORD MaxOffset = 0; PIMAGE_SECTION_HEADER SectionHeader; WORD NumberOfSections, i; NumberOfSections = NtHeader->FileHeader.NumberOfSections; SectionHeader = IMAGE_FIRST_SECTION( NtHeader ); for ( i = 0; i < NumberOfSections; ++ i ) { if ( MaxOffset < SectionHeader->SizeOfRawData + SectionHeader->PointerToRawData ) { MaxOffset = SectionHeader->PointerToRawData + ALIGN_UP( SectionHeader->SizeOfRawData, OptionalHeader->FileAlignment ); } ++ SectionHeader; } return MaxOffset; } // CountPeSize32() Это пример кода, который вычисляет размер PE файла.