Пятница, 18.07.2025, 11:17 Приветствую Вас Гость

On-line: Книги, учебники, статьи

Главная | Регистрация | Вход | RSS

Глава 1. Структура исполняемых модулей(3)

Вход в таблицу ресурсов (Resource Entry Item)

СмещениеДлина поляНазвание поляОписание поля
00hDWORDName RVA or Res IDПоле содержит либо идентификатор ресурса, либо указатель на его имя в таблице имен ресурсов.
04hDWORDData Entry RVA or SubDirectory RVAУказывает либо на данные, либо на еще одну таблицу входов ресурсов. Старший бит поля, сброшенный в ноль, говорит, что поле указывает на данные.

Каждый пункт данных (Resource Entry Item) имеет следующий формат:

СмещениеДлина поляНазвание поляОписание поля
00hDWORDData RVAУказатель на реально расположенные данные относительно Image Base.
04hDWORDSizeРазмер ресурсных данных.
08hDWORDCodePageКодовая страница.
0ChDWORDReservedHe используется и устанавливается в ноль.

Таблица настроек адресов

Если исполняемый файл не может быть отображен по адресу, который указал компоновщик, то загрузчик производит настройку модуля, используя данные из секции .reloc. Поправки сводятся к перечню тех мест в отображенном файле, где нужно прибавить некоторую величину.

Формирование данных базовых поправок выглядит следующим образом. Поправки упаковываются сериями смежных кусков различной длины. Каждый кусок описывает поправки для одной четырехбайтовой страницы отображения и начинается со следующей структуры:

СмещениеДлина поляНазвание поляОписание поля
00hDWORDPage RVAОтносительный адрес страницы применения.
04hDWORDBlock SizeРазмер блока настроек (с заголовком). Эта величина используется для вычисления количества настроек.
08hWORDTypeOffset RecordМассив записей настроек, их переменное количество.

Для наложения настройки необходимо вычислить 32-битную разницу ("Дельта") между желаемой базой загрузки и действительной. Если образ программы загружен в требуемое место, то эта разница равна нулю и никакой настройки не требуется. Каждый блок настроек должен начинаться на DWORD-границе, для выравнивания блока можно пользоваться нулями. При настройке необходимую позицию в блоке вычисляют как сумму относительного адреса страницы и базового адреса загруженной программы.

Структура элемента массива настроек

15...12
Type
11...0
Offset
Биты слова, Type указывает на тип настройки, a Offset на ее смещение внутри 4-килобайтной страницы.

Перечислим возможные типы поправок.

0hАдрес абсолютный и никаких изменений производить не требуется.
1hДобавить старшие 16 битов "Дельты" к 16-битовому полю, находящемуся по смещению Offset. 16-битовое поле представляет старшие биты 32-битового слова.
2hДобавить младшие 16 битов "Дельты" по смещению Offset. 16-битовое поле представляет младшую половину 32-битового слова. Данная запись настройки присутствует только на RISC машине, когда Object align не является по умолчанию 64К.
3hПрибавляет 32-битовое "Дельта" к 32-битовому значению.
4hНастройка требует полного 32-битового значения. Старшие 16-бит берутся по адресу Offset, а младшие в следующем элементе TypeOffset. Все это объединяется в знаковую переменную, затем добавляется 32-битовое "Дельта" и DWORD 8000h. Старшие 16 бит получившегося значения сохраняются по адресу Offset в 16-битовом поле.
5h?

Отладочная информация (.debug$S, .debug$T)

Здесь помещается структура отладочного каталога, создаваемого любыми компоновщиками. Другая отладочная информация зависит от транслятора. Структуру COFF-отладочной информации можно посмотреть в книге [2].

Отладочный каталог

СмещениеДлина поляНазвание поляОписание поля
00hDWORDDebug FlagsФлаги, по-видимому, не используются и устанавливаются в нулевое значение.
04hDWORDTime/Date StampДата и время создания отладочной информации.
08hWORDMajor VersionСтарший номер версии отладочной информации.
0AhWORDMinor VersionМладший номер версии отладочной информации.
0ChDWORDDebug TypeТип информации для отладчика. Вот эти типы:
0000h - UNKNOWN/BORLAND;
0001h - COFF таблица символов;
0002h - Code View таблица символов;
0003h - FPO таблица символов;
0004h - MISC;
0005h - EXCEPTION;
0006h - FIXUP.
10hDWORDData SizeРазмер в байтах данных для отладки без размера заголовка.
14hDWORDData RVAОтносительный адрес расположения отладочных данных в памяти.
18hDWORDData SeekСмещение к отладочным данным в файле.
Вход на сайт
Поиск
Календарь
«  Июль 2025  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей
Наш опрос
Как Вам удобнее??
Всего ответов: 341
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0