Прочёл несколько статьи Петрика из MSDN, посмотрел определения в VC, MASM'e, на форуме FASM'a и т.д. Так толком и не понял, где что. Есть вот такие структуры: Код (Text): IMAGE_BASE_RELOCATION STRUCT VirtualAddress dd ? SizeOfBlock dd ? IMAGE_BASE_RELOCATION ENDS IMAGE_RELOCATION STRUCT union VirtualAddress dd ? RelocCount dd ? ends SymbolTableIndex dd ? Type1 dw ? IMAGE_RELOCATION ENDS Первая (IMAGE_BASE_RELOCATION), вроде бы, описывает директорию в PE-header'e, то есть как IMAGE_DATA_DIRECTORY. Получается: Код (Text): VirtualAddress dd ?; RVA таблицы блоков переназначений SizeOfBlock dd ?; количество байт в таблице А IMAGE_RELOCATION походу дела только для объектных COFF-файлов, там ведь релоки другие. В PE теоретически должна быть структура самого блока из таблицы. Что-то вроде этого псевдо: Код (Text): RELOCATION_BLOCK STRUCT PageRVA dd ? ; RVA страницы переназначений SizeOfBlock dd ? ; количество байт в блоке TypeAndOffset dw ? dup (?) ; информация о переназначениях RELOCATION_BLOCK ENDS Есть ли такая стандартная структура? Ещё в WinNT.h увидел вот такую хрень: Код (Text): typedef struct _IMAGE_BASE_RELOCATION { DWORD VirtualAddress; DWORD SizeOfBlock; // WORD TypeOffset[1]; } IMAGE_BASE_RELOCATION; typedef IMAGE_BASE_RELOCATION UNALIGNED * PIMAGE_BASE_RELOCATION; Но здесь вопрос, почему закомментирован TypeOffset? И вообще, название _IMAGE_BASE_RELOCATION дебильное =/. ЗЫ У меня большое желание писать исходник так: [EBX+4], будет проще, чем эти извраты от MS.
Из 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.
yGREK Спасибо. Примерно так писал и Петрик, Мне просто показалось, что это ошибка. Но если уж все так считают, пусть будет так. Тогда другой вопрос. К инфе в DataDirectory из IMAGE_OPTIONAL_HEADER32 "правильнее" обращаться так: Код (Text): lea EBX, [EBX+IMAGE_NT_HEADERS.OptionalHeader.DataDirectory.VirtualAddress+size of.IMAGE_DATA_DIRECTORY*IMAGE_DIRECTORY_ENTRY_BASERELOC] mov EAX, [EBX+IMAGE_DATA_DIRECTORY.VirtualAddress] mov EDX, [EBX+IMAGE_DATA_DIRECTORY. isize] И не зависит от того, что это, директория релоков или импорта, получается так? Это я под фасм. =)