Форматы исполняемых файлов

Автор: Пользователь скрыл имя, 03 Октября 2011 в 21:21, реферат

Описание работы

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

Работа содержит 1 файл

FORMATS.DOC

— 507.50 Кб (Скачать)

Таблица 12. Структура описания ресурса растровое изображение

Смещение Длина Назначение

0 40 байт Структура, полностью описывающая растровое изображение  
  (урок 20)

28h ?? байт Массив цветов (урок 20)

Описание ресурса значок отличается тем, что в массиве структур, описывающем типы ресурсов для данного приложения (см. поле 2–?? табл. 7), располагается только одна структура, описывающая тип ресурса значок, а ресурс для конкретного значка располагается в массиве структур (поле со смещением 6 в табл. 13).

Таблица 13. Структура описания ресурса типа значок

Смещение Длина, Назначение 
 байт

0 2  0

2h 2  Тип ресурса. Для значка поле равно 1

4h 2  Число ресурсов значок — определяет количество структур  
  в следующем поле

6 ??  Массив структур, описывающих ресурсы значков (табл. 14)

В табл. 14 представлена структура описания ресурса значок.

Таблица 14. Структура описания ресурса значок

Смещение  Длина,  Назначение 
поля  байт 
в структуре

0 1 Ширина изображения значка в пикселах (16, 32 или 64)

1 1  Высота изображения значка в пикселах (16, 32 или 64)

Таблица 14 (продолжение)

Смещение  Длина,  Назначение 
поля  байт 
в структуре

2 1  Число цветов в изображении значка (2 — монохромное изображе- 
  ние, 8 или 16 — количество цветов в изображении)

3h 5  0

8h 4  Размер в байтах ресурса значок

0сh 4  Уникальный номер данного значка, генерируемый  
  компилятором ресурсов

Далее следует описание изображения значка, которое очень похоже на описание растрового изображения, поэтому мы его приводить не будем (см. урок 20).

Главная цель, которую мы преследовали, приводя данные таблицы, это согласовать размерности различных структур. Владея этой информацией читатель при необходимости сможет определить местонахождение ресурсов в исполняемом файле и выполнить простейшие действия, к примеру, такое действие, как редактирование ресурсов с символьной информацией. Большая детализация темы, связанной с ресурсами, смысла не имеет, так как появляется слишком много подробностей, из-за которых вести однозначную линию обсуждения, соответствующую тематике урока, становится достаточно трудно.

Таблица резидентных имен

Таблица резидентных имен содержит имена экспортируемых модулем функций, то есть тех функций, которые могут быть вызваны в другой программе. Таблица резидентных имен состоит из совокупности записей с информацией об именах экспортируемых функций в исполняемом файле. Таблица резидентных имен постоянно находится в памяти (этим она отличается от таблицы нерезидентных имен (см. далее)). Содержимое одной записи таблицы резидентных имен представлено в табл. 15.

Таблица 15. Структура записи таблицы резидентных имен

Смещение Назначение

00 Длина строки с именем экспортируемой функции. Конец таблицы рези- 
 дентных имен обозначается нулевым значением этого поля (при этом  
 два других поля записи отсутствуют)

01-?? Имя экспортируемой функции (без конечного нуля, то есть не  
 ASCIIZ-строка). В имени экспортируемой функции различаются строчные  
 и прописные буквы

(??+1)h Индекс (порядковый номер) записи в таблице точек входа (см. далее), кото- 
 рая адресует идентифицируемую данной записью функцию

Первое имя, которое содержится в этой таблице, — строка с именем модуля, определенным в операторе NAME файла определений (.def).

Таблица ссылок на внешние модули

Таблица ссылок на внешние модули (или таблица ссылок на импортируемые функции) содержит смещения в таблице внешних имен (см. ниже) для каждой записи с именем внешнего модуля. Количество записей в этой таблице равно количеству импортируемых модулей (функций). Размер записи таблицы ссылок на импортируемые модули равен двум байтам.

Таблица внешних имен

Таблица внешних имен содержит имена функций, импортируемых данным исполняемым файлом. Каждая запись таблицы содержит два элемента. Первый, размером в один байт, определяет длину символьного имени. Второй содержит имя используемой импортируемой функции (это имя также не заканчивается нулем). Конец таблицы обозначается нулевым байтом.

Таблица входов

При создании исполняемого файла компоновщик строит таблицу точек входа. В этой таблице каждый элемент пронумерован, поэтому возможно обращение к точкам входа по их номерам. Нумерация точек входа не является последовательной, поэтому номера собираются в так называемые «связки», или группы, внутри которых номера следуют последовательно. Связки формируются компоновщиком. Единственное исключение в системе нумерации — основная точка входа в модуль имеет номер 1. Таким образом, таблица входов представляет собой совокупность связок, имеющих определенный формат. Каждая связка начинается с заголовка, формат которого следующий:

    m первый байт заголовка определяет количество входов в связке. Если этот байт равен 00h, то это означает конец таблицы входов;

    m второй байт заголовка определяет, является данная точка входа перемещаемой (0ffh) или фиксированной (0feh). Если значение второго байта не равно этим двум значениям, то это — индекс сегмента.

