Еще раз о таблице импорта

Тема в разделе "WASM.WIN32", создана пользователем Bubon, 2 окт 2004.

  1. Bubon

    Bubon New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2004
    Сообщения:
    7
    Проясните пожалуйста ситуацию с таблицей импорта. Во всех описаниях PE файлов написано, что таблица импорта (не берем в счет таблицу диапазонного импорта и отложенного) находится по адресу, указанному во втором элементе DATA DIRECTORY. Причем это RVA адресс. Вопрос стоит вот как: как получить RAW Offset на таблицу импорта?

    Если это делать как в статье Iczelion, то необходимо грузить файл в память (он проецирует файл в память). Так в общем то и у других(например Касперски). Но как тогда системный загрузчик считывает таблицу импорта (он то ведь грузит файл с диска)?

    Может быть я что-нибудь пропустил, если да то укажите где.
     
  2. Funbit

    Funbit Member

    Публикаций:
    0
    Регистрация:
    13 апр 2003
    Сообщения:
    92
    Адрес:
    Russia
    Bubon

    RVA транслируется в RAW Offset,

    используя таблицу секций



    я писал так:


    Код (Text):
    1.  
    2. RVA2RAW proc uses edi ecx edx ebx,lpPEHeader:DWORD, dwRVA:DWORD
    3.    
    4.     LOCAL nSections:WORD
    5.     LOCAL pSections:DWORD
    6.     mov edi, lpPEHeader
    7.     movzx ecx, word ptr [edi].IMAGE_NT_HEADERS.FileHeader.NumberOfSections
    8.     dec ecx
    9.     add edi, sizeof IMAGE_NT_HEADERS
    10.     mov pSections, edi
    11.     mov edx, dwRVA
    12.    
    13.     @TRY_NEXT:
    14.     mov edi, sizeof IMAGE_SECTION_HEADER
    15.     imul edi, ecx
    16.     add edi, pSections
    17.    
    18.     mov ebx, [edi].IMAGE_SECTION_HEADER.VirtualAddress
    19.     add ebx, [edi].IMAGE_SECTION_HEADER.Misc.VirtualSize
    20.     .if edx >= [edi].IMAGE_SECTION_HEADER.VirtualAddress && edx <= ebx
    21.         mov eax, edx
    22.         sub eax, [edi].IMAGE_SECTION_HEADER.VirtualAddress
    23.         add eax, [edi].IMAGE_SECTION_HEADER.PointerToRawData
    24.         ; check if it lay in the raw range
    25.         mov edx, [edi].IMAGE_SECTION_HEADER.PointerToRawData
    26.         add edx, [edi].IMAGE_SECTION_HEADER.SizeOfRawData
    27.         .if eax <= edx && eax >= [edi].IMAGE_SECTION_HEADER.PointerToRawData
    28.             jmp @RETURN
    29.         .endif     
    30.     .endif
    31.    
    32.     dec ecx
    33.     cmp ecx, -1
    34.     jnz @TRY_NEXT
    35.    
    36.     or eax, -1
    37.     @RETURN:
    38.     ret
    39.  
    40. RVA2RAW endp
    41.  
     
  3. Bubon

    Bubon New Member

    Публикаций:
    0
    Регистрация:
    2 окт 2004
    Сообщения:
    7
    Спасибо