Анатомия файла Иван Скляров Спецвыпуск: Хакер, номер #057, стр. 057-026-6 Секция импорта (.idata) Секция импорта содержит информацию о функциях и данных, которые файл импортирует из библиотек DLL. Секция .idata состоит из последовательности таблиц импорта, каждая из которых представлена структурой IMAGE_IMPORT_DESCRIPTOR. Каждая такая структура соответствует одной DLL, из которой программа импортирует функции. Последняя структура в последовательности имеет нулевые поля. Вот формат этой структуры из файла winnt.h: 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 IMAGE_IMPORT_DESCRIPTOR UNALIGNED *PIMAGE_IMPORT_DESCRIPTOR; Первое поле является объединением (union) и принимает такие значения: либо 0 (Characteristics), если структура является последней в последовательности, либо указатель (OriginalFirstThunk) на последовательность структур типа IMAGE_THUNK_DATA (о ней читай ниже). TimeDateStamp - время создания файла, из которого импортируются функции (чаще всего имеет нулевое значение). ForwarderChain - переадресация к другой DLL, если возникает такая необходимость. Name - имя библиотеки, которой соответствует текущая структура IMAGE_IMPORT_DESCRIPTOR. FirstThunk - еще один указатель на структуру типа IMAGE_THUNK_DATA. #include "poppack.h" // Back to 4 byte packing typedef struct _IMAGE_THUNK_DATA32 { union { PBYTE ForwarderString; PDWORD Function; DWORD Ordinal; PIMAGE_IMPORT_BY_NAME AddressOfData; } u1; } IMAGE_THUNK_DATA32; typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32; Как видно, структура IMAGE_THUNK_DATA содержит в себе объединение. Если функция импортируется по порядковому номеру, значение объединения расценивается как Ordinal. Если функция импортируется по имени, объединение интерпретируется как указатель на структуру типа IMAGE_IMPORT_BY_NAME (AddressOfData). Эта структура в файле winnt.h описана следующим образом: typedef struct _IMAGE_IMPORT_BY_NAME { WORD Hint; BYTE Name[1]; } IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME; Здесь поле Hint является подсказкой, облегчающей поиск указателя на функцию. Name - указатель на строку с именем импортируемой функции. Сегмент ресурсов (.rsrc) Ресурсы имеют довольно сложную иерархическую структуру. В начале секции ресурсов расположено оглавление, которое представлено вот такой структурой: typedef struct _IMAGE_RESOURCE_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; WORD NumberOfNamedEntries; |