Уроки Iczelion'а




Урок 5. Таблица секций


Скачайте пример.

Теория:

Мы изучили DOS-заголовок и PE-заголовок. Осталась таблица секций. Таблица секций - это массив структур, следующий непосредственно за PE-заголовком. Размер массива определен в поле NumberOfSections структуры IMAGE_FILE_HEADER. Структура секции называется IMAGE_SECTION_HEADER.

IMAGE_SIZEOF_SHORT_NAME equ 8

IMAGE_SECTION_HEADER STRUCT Name1 db IMAGE_SIZEOF_SHORT_NAME dup(?) union Misc PhysicalAddress dd ? VirtualSize dd ? ends VirtualAddress dd ? SizeOfRawData dd ? PointerToRawData dd ? PointerToRelocations dd ? PointerToLinenumbers dd ? NumberOfRelocations dw ? NumberOfLinenumbers dw ? Characteristics dd ? IMAGE_SECTION_HEADER ENDS

Как обычно, не все члены полезны. Я расскажу только о тех, которые действительно полезны.

ПолеЗначение

Name1

Очевидно, что имя этого поля - "name", но так как слово "name" является ключевым словом в MASM'е, мы используем вместо него "Name1". Заметьте, что максимальная длина этого поля 8 байтов. Имя - это всего лишь название, ничего больше. Вы можете использовать любое имя или даже оставить это поле пустым. Заметьте, что null в конце может и не находиться.

VirtualAddress

RVA секции. PE-загрузчик использует значение в этом поле, когда мэппирует секцию в память. То есть, если значение в этом поел равняется 1000h и файл загружен в 400000h, секция будет загружена в 401000h.

SizeOfRawData

Размер секции, выравненный согласно установкам в PE-заголовке. PE-загрузчик проверяет значение в этом поле, чтобы знать, сколько байтов он должен загрузить в память.

PointerToRawData

Файловое смещение на начало секции. PE-загрузчик использует это значение для того, чтобы найти где она начинается.

Characteristics

Содержит флаги, такие как содержит ли эта секция исполняемый код, инициализированные данные, неинициализированные данные, можно читать и писать в секцию.

Теперь когда мы знаем о структуре IMAGE_SECTION_HEADER, давайте посмотрим, как мы можем эмулировать работу, выполняемую PE-загрузчиком:




    Содержание  Назад  Вперед