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

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

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

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

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

FORMATS.DOC

— 507.50 Кб (Скачать)
">  001Ch 2 байта Сигнатура 01 00h

  001Eh 1 байт Сигнатура 0fbh

  001Fh 1 байт Версия TLINK

  0020h 2 байта Сигнатура 6a72h

Другие программы, например архиваторы, формирующие саморазворачивающиеся файлы (self-extracting), также помещают в эту область уникальную информацию. Зная это, вы можете уточнить информацию о программе, сформировавшей исполняемый файл.

В поле со смещением 0018h находится значение смещения таблицы размещения. Что это за таблица? Таблица размещения представляет собой совокупность элементов, предназначенных для связи сегментов в программе. Число элементов таблицы содержится в поле со смещением 0006h. Каждый элемент имеет следующий формат:

  0000h 2 байта Смещение внутри сегмента

  0002h 2 байта Сегмент размещения

Во время загрузки программы в память к ней добавляется префикс программного сегмента (PSP — program segment prefix) размером 256 байт. Сама программа загружается вслед за этим префиксом. Информация из префикса может быть использована для выделения символов из командной строки, определения объема доступной памяти, информации об окружении и т. д. В заключение отметим содержимое регистров после загрузки файла MZ-формата:

    m ax — количество символов в командной строке;

    m bx:cx — размер загрузочного модуля;

    m ds и es — сегментные составляющие адреса начала PSP данной программы. При необходимости их нужно подстраивать. Мы это делали постоянно при написании программ, вставляя в начало исполняемой части программы команды код, подобный следующему:

      mov ax,data

      mov ds,ax

    m ss:sp — указатель на вершину стека;

    m cs:ip — адрес точки входа программы, то есть той инструкции, адрес которой указан меткой в заключительной директиве программы end.

 

 0000:0000 4D 5A 64 01 02 00 01 00 20 00 00 00 FF FF 03 00 MZd..... .......

 

 0000:0010 00 01 00 00 00 00 13 00 3E 00 00 00 01 00 FB 71 ........>......q

 

 0000:0020 6A 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 jr..............

 

 0000:0030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 ................

 

 0000:0040 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

 

 0000:0050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

 

 … … … далее тоже самое

 

 0000:01F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

 

 0000:0200 C2 E2 E5 E4 E8 F2 E5 20 E4 E2 E5 20 F8 E5 F1 F2 ....... ... ....

 

 0000:0210 ED E0 E4 F6 E0 F2 E5 F0 E8 F7 ED FB E5 20 F6 E8 ............. ..

 

 0000:0220 F4 F0 FB 2C 24 00 00 00 00 00 00 00 00 00 00 00 ...,$...........

 

 0000:0230 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F ????????????????

 

 … … … далее тоже самое

 

 0000:0320 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F 3F ????????????????

 

 0000:0330 B8 00 00 8E D8 B4 09 BA 00 00 CD 21 33 C0 B4 01 ...........!3...

 

 0000:0340 CD 21 8A D0 80 EA 30 80 FA 09 7E 03 80 EA 07 B1 .!..Ђ.0Ђ..~.Ђ...

 

 0000:0350 04 D2 E2 CD 21 2C 30 3C 09 7E 02 2C 07 02 D0 B8 ....!,0<.~.,....

 

 0000:0360 00 4C CD 21                                     .L.!

Рис. 2. Дамп EXE-файла MZ-формата

Исполняемый файл NE-формата (Windows 3.x)

NE-формат (New Executeable code file) исполняемого файла был разработан для операционной системы Windows 2.0. Этот же формат использовался в операционной системе OS/2 фирмы IBM. Исполняемый файл NE-формата состоит из двух исполняемых файлов:

    m исполняемый файл MZ-формата;

    m исполняемый файл NE-формата.