Далее следуют элементы, описывающие точки входа данной связки. Элементы могут быть двух форматов, в зависимости от типа точки входа (перемещаемая (0ffh) или фиксированная (0feh) (табл. 16 и 17).

Таблица 16. Элементы входа (6 байт) для перемещаемого сегмента

Смещение Размер Назначение

00h 1 байт Значение бит: 
  0 — если равен 1, то вход экспортируемый данным модулем;

            1 — если равен 1, то функция, соответствующая данной точке  
  входа, использует общий сегмент данных для всех вызывающих  
  ее программ (нужно только для dll-файлов);

            3–7 — если исполняемый файл содержит программный код,  
  выполняющий переходы через кольца защиты, то значение  
  битов 3–7 трактуется как количество слов (16 бит), формиру- 
  ющих стек. При межкольцевом переходе эти слова копируются  
  из стека одного кольца в стек другого кольца

Таблица 16 (продолжение)

Смещение Размер Назначение

01h 2 байта Инструкция int 3fh

03h 1 байт Номер сегмента, согласно таблице сегментов (см. табл. 5)

04 2 байта Смещение в сегменте к точке входа

Таблица 17. Элемент входа (3 байта) для неперемещаемого сегмента

Смещение Размер Назначение

00h 1 байт Биты в байте имеют определенное значение: 
  0 — если равен 1, то вход экспортируемый;

            1 — если равен 1, то функция использует общий сегмент дан- 
  ных для всех вызывающих программ (нужно только  
  для dll-файлов);

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

01h 2 байта Смещение в сегменте

А где же сами имена функций? Ответ на это дают таблицы резидентных и нерезидентных имен. Именно они устанавливают соответствие между именами и номерами экспортируемых функций. Элементы этих таблиц имеют одинаковый формат. Потребность в двух одинаковых по формату таблицах возникает из соображений экономии памяти. Если нет необходимости постоянно держать имя экспортируемой функции в памяти (так как обращение к ним осуществляется по их номерам), то это имя необходимо поместить в нерезидентную таблицу имен. И наоборот. Таблицу резидентных имен мы уже рассмотрели. Рассмотрим таблицу нерезидентных имен.

Таблица нерезидентных имен

Назначение таблицы нерезидентных имен аналогично таблице резидентных имен (см. выше). Эта таблица также состоит из записей, которые определяют имена экспортируемых функций в исполняемом файле. Ее отличие от таблицы резидентных имен в том, что данная таблица может быть выгружена на диск, если необходимо освободить память. Символы в именах экспортируемых функций чувствительны к регистру и не являются ASCIIZ-строками. Формат каждого элемента данной таблицы представлен в табл.

Таблица Структура записи в таблице нерезидентных имен

Смещение Назначение

00h Длина строки с именем в байтах

01h–??h Имя

??h+01h Порядковый номер, который является индексом в таблице входов

Таким образом, мы описали заголовок и служебные таблицы исполняемого файла NE-формата. Далее следуют сегменты программы. Их размещение осуществляется в соответствии с информацией поля со смещением 32h относительно начала NE-заголовка.

Некоторые сегменты кода содержат вызовы функций из других сегментов, для чего соответственно нужны данные для разрешения этих дальних ссылок. Ведь истинные сегментные составляющие адреса будут известны лишь на этапе выполнения. Эту настройку выполняет загрузчик. Для этого используются данные из таблицы настройки, которая размещается сразу за сегментами кода и данных. В нашем примере это адрес 041bh. Первые два байта таблицы настройки содержат количество элементов в таблице настройки. Далее идет группа элементов размером 8 байт, называемых записями размещения. Эти записи содержат информацию о типе адреса, типе ссылки и ее расположении. Структура таблицы настройки показана в табл. 19, 20, 21.

Первый байт элемента таблицы настройки (табл. 19) определяет тип адресной ссылки.

Таблица 19. Значения первого байта элемента таблицы настройки

Величина Значение

0 Младший байт по указанному смещению

2 16-битный селектор

3 32-битный указатель (сегмент:смещение)

5 16-битное смещение

11 (0bh) 48-битный указатель (селектор:32-битное смещение)

13 (0dh) 32-битное смещение

Второй байт определяет один из типов настройки (табл. 20).

Таблица 20. Значения второго байта элемента таблицы настройки

Величина Значение

0 Внутренняя ссылка (межсегментная ссылка)

1 Импортируемый порядковый номер (например, номер функции из  
 dll-библиотеки)

2 Импортируемое имя (из другого модуля)

3 Ссылка на операционную систему

Третий и четвертый байты определяют смещение элемента, требующего настройки, внутри сегмента. Значение остальных четырех байт определяется типом ссылки, указанным вторым байтом (табл. 21).

Таблица 21. Значения 5, 6, 7 и 8 байтов элемента таблицы настройки

Тип ссылки Значение

Внутренняя ссылка Для фиксированного сегмента: 
 5 байт — номер сегмента; 
 6 байт — нулевой; 
 7 и 8 байты — смещение в сегменте. 
 Для перемещаемого сегмента: 
 5 байт — 0ffh; 
 6 байт — нулевой;

      7 и 8 байты — соответствуют индексу в таблице входов для сег- 
 мента, содержащего данную ссылку

Импортируемое имя 5 и 6 байт — определяют индекс в таблице ссылок на модули;

      7 и 8 байты — смещение в таблице внешних (импортируемых)  
 имен

Импортируемый 5 и 6 байт — определяют индекс в таблице ссылок на модули; 
порядковый номер 7 и 8 байты — порядковый номер функции

Таким образом, мы рассмотрели структуру исполняемого файла в NE-формате. Перейдем теперь к реалиям нашего времени и рассмотрим структуру файлов, которая используется операционной системой Windows NT/95/98.

Информация о работе Форматы исполняемых файлов