Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #57, АВГУСТ 2005 г.

Анатомия файла

Иван Скляров

Спецвыпуск: Хакер, номер #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;

Назад на стр. 057-026-5  Содержание  Вперед на стр. 057-026-7