- Заголовок exe файла windows
- Приложение А Форматы заголовков EXE-файлов
- Читайте также
- Форматы файлов и форматы кодирования
- Форматы исполняемых файлов
- Форматы файлов шрифтов
- Форматы файлов и форматы кодирования
- 11.4.2. Форматы файлов шрифтов
- Форматы графических файлов
- Форматы графических файлов
- 3.1.6. Двоичные форматы файлов
- 3.1.6. Двоичные форматы файлов
- Глава 4 Форматы графических файлов
- Форматы графических файлов
- Форматы файлов
Заголовок exe файла windows
Исследуем формат EXE-файла
Целью работы компилятора является получение EXE-файла. Поэтому, исследуем его структуру.
EXE-файлы появились ещё в DOS и потом они с небольшими изменениями перекочевали в Windows. Формат EXE-файла под Windows называется PE-файлом. Он организован в виде линейного потока данных.
Формат PE-файла
Заголовок MS-DOS |
Программа-заглушка |
Заголовок PE |
Доп. заголовок PE |
Массив DataDir |
Заголовки сегментов |
Тела сегментов |
Остальные области данных |
Заголовок MS-DOS не нов, он используется начиная с MS-DOS версии 2. Если вы пытаетесь запустить Windows-программу под DOS-ом, то программа-заглушка, которая размещена ниже, сообщит о невозможности этого сделать. Если бы заголовок MS-DOS и программа-заглушка не были бы включены в PE-файл, то скорее всего бы это бы привело к сбою.
Залоговок MS-DOS (размер 40H байт)
Адрес | Тип | Имя | Описание |
---|---|---|---|
00h | word | Magic | Магическая сигнатура DOS-файла — два символа «MZ», явно от MZ -club 🙂 |
02h | word | LastByteCount | Количество байт на последней странице файла |
04h | word | PageCount | Количество страниц в файле |
06h | word | RelocCount | Количество релокейшенов |
08h | word | HeaderSize | Размер заголовка в параграфах |
0Ah | word | MinAlloc | Мин. выделение памяти в параграфах |
0Ch | word | MaxAlloc | Макс. выделение памяти в параграфах |
0Eh | word | InitSS | Начальное (относительное) значение регистра SS |
10h | word | InitSP | Начальное значение регистра SP |
12h | word | CheckSum | Контрольная сумма |
14h | word | InitIP | Начальное значение регистра IP |
16h | word | InitCS | Начальное (относительное) значение регистра CS |
18h | word | RelocAddr | Адрес на релокейшены и программу-заглушку |
1Ah | word | OverlayCount | Количество оверлеев |
1Ch | word | Res1[4] | Зарезервировано |
24h | word | OEMIdentifier | Для OEMInfo |
26h | word | OEMInfo | Информация о программе |
28h | word | Res1[10] | Зарезервировано |
3Ch | dword | PEHeaderAddr | Адрес в файле заголовка PE |
Для Windows-программы заголовок MS-DOS не содержит релокейшины (пока даже и не знаю что это такое), то есть Relocations = 0, поэтому RelocAddr указывает сразу на программу-заглушку. Но нам важен заголовок PE, его адрес находиться в PEHeaderAddr.
Залоговок PE (размер 18H байт)
Адрес | Тип | Имя | Описание |
---|---|---|---|
00h | dword | Magic | Магическая сигнатура PE-файла 4550H или «PE», 0H, 0H |
04h | word | CPUType | Тип процессора |
06h | word | SectionCount | Количество сегментов |
08h | dword | DateTime | Дата/время создания/модификации линкером |
0Сh | dword | SymbolTableAddr | Адрес местонахождения таблицы символов |
10h | dword | SymbolTableSize | Размер таблицы символов |
14h | word | OptionalHeaderSize | Размер доп. заголовка PE |
16h | word | Flags | Предназначение программы |
Сразу за основным заголовком идёт дополнительный заголовок PE.
Доп. залоговок PE (размер 18H — 77H байт)
Адрес | Тип | Имя | Описание |
---|---|---|---|
18h | word | Magic | Всегда 10Bh |
1Ah | byte | MajorLinkVer | Версия линкера, создавшего данный файл |
1Bh | byte | MinorLinkVer | — |
1Ch | dword | CodeSize | Размер исполнительного кода |
20h | dword | InitDataSize | Размер инициализированных данных |
24h | dword | UnInitDataSize | Размер неинициализированных данных |
28h | dword | EntryPointAddr | Адрес, относительно ImageBase, по которому передаётся управление при запуске программы или адрес инициализации/завершения библиотеки |
2Ch | dword | CodeBase | Относительное смещение сегмента кода |
30 | dword | DataBase | Относительное смещение сегмента неинициализированных данных |
34h | dword | ImageBase | Предподчтительный адрес для загрузки исполнимого файла (по умолчанию 400000H) |
38h | dword | SectionAlign | Выравнивание программных секций (по умолчанию 1000H) |
3Ch | dword | FileAlign | Минимальная гранулярность сегментов, то есть размер сегментов должен быть кратен FileAlign, должен быть равен значению степени 2 между 200H и 10000H (по умолчанию 200H) |
40h | word | MajorOSVer | Старший номер версии OS, необходимый для запуска программы |
42h | word | MinorOSVer | Младший номер версии OS |
44h | word | MajorImageVer | Пользовательский старший номер версии, задается пользователем при линковке программы и им же и используется |
46h | word | MinorImageVer | Пользовательский младший номер версии, задается пользователем при линковке программы и им же и используется |
48h | word | MajorSubSysVer | Старший номер версии Win32 |
4Ah | word | MinorSubSysVer | Младший номер версии Win32 |
4Ch | dword | Res1 | — |
50h | dword | ImageSize | Виртуальный размер в байтах всего загружаемого образа, вместе с заголовками, кратен ObjectAlign |
54h | dword | HeaderSize | Общий размер всех заголовков: MS-DOS, PE, доп PE и всех сегментов |
58h | dword | CheckSum | Контрольная сумма (не используется и равна 0) |
5Ch | word | SubSystem | Подсистема, необходимая для запуска данного файла //(0 — неизвестная подсистема, 1 — не требует подсистему, 2 — Windows GUI, 3 — Windows консоль. ) |
5Eh | word | DllFlags | Специальные флаги при загрузке, начиная с NT 3.5 не используются |
60h | dword | StackReserveSize | Память, требуемая для стека приложения, память резервируется, но выделяется только StackCommitSize байтов, следующая страница является охранной. Когда приложение достигает этой страницы, то страница становится доступной, а следующая страница — охранной, и так до достижения нижней границы, после чего Windows убивает программу с сообщением о конце стека |
64h | dword | StackCommitSize | Объем памяти, отводимый в стеке немедленно после загрузки |
68h | dword | HeapReserveSize | Максимальный возможный размер локального хипа |
6Ch | dword | HeapComitSize | Отводимый при загрузке хип |
70h | dword | LoaderFlags | Данный параметр устарел |
74h | dword | DataDirSize | Указывает размер массива DataDir, расположенный ниже (по умолчанию 10h) |
Далее идёт массив DataDir, 8-байтные элементы которого состоят из двух 4-х байтных: адрес и размер.
Массив DataDir (размер 78H — F8H байт)
Адрес | Тип | Имя | Описание |
---|---|---|---|
78h | qword | ExportDir | Каталог экспортируемых объектов |
80h | qword | ImportDir | Каталог импортируемых объектов |
88h | qword | ResourceDir | Каталог ресурсов |
90h | qword | ExceptionDir | Каталог исключений |
98h | qword | SecurityDir | Каталог безопастности |
A0h | qword | BaseRelocDir | Каталог переадресаций |
A8h | qword | DebugDir | Отладочный каталог |
B0h | qword | CopyrightDir | Каталог описаний |
B8h | qword | CpuSpecDir | Каталог значений, специфичных для процессора |
C0h | qword | TLSDir | Каталог TLS (Thread local storage — локальная память потоков) |
C8h | qword | ConfigDir | Каталог конфигураций загрузки |
D0h | qword | ResDir11 | — |
D8h | qword | ResDir12 | — |
E0h | qword | ResDir13 | — |
E8h | qword | ResDir14 | — |
F0h | qword | ResDir15 | — |
Элемент массива DataDir (размер 8 байт)
Адрес | Тип | Имя | Описание |
---|---|---|---|
00h | dword | Addr | Адрес каталога |
04h | dword | Size | Размер каталога |
Далее идёт подряд несколько сегментов, количество указано в SectionCount.
Заголовок сегмента (размер 2Ch байт)
Адрес | Тип | Имя | Описание | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
00h | char[8] | SectName | Имя секции, если имя Практически любая программа под Windows работает с такими её DLL-ками: kernel32.dll, user32.dll, gdi32.dll и т.д.. Поэтому, EXE-шник должен уметь импортировать функции данных библиотек, то есть работать с каталогом импорта ImportDir. Каталог импорта сразу же начинается с таблицы импорта ImportDirTable, которая описывает остальную информацию об импорте. Такая таблица состоит из элементов ImportDirTableItem, указывающих, как минимум, на каждую импортируемую библиотеку. Последний элемент, указывающий на конец таблицы, заполнен нулями. Элемент таблицы каталога импортируемых объектов ImportDirTableItem (размер 14h байт)
Параметр LibName указывает на имя библиотеки, которое должно заканчиваться нулём. FuncNameList указывает на список адресов (0-ой адрес — конец списка), по которым находится сначала Hint — (укороченный идентификатор точки входа), а затем имя функции, заканчивающееся нулём. Параметр FuncAddrList указывает на точно такой же список адресов, находящийся (по моим наблюдениям) перед ImportDirTable. Формат EXE-файла здесь описан не полностью. Остальное будет описано позже. Однако, этого уже достаточно для создания компилятора. Для глубокого изучения EXE-шника, написана специальная программа «EXE-исследователь». Последнюю версию данной программы можно скачать на страничке Download Приложение А Форматы заголовков EXE-файловПриложение А Форматы заголовков EXE-файлов Формат заголовка обычного EXE-файла В начале EXE-файла расположена форматированная часть заголовка EXE-файла (Таблица А-1). Далее следует таблица настройки адресов (Relocation Table), состоящая из длинных указателей (смещение: сегмент) на те слова в загрузочном модуле, которые содержат настраиваемые сегментные адреса. Примечание: элементы таблицы настройки могут быть расположены не по порядку. Таблица А-1. Формат заголовка обычного EXE-файла Формат заголовка NE-executable EXE-файла В состав старого заголовка входят: – обычный EXE-заголовок (Таблица A-2); – указатель на новый заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала нового заголовка); Таблица A-2. Формат обычного EXE-заголовка в NE-executable EXE-файле В состав нового заголовка входят: – инфоблок (Таблица A-3); – таблица сегментов (Таблица A-4); – таблица ресурсов (Таблица A-5); Таблица A-3. Формат NE-заголовка Таблица A-4. Формат таблицы сегментов Таблица A-5. Формат таблицы ресурсов – таблица резидентных имен; – таблица ссылок на модули; – таблица импортируемых имен; – таблица входов (Таблицы A-6 и A-7); – таблица нерезидентных имен. В заголовке нового стиля содержится вся информация, необходимая для сегментированного исполняемого файла – заголовки таблицы сегментов, ресурсов и имен. Сразу за заголовком находится таблица сегментов. В ней содержится описание каждого сегмента исполняемого файла. Таблица ресурсов. Ресурсами являются все основные объекты интерфейса – диалоговые окна, меню, курсоры, растровые изображения, значки и так далее. Формат таблицы ресурсов (смещения относительно начала входа каждого ресурса). Значения в диапазоне смещений 02-12h повторяются в таблице до тех пор, пока величина по смещению 02h не станет равной нулю. Значения в диапазоне от 0Ah до 12h повторяются столько раз, сколько указано по адресу 04h. Таблица A-6. Таблица входов перемещаемого сегмента Таблица A-7. Таблица входов фиксированного сегмента Таблица резидентных имен. В ней содержатся строки, идентифицирующие экспортируемые функции исполняемого файла. Постоянно находятся в памяти и никогда не сбрасываются на диск. Верхний и нижний регистры различаются, ноль в конце отсутствует. Данные в таблице находятся в виде: – длина строки (равна нулю, если в таблице нет дополнительных строк); – строка резидентного имени (первая строка – имя модуля); – порядковый номер, идентифицирующий строку. Может использоваться в качестве индексного выхода в таблицу. Таблица ссылок на модули. В ней содержится список смещений имен модулей, хранящихся в таблице импортируемых имен. Каждый вход в таблице есть двубайтное последовательное число. Таблица импортируемых имен. В ней записаны имена модулей, импортируемых в исполняемый файл. Каждый вход состоит из двух частей – байта длины строки и собственно строки. Таблица входов. В ней содержатся группы точек входа в исполняемый файл. Эти группы создаются редактором связей и последовательно пронумерованы (начиная с 1). Каждая группа начинается с двухбайтного заголовка, который содержит число входов в группе (00h – конец таблицы) и дополнительную информацию о сегменте (FFh – перемещаемый, FEh – вход относится к константе, определенной внутри модуля, иначе вход является индексом сегмента). Для перемещаемых сегментов каждый вход состоит из шести байт, а для фиксированных – из трех. Таблица нерезидентных имен. Содержит имена экспортируемых функций, содержащихся в исполняемом файле. Эти имена не всегда остаются резидентными в памяти. Структура полностью совпадает со структурой таблицы резидентных имен. Сегменты кода и данных. Если в сегменте кода содержатся вызовы функций, определенных в других сегментах, то для таких вызовов необходимо использовать таблицы перемещений. Они располагаются непосредственно за кодом или данными в сегменте. В двух первых байтах содержится число элементов таблицы. – тип адресации (только сегмент, только смещение, или и то, и другое); – тип перемещения (внутренняя ссылка, импортируемый порядковый номер, импортируемое имя); – номер сегмента или порядковый ID (для внутренних ссылок); – индекс таблицы ссылок или порядковый номер функции; – индекс таблицы ссылок или смещение таблицы имен (для импортируемых имен). Формат заголовка PE-executable EXE-файла В состав старого заголовка входят: – обычный EXE-заголовок (Таблица A-8); – указатель на PE-заголовок (если в ЕХЕ-заголовке в начале таблицы перемещаемых элементов – по смещению 18h – стоит 40h или больше, то слово, расположенное по смещению 3С^ содержит смещение начала PE-заголовка); В состав нового заголовка входят: – PE-заголовок (Таблица A-9); – таблица объектов (Таблица A-10); – таблицы ресурсов, импортируемых и экспортируемых имен, настройки адресов. Таблица A-8. Формат обычного EXE-заголовка в PE-executable EXE-файле Таблица A-9. Формат PE-заголовка Таблица A-10. Формат таблицы объектов Данный текст является ознакомительным фрагментом. Продолжение на ЛитРес Читайте такжеФорматы файлов и форматы кодированияФорматы файлов и форматы кодирования Форматов мультимедийных файлов существует не меньше, чем форматов файлов графических. Как и в случае с интернет-графикой, Web-обозреватели поддерживают далеко не все мультимедийные форматы, а только немногие. (Хотелось бы автору Форматы исполняемых файловФорматы исполняемых файлов Виртуальная память процесса состоит из нескольких сегментов или областей памяти. Размер, содержимое и расположение сегментов в памяти определяется как самой программой, например, использованием библиотек, размером кода и данных, так и Форматы файлов шрифтовФорматы файлов шрифтов Существуют два типа шрифтов: растровые и контурные (контурные шрифты часто называют масштабируемыми). Эти типы шрифтов имеют разные свойства и обрабатываются различными способами. Большинство серверов шрифтов, предназначенных для выполнения в Форматы файлов и форматы кодированияФорматы файлов и форматы кодирования Форматов мультимедийных файлов существует не меньше, чем форматов файлов графических. Как и в случае с интернет-графикой, Web-обозреватели поддерживают далеко не все мультимедийные форматы, а только немногие. (Хотелось бы автору 11.4.2. Форматы файлов шрифтов11.4.2. Форматы файлов шрифтов В недавние времена буквально каждый графический редактор или издательская программа использовали свой формат файлов шрифтов и, как правило, одни программы не поддерживали форматы других. Со временем число реально используемых форматов Форматы графических файловФорматы графических файлов Adobe InDesign может импортировать графические файлы различных форматов – как наиболее распространенные AI, BMP, EPS, GIF, JPEG, PDF, PSD, TIFF, так и более редкие DCS, EMF, PCX, PICT, PNG, SCT (ScitexCT), WMF.Все графические форматы и файлы разделяются по типу информации, которую они Форматы графических файловФорматы графических файлов Любое графическое изображение независимо от того, векторное оно или растровое, может храниться в компьютере исключительно за счет записывания его в отдельный файл. Каждый файл всегда имеет какой-то определенный формат.Формат указывает на то, 3.1.6. Двоичные форматы файлов3.1.6. Двоичные форматы файлов Если в операционной системе применяются двоичные форматы для важных данных (таких как учетные записи пользователей), вполне вероятно, что традиции использования читабельных текстовых форматов для приложений не сформируются. Более подробно 3.1.6. Двоичные форматы файлов3.1.6. Двоичные форматы файлов Если в операционной системе применяются двоичные форматы для важных данных (таких как учетные записи пользователей), вполне вероятно, что традиции использования читабельных текстовых форматов для приложений не сформируются. Более подробно о Глава 4 Форматы графических файловГлава 4 Форматы графических файлов Для хранения растровой графики существует большое количество различных форматов файлов. Среди них есть как универсальные форматы, не привязанные к какой-либо конкретной программе, так и специфические «персональные» форматы растровых Форматы графических файловФорматы графических файлов Формат – это способ записи изображения в виде файла. Существует довольно много форматов графических файлов, однако в большинстве случаев используется всего несколько. Каждый из них имеет характерные особенности, поэтому мы рекомендуем Форматы файловФорматы файлов Существует множество способов сохранить информацию об изображении и, следовательно, множество форматов файлов. Внимание! Чтобы избежать потерь данных, при работе с изображениями сохраняйте их в формате TIFF или в «родном» формате программы-редактора. JPEGВ |