оверлеи в PE

Тема в разделе "WASM.RESEARCH", создана пользователем Lux_In_Tenebris, 31 окт 2008.

  1. Lux_In_Tenebris

    Lux_In_Tenebris New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2008
    Сообщения:
    13
    Подскажите эффективный способ поиска оверлеев у EXE/PE файла. Понимаю, что вся задача сводится к определению размера образа PE. Складывать физические размеры всех секций? Или есть методы лучше?
     
  2. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Я проверял так :
    1. Проходим по списку всех секций.
    2. Для каждой секции считаем адресс последнего байта ( Размер + Виртуальный Адрес округленные в верхнюю сторону ).
    3. Максимум полученных значений - размер PE.
     
  3. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Forever, виртуальный адрес??? разве не физические размер/адрес надо проверять?

    П.С.: если уж и сравнивать виртуальные параметры, то достаточно сравнить только последнюю секцию - в РЕ секции должны идти только в таком порядке, в каком они будут в памяти. Физически да, они могут быть перемешаны, но виртуально порядок должен быть сохранен
     
  4. Ra!N

    Ra!N New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    111
    в инете можно найти много исходников, которые вытаскивают оверлей из PE
     
  5. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Пардон, глупость сказал. Нужно складывать размер и указатель на данные округленные до выравнивания файла.
    Код (Text):
    1. ULONG
    2. CountPeSize32(
    3.     LPVOID Base )
    4. {
    5.     PIMAGE_NT_HEADERS32 NtHeader = ( PIMAGE_NT_HEADERS32 )( ( LONG_PTR )Base + ( ( PIMAGE_DOS_HEADER )Base )->e_lfanew );
    6.     PIMAGE_OPTIONAL_HEADER32 OptionalHeader = ( PIMAGE_OPTIONAL_HEADER32 )&NtHeader->OptionalHeader;
    7.     DWORD MaxOffset = 0;
    8.     PIMAGE_SECTION_HEADER SectionHeader;
    9.     WORD NumberOfSections, i;
    10.  
    11.     NumberOfSections = NtHeader->FileHeader.NumberOfSections;
    12.     SectionHeader = IMAGE_FIRST_SECTION( NtHeader );
    13.     for ( i = 0; i < NumberOfSections; ++ i ) {
    14.         if ( MaxOffset < SectionHeader->SizeOfRawData + SectionHeader->PointerToRawData ) {
    15.             MaxOffset = SectionHeader->PointerToRawData + ALIGN_UP( SectionHeader->SizeOfRawData, OptionalHeader->FileAlignment );
    16.         }
    17.         ++ SectionHeader;
    18.     }
    19.     return MaxOffset;
    20. } // CountPeSize32()
    Это пример кода, который вычисляет размер PE файла.
     
  6. Lux_In_Tenebris

    Lux_In_Tenebris New Member

    Публикаций:
    0
    Регистрация:
    31 окт 2008
    Сообщения:
    13