Разбираюсь с PE форматом, возникли вопросы по таблице импорта. Файл - обычный messagebox, написанный на асме Оранжевый и серый - это первая и вторая структура типа IMAGE_IMPORT_DESCRIPTOR. Потом идет еще одна такая структура (размер - 14h, 5 двордов), заполненная нулями. Она завершает массив этих структур. Потом идут названия библиотек. Потом OriginalFirstThunk (желтый), потом непонятно что (белый), затем FirstThunk (красный), который после загрузки заменяется на фактический адрес. Потом идет еще один дворд (голубой), непонятно, что это. Дальше идет Hint из структуры IMAGE_IMPORT_BY_NAME (зеленый). Тут я не понял, это ворд или дворд, в разных местах по-разному написано. Потом идет название функции, которую импортируем, она заканчивается нулем, тут все понятно. Теперь вопросы 1. Почему названия библиотек заканчиваются двумя нулями (фиолетовый)? Это связано с юникодом или для выравнивания названия до четного количества байт (т.к. должно заканчиваться одним)? 2. Как называется это поле (белый)? 3. Что за поле (голубой)?
одептирование идет по плану Код (Text): ;typedef struct _IMAGE_IMPORT_DESCRIPTOR { ; union { ; DWORD Characteristics; // 0 for terminating null import descriptor ; DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA) ; }; ; DWORD TimeDateStamp; // 0 if not bound, ; // -1 if bound, and real date\time stamp ; // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND) ; // O.W. date/time stamp of DLL bound to (Old BIND) ; ; DWORD ForwarderChain; // -1 if no forwarders ; DWORD Name; ; DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses) ;} IMAGE_IMPORT_DESCRIPTOR; ;typedef struct _IMAGE_THUNK_DATA32 { ; union { ; PBYTE ForwarderString; ; PDWORD Function; ; DWORD Ordinal; ; PIMAGE_IMPORT_BY_NAME AddressOfData; !!!!!!!!!!!!!!!!!!!! ; } u1; ;} IMAGE_THUNK_DATA32; ;typedef struct _IMAGE_IMPORT_BY_NAME { ; WORD Hint; ; BYTE Name[1]; ;} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; data 12 IAT: FirstThunk: FirstThunk_kernel32: GetModuleFileName dd rva _GetModuleFileNameA ExitProcess dd rva _ExitProcess dd 0 FirstThunk_user32: MessageBox dd rva _MessageBoxA dd 0 IAT_SIZE = $ - IAT end data data 1 IMAGE_IMPORT_DESCRIPTOR: dd rva OriginalFirstThunk_kernel32,0,0,rva kernel32_name, rva FirstThunk_kernel32 dd rva OriginalFirstThunk_user32,0,0,rva user32_name, rva FirstThunk_user32 dd 0,0,0,0,0 IMPORT_SIZE = $ - IMAGE_IMPORT_DESCRIPTOR end data OriginalFirstThunk: OriginalFirstThunk_kernel32: dd rva _GetModuleFileNameA dd rva _ExitProcess dd 0 OriginalFirstThunk_user32: dd rva _MessageBoxA dd 0 _align 2,0 _ExitProcess dw 0 ; Hint db 'ExitProcess',0 _GetModuleFileNameA dw 0 ; Hint db 'GetModuleFileNameA',0 _align 4,0 kernel32_name db 'kernel32.dll',0 _align 2,0 _MessageBoxA dw 0 ; Hint db 'MessageBoxA',0 _align 4,0 user32_name db 'user32.dll',0
Код (Text): ;typedef struct _IMAGE_THUNK_DATA32 { ; union { ; PBYTE ForwarderString; ; PDWORD Function; ; DWORD Ordinal; ; PIMAGE_IMPORT_BY_NAME AddressOfData; !!!!!!!!!!!!!!!!!!!! ; } u1; ;} IMAGE_THUNK_DATA32; вот здесь не совсем понятно. какой размер у структуры IMAGE_THUNK_DATA32 ? как я понял, это дворд, но в юнионе есть строчка PIMAGE_IMPORT_BY_NAME AddressOfData; !!!!!!!!!!!!!!!!!!!! размер которого ворд (поле хинт) + массив байт для названия функции. тогда становится непонятно, как определить размер IMAGE_THUNK_DATA32. я так понимаю, что union { } как бы накладывает разные переменные на один участок памяти, но они могут быть разного размера. например, если typedef struct _somestruct { union { dword dword_; word word_; byte byte_; pdword pdword_; } } somestruct; то dword_ будет равен размеру всей структуры, word_ первым двум байтам, а byte_ только первом байту. pdword_ будет ссылкой на участок памяти по адресу dword_. все правильно?
0dept Вы это, внимательно проанализировали предложенный сорц? В нем полная структура импорта MS Link и по-моему вопросов про подчеркнутые байты возникать не должно. Толкование что, как, почему, можно найти у Ицзелиона в туторе про Формат PE/Таблица импорта
кстати у вас на картинке не вся таблица, нет массива FirstThunk, ms link любит его располагать в другой секции