Если посмотреть на пример дампа исполняемого файла NE-формата (рис. 4), то видно, что первые несколько десятков байт являются не чем иным, как только что рассмотренным нами файлом MZ-форматa (MS-DOS). В его задачу входит вывод сообщения типа «This program required Microsoft Windows». Наверняка оно вам известно, как и та ситуация, при которой это сообщение выводится. Загрузчик Windows знает об этой особенности загрузочного файла и сразу начинает работать со второй его частью. Загрузчик MS-DOS впрямую запускает программу с расширением .exe на исполнение. Данная маленькая программа добросовестно исполняется, выводя вышеуказанное (или подобное ему) сообщение, и благополучно завершается. В принципе, вместо этой маленькой программы может быть полноценная программа, представляющая собой DOS-версию приложения.

Определить тот факт, что исполняемый файл с расширением .exe является файлом формата NE, достаточно просто. Для этого достаточно посмотреть на значение в байте со смещением 18h от начала файла. Если там значение 40h, то перед вами не MZ-формат. Далее необходимо посмотреть на содержимое слова со смещением 3Сh. Значение в нем показывает смещение заголовка NE исполняемого файла относительно начала файла. Общий формат исполняемого файла NE-формата показан на рис. 3. Фрагменты дампа файла NE-формата показаны на рис. 4. В начале файла расположена программа-заглушка MS-DOS. Формат этой части файла NE-формата показан в табл. 2.

Таблица 2. Содержимое полей DOS-заголовка файла NE-формата

  Смещение Длина поля Содержимое

  0000h 32 байта Заголовок исполняемого файла MS-DOS (см. табл. 1,  
  поля 0000-0018h)

  0020h 28 байт 0 (резерв)

  003ch 2 байта Если значение поля со смещением 0018h равно или  
  больше значения 40h, то это приложение Windows  
  и данное поле содержит смещение от начала файла  
  до начала заголовка Windows-приложения

  003eh 2 байта 0 (резерв)

  0040h ? байт Программа-заглушка MS-DOS

Рис. 3. Структура исполняемого файла NE-формата

