Какая структура описывает блок PE-релоков?

Тема в разделе "WASM.WIN32", создана пользователем Bitfry, 19 июн 2006.

  1. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Прочёл несколько статьи Петрика из MSDN, посмотрел определения в VC, MASM'e, на форуме FASM'a и т.д. Так толком и не понял, где что. Есть вот такие структуры:
    Код (Text):
    1. IMAGE_BASE_RELOCATION STRUCT
    2.     VirtualAddress dd   ?
    3.     SizeOfBlock dd      ?
    4. IMAGE_BASE_RELOCATION ENDS
    5.  
    6. IMAGE_RELOCATION STRUCT
    7.     union
    8.         VirtualAddress dd   ?
    9.         RelocCount dd       ?
    10.     ends
    11.     SymbolTableIndex dd     ?
    12.     Type1 dw ?
    13. IMAGE_RELOCATION ENDS
    14.  


    Первая (IMAGE_BASE_RELOCATION), вроде бы, описывает директорию в PE-header'e, то есть как IMAGE_DATA_DIRECTORY.

    Получается:
    Код (Text):
    1.     VirtualAddress dd  ?; RVA таблицы блоков переназначений
    2.     SizeOfBlock dd      ?; количество байт в таблице
    3.  


    А IMAGE_RELOCATION походу дела только для объектных COFF-файлов, там ведь релоки другие.



    В PE теоретически должна быть структура самого блока из таблицы. Что-то вроде этого псевдо:
    Код (Text):
    1.  
    2. RELOCATION_BLOCK STRUCT
    3. PageRVA     dd   ?                 ; RVA страницы переназначений
    4. SizeOfBlock     dd ?                   ; количество байт в блоке
    5. TypeAndOffset   dw ? dup (?)      ; информация о переназначениях
    6. RELOCATION_BLOCK ENDS
    7.  


    Есть ли такая стандартная структура?

    Ещё в WinNT.h увидел вот такую хрень:
    Код (Text):
    1.  
    2. typedef struct _IMAGE_BASE_RELOCATION {
    3.     DWORD   VirtualAddress;
    4.     DWORD   SizeOfBlock;
    5. //  WORD    TypeOffset[1];
    6. } IMAGE_BASE_RELOCATION;
    7. typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION;
    8.  


    Но здесь вопрос, почему закомментирован TypeOffset?

    И вообще, название _IMAGE_BASE_RELOCATION дебильное =/.



    ЗЫ У меня большое желание писать исходник так: [EBX+4], будет проще, чем эти извраты от MS.
     
  2. yGREK

    yGREK New Member

    Публикаций:
    0
    Регистрация:
    25 июл 2005
    Сообщения:
    5
    Адрес:
    Ukraine
    Из pe.txt от LUEVELSMEYER



    The relocation directory is a sequence of chunks. Each chunk contains

    the relocation information for 4 KB of the image. A chunk starts with a

    'IMAGE_BASE_RELOCATION' struct. It consists of 32 bits 'VirtualAddress'

    and 32 bits 'SizeOfBlock'. It is followed by the chunk's actual

    relocation data, being 16 bits each.

    The 'VirtualAddress' is the base RVA that the relocations of this chunk

    need to be applied to; the 'SizeOfBlock' is the size of the entire chunk

    in bytes.

    The number of trailing relocations is

    ('SizeOfBlock'-sizeof(IMAGE_BASE_RELOCATION))/2

    The relocation information ends when you encounter a

    IMAGE_BASE_RELOCATION struct with a 'VirtualAddress' of 0.
     
  3. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    yGREK

    Спасибо. Примерно так писал и Петрик, Мне просто показалось, что это ошибка.

    Но если уж все так считают, пусть будет так.



    Тогда другой вопрос.

    К инфе в DataDirectory из IMAGE_OPTIONAL_HEADER32 "правильнее" обращаться так:
    Код (Text):
    1.  
    2.     lea EBX, [EBX+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory.VirtualAddress+size of.IMAGE_DATA_DIRECTORY*IMAGE_DIRECTORY_ENTRY_BASERELOC]
    3.  
    4.     mov EAX, [EBX+IMAGE_DATA_DIRECTORY.VirtualAddress]
    5.     mov EDX, [EBX+IMAGE_DATA_DIRECTORY. isize]
    6.  


    И не зависит от того, что это, директория релоков или импорта, получается так?



    Это я под фасм. =)