Анатомия файла Иван Скляров Спецвыпуск: Хакер, номер #057, стр. 057-026-5 Characteristics - характеристики секции, которые описаны в файле winnt.h. Из них я выбрал основные и привел их в отдельной таблице. Cекции За всеми заголовками в файле следуют тела секций. В Microsoft исторически сложились такие устойчивые названия секций: ".text", ".bss", ".data", ".rdata", ".edata", ".idata", ".rsrc", ".debug" и некоторые другие. Однако совсем не обязательно чтобы секции имели такие названия. Например, компиляторы от фирмы Inprise (бывшая Borland) присваивают секциям имена вида CODE, DATA и т.п. Кроме того, программист может создавать дополнительные секции со своими названиями. Наличие точки в начале секции также необязательно. Секции расположены вплотную друг к другу без промежутков, но это совсем не значит, что в самих секциях не бывает пустых мест. Каждая стандартная секция имеет определенное назначение, например: в ".text" распложен код программы; в ".bss" размещаются неинициализированные данные; в ".data" - инициализированные данные; в ".edata" – функции, экспортируемые файлом; в ".idata" - таблицы импортируемых функций; в ".rsrc" – ресурсы; в сегменте ".rdata" - данные только для чтения (строки, константы, информация отладочного каталога). Но это назначение секций не строгое, например, ".text" вполне может быть начинен обычными данными, а также экспортируемыми функциями. Некоторые секции имеют особый формат, сейчас внимание сосредоточу на них. Секция экспорта (.edata) В секции .edata представлен перечень функций и данных, которые PE-файл экспортирует для использования сторонними модулями. Сегмент экспорта стандартно состоит из следующих частей: 1. оглавление; 2. таблица указателей на экспортируемые имена; 3. таблица порядковых номеров функций; 4. таблица экспортируемых имен. Оглавление представлено вот такой структурой: typedef struct _IMAGE_EXPORT_DIRECTORY { DWORD Characteristics; DWORD TimeDateStamp; WORD MajorVersion; WORD MinorVersion; DWORD Name; DWORD Base; DWORD NumberOfFunctions; DWORD NumberOfNames; DWORD AddressOfFunctions; // RVA from base of image DWORD AddressOfNames; // RVA from base of image DWORD AddressOfNameOrdinals; // RVA from base of image } IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY; Characteristics - в настоящее время не используется. TimeDateStamp - время создания таблицы экспорта. MajorVersion и MinorVersion - старший и младший номер версии файла. Name - имя файла. Base - начальный порядковый номер для экспортируемых функций (обычно 1). NumberOfFunctions и NumberOfNames - содержат количество функций и имен функций, экспортируемых из файла. AddressOfFunctions - относительный виртуальный адрес (RVA) на таблицу указателей экспортируемых функций. AddressOfNames - это относительный виртуальный адрес (RVA) на таблицу экспортируемых имен. AddressOfNameOrdinals - это относительный виртуальный адрес (RVA) на таблицу порядковых номеров функций. Все три таблицы связаны между собой особым образом. |