Как уже было отмечено, в поле со смещением 003ch от начала файла содержится смещение начала данных, относящихся непосредственно к Windows-приложению. Эти данные начинаются с заголовка, содержимое которого описано в табл. 3 (все смещения, если не оговорено специально, считаются от начала NE-заголовка, а не от начала файла).

 

    0000:0000  4D 5A 6B 00 BD 04 00 00 20 00 00 00 FF FF 07 00   MZk..... .......

    0000:0010  00 01 65 40 00 00 00 00 40 00 00 00 01 00 00 00   ..e@....@.......

    0000:0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

    0000:0030  00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00   ................

    0000:0040  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

    … … … далее тоже самое

    0000:01F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

    0000:0200  E8 53 00 54 68 69 73 20 70 72 6F 67 72 61 6D 20   .S.This program

    0000:0210  72 65 71 75 69 72 65 73 20 4D 69 63 72 6F 73 6F   requires Microso

    0000:0220  66 74 20 57 69 6E 64 6F 77 73 2E 0D 0A 24 20 20   ft Windows...$ 

    0000:0230  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  

    0000:0240  20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  

    0000:0250  20 20 20 20 20 20 5A 0E 1F B4 09 CD 21 B8 01 4C         Z.....!..L

    0000:0260  CD 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00   .!..............

    0000:0270  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

    … … … далее тоже самое

    0000:03F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

    0000:0400  4E 45 05 3C 75 07 CF 0C 00 00 00 00 01 83 22 00   NE.<u.........".

    0000:0410  00 00 00 00 02 1E 15 00 00 00 00 00 22 00 07 00   ............"...

    0000:0420  5E 22 40 00 50 01 15 07 3A 07 48 07 44 18 00 00   ^"@.P...:.H.D...

    0000:0430  FA 01 05 00 00 00 02 00 00 00 00 00 00 00 00 04   ................

    0000:0440  D6 01 2A 18 40 0D 2C 18 A2 02 A4 1E 50 0D A4 1E   ..*.@.,.....P...

    0000:0450  A0 03 A7 AC 50 0D A8 AC 1D 09 AF 63 50 0D B0 63   ....P......cP..c

    0000:0460  4B 0C DC 2D 50 1D DC 2D C6 0D DA 83 50 1D DA 83   K..-P..-....P...

    0000:0470  FA 11 97 B8 50 1D 98 B8 D0 17 62 60 50 1D 62 60   ....P.....b`P.b`

    0000:0480  E2 1A 00 34 50 1D 00 34 89 1C 09 4F 50 1D 0A 4F   ...4P..4...OP..O

    0000:0490  0E 1F 6C 23 50 1D 6C 23 33 20 B3 5F 50 1D B4 5F   ..l#P.l#3 ._P.._

    0000:04A0  3D 23 2A 6B 50 1D 2A 6B A8 26 41 31 50 1D 42 31   =#*kP.*k.&A1P.B1

    0000:04B0  3A 28 7A 45 50 1D 7A 45 78 2A 11 3D 50 1D 12 3D   :(zEP.zEx*.=P..=

    … … …

Рис. 4. Фрагмент дампа EXE-файла NE-формата

Таблица 3. Содержимое полей Windows-заголовка файла NE-формата

  Смещение Длина Значение

  0000h 2 байта Сигнатура — «NE» (4e 45h)

  0002h 2 байта Версия и модификация версии программы компоновщика  
  TLINK, создавшей данный исполняемый файл

  0004h 2 байта Смещение таблицы входов (относительно начала NE-заго- 
  ловка)

  0006h 2 байта Длина таблицы входов (в байтах)

  0008h 4 байта 0

  000ch 2 байта Байт флагов, описывающих содержимое исполняемого  
  файла

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

Таблица 3. Поля Windows-заголовка файла NE-формата (продолжение)

Смещение Длина Значение

  000eh 2 байта Число сегментов автоматических данных. Если биты 0 и 1 
  в поле флагов (см. табл. 4) равны 0, то это поле равно 0

  0010h 2 байта Определяет размер (в байтах) локальной кучи

  0012h 2 байта Определяет размер стека (в байтах)

  0014h 4 байта Значение в cs:ip — адрес точки входа: 
  
cs (старшее слово) — индекс сегмента кода в таблице  
  сегментов (см. ниже); 
  
ip (младшее слово) — смещение в сегменте кода

  0018h 4 байта Значение в ss:sp — адрес вершины стека 
  
ss (старшее слово) — индекс сегмента стека в таблице  
  сегментов (см. ниже); 
  
sp (младшее слово) — смещение в сегменте стека

  001ch 2 байта Количество сегментов в модуле (число элементов в таблице  
  сегментов)

  001eh 2 байта Количество элементов в таблице модулей (то есть это, факти- 
  чески, количество импортируемых модулей). Поле связано  
  с таблицей ссылок, адрес которой находится в слове 0028h

  0020h 2 байта Размер в байтах таблицы нерезидентных имен

  0022h 2 байта Относительное смещение от начала NE-заголовка до начала  
  таблицы сегментов

  0024h 2 байта Относительное смещение от начала NE-заголовка до начала  
  таблицы ресурсов

  0026h 2 байта Относительное смещение от начала NE-заголовка до начала  
  таблицы резидентных имен

  0028h 2 байта Относительное смещение от начала NE-заголовка до начала  
  таблицы ссылок на модули

  002ah 2 байта Относительное смещение от начала NE-заголовка до начала  
  таблицы внешних (импортируемых) имен

  002ch 2 байта Относительное смещение от начала NE-заголовка до начала  
  таблицы нерезидентных имен

  002eh 2 байта Не используется

  0030h 2 байта Количество перемещаемых точек входа

  0032h 2 байта Определяет величину, в соответствии с которой производится  
  разбиение исполняемого файла в NE-формате на логические  
  сектора (возможно, не равные по размеру физическим). В этих  
  сегментах располагается содержимое сегментов исходной  
  программы и ресурсов. Учет занимаемого ими пространства  
  также производится в этих логических сегментах. Для полу- 
  чения размера логического сектора необходимо число 2 воз- 
  вести в степень равную значению этого поля. Устанавливается 
  опциями
/Align:n (link фирмы Microsoft) или /A=n (tlink   
  фирмы Borland (Inprise)). Если
n=16, то значение в этом поле   
  равно 4, если
n=512, то значение в этом поле равно 9

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