Файлы с расширением .exe являются одними из наиболее распространенных форматов исполняемых файлов в операционных системах Windows. Они содержат инструкции, которые операционная система может выполнять без дополнительной интерпретации.
Эти файлы представляют собой программы или приложения, которые могут быть запущены на компьютере пользователя при двойном щелчке. Именно они позволяют открывать различные программы, игры, установочные файлы и многое другое.
Исполняемые файлы .exe могут содержать в себе не только исходный код программы, но и другие файлы, необходимые для ее работы. Отличительной чертой таких файлов является их способность к автономной работе без дополнительных зависимостей.
Однако следует помнить, что файлы с расширением .exe могут также представлять угрозу для безопасности вашего компьютера, поэтому всегда стоит быть осторожным при открытии неизвестных файлов из сети. Будьте внимательны и проверяйте их на наличие вирусов или вредоносного кода.
Важно помнить, что исполняемые файлы .exe могут быть созданы разработчиками программ, но также могут быть использованы злоумышленниками для атак на ваш компьютер. Поэтому рекомендуется всегда использовать антивирусное программное обеспечение и быть предельно осторожными при открытии файлов неизвестного происхождения.
История и происхождение
- Этот формат файлов используется для хранения исполняемого кода программы, который можно запустить на компьютере.
- Происхождение exe связано с необходимостью хранить все необходимые данные для работы программы в одном файле.
- Информация в exe файлах содержит инструкции для компьютера о том, как открыть и выполнить программу.
Именно благодаря формату exe пользователи могут без проблем запускать различные программы на своих устройствах, достаточно лишь дважды кликнуть на соответствующий файл.
За последние десятилетия формат exe претерпел кардинальные изменения, чтобы стать более безопасным и эффективным для пользователей по всему миру.
Функциональное назначение exe файла
Описание exe формата включает в себя информацию о программе, ее возможностях и способах взаимодействия с пользователем. Этот формат обеспечивает удобство и простоту запуска программ, так как не требует установки дополнительных приложений для работы с ними.
Благодаря exe файлам пользователь имеет возможность запустить программу одним нажатием кнопки, что существенно облегчает его работу. Этот формат позволяет пользователям быстро и удобно получать доступ к различным приложениям, не тратя много времени на настройку и установку.
Используя exe файлы, пользователи могут легко управлять запуском программ, выбирая необходимое приложение и открывая его без лишних сложностей. Благодаря этому формату пользователи могут быстро находить нужные программы и использовать их в повседневной работе.
Элементарная структура exe файлов и их функциональное назначение делают их одним из наиболее популярных форматов исполняемых файлов, используемых на современных компьютерах. Они обеспечивают простой и удобный способ открытия программ, что делает работу с компьютером более эффективной и удобной для пользователей.
Безопасность и угрозы при работе с файлами .exe
В данном разделе мы проследим понятие безопасности в контексте открытия и запуска файлов с расширением .exe. Угрозы могут крыться в самом файле и его содержимом, поэтому важно быть внимательным при работе с данным типом файлов.
Открывая файл .exe, пользователь может столкнуться с различными опасностями, такими как вирусы, трояны, руткиты и другое вредоносное ПО. Эти программы способны повредить компьютер, украсть личные данные или даже вымогать деньги.
Для предотвращения угроз следует использовать антивирусное программное обеспечение, проводить регулярные обновления и сканирования системы. Помните, что безопасность вашего компьютера в ваших руках.
При работе с файлами .exe рекомендуется избегать незнакомых и подозрительных источников загрузки. Тщательно проверяйте файлы на наличие вирусов перед их открытием и запуском.
Не стоит доверять подозрительным ссылкам, рекламе и электронным сообщениям, которые могут содержать вредоносные файлы .exe. Лучше быть бдительными и избегать потенциальных угроз для безопасности вашего компьютера и данных.
Всегда помните, что хорошо обученный пользователь, осведомленный о возможных угрозах, может существенно снизить риск заражения своей системы и обеспечить ее безопасность в целом.
Применение в повседневной жизни
Файлы с расширением exe встречаются нам в повседневной жизни чаще, чем мы думаем.
Этот формат используется для установочных программ, приложений, игр и других программ, которые мы запускаем на наших устройствах.
Благодаря exe-файлам мы можем скачивать и устанавливать различное программное обеспечение для компьютера, ноутбука или смартфона.
Мы запускаем exe-файлы, чтобы установить новые игры, приложения для работы или развлечения, а также обновить уже установленное программное обеспечение.
Кроме того, exe-файлы могут использоваться для запуска различных скриптов, автоматизации задач и выполнения других действий, связанных с программированием и разработкой ПО.
Благодаря exe-файлам мы имеем доступ ко множеству возможностей, которые делают нашу повседневную жизнь более удобной и интересной.
Основные характеристики и специфика
Файлы с расширением .exe содержат исполняемый код, который может выполняться прямо на компьютере пользователя. Этот код обычно связан с определенной программой или приложением и позволяет выполнить определенные действия.
Ошибка в исполняемом файле exe может привести к ненадежной работе программы или даже к возможному вредоносному воздействию на компьютер пользователя. Поэтому важно быть внимательным при работе с такими файлами и следить за их подлинностью.
При открытии файла exe система операционной системы Windows сначала проверяет его подлинность и целостность, прежде чем разрешить его выполнение. Это обеспечивает безопасность пользователя и защиту от потенциальных угроз.
Описание | Исполняемые файлы формата exe содержат машинный код программы, который выполняется непосредственно операционной системой. |
Формат | Файлы exe имеют специфический формат, который позволяет операционной системе распознать и запустить программу, содержащуюся в файле. |
Расширение | Расширение .exe указывает на то, что файл предназначен для выполнения и может содержать программный код, необходимый для работы конкретной программы. |
Знание основных характеристик и специфики исполняемых файлов формата exe позволит пользователям обеспечить безопасность своих данных и улучшить работу с программным обеспечением на своем компьютере.
Защита от нежелательного использования exe-файлов
Расширение exe может быть опасным при открытии на компьютере, поэтому важно знать способы защиты от нежелательного использования таких файлов.
Первым шагом является использование антивирусного программного обеспечения для сканирования всех загружаемых файлов с расширением exe.
Важно также быть внимательным при скачивании файлов из ненадежных источников, так как вредоносное ПО часто маскируется под exe-файлы.
Другой способ защиты — использование программ и приложений, которые могут автоматически блокировать запуск exe-файлов из ненадежных источников.
Дополнительно, можно ограничить доступ пользователей к определенным папкам, в которых могут быть храниться exe-файлы, установив соответствующие права доступа.
Время на прочтение7 мин
Количество просмотров12K
Написание кода на любом языке программирования сопряжено с исследованием особенностей, которые позволяют быстро и эффективно написать алгоритм. В этой статье попробуем рассказать чуть больше о структуре файлов, которые получаются в результате компиляции приложений, написанных на языке программирования C#.
Исполняемые файлы Windows
Определимся с областью изучения. C# практически намертво спаян с операционной системой Windows и её подсистемой .NET, хотя и есть версия .NET Core, которая предпринимает попытки стать кроссплафторменной. В нашей статье будем говорить о той части, которая относится именно к Windows.
Итак, любой файл, который будет получаться после компиляции кода на C#, это нативный исполняемый файл PE или PE+ (зависит от выбранной разрядности процессора). Грубо говоря, создание именно исполняемого файла — это просто способ заставить операционную систему воспринимать приложения для .NET как нативное приложение, написанное на таких языках как C++/ASM и т.д.
Сам по себе полученный исполняемый файл можно описать как набор служебных данных — заголовков
и полезных данных — секций
. Общую структуру файла очень здорово описал хабровчанин здесь. Труд был создан еще в далеком 2015 году, но не потерял своей актуальности. Для полноты картины, которую придется изучать под микроскопом, приведу общий и сокращенный вид того самого исполняемого файла:
Представленный выше файл является шаблоном, который должны создавать компиляторы, если необходимо запускать приложение. Стоит сказать, что такую структуру в операционной системе используют все исполняемые файлы, перечислим наиболее часто встречаемые их типы:
-
sys — файлы драйверов
-
exe — файлы приложений
-
dll — расшариваемые библиотеки и драйвера
-
cpl — апплеты, которые могут использоваться для расширения функционала приложений в Windows. Для примера можно набрать WIN+R и вести control.cpl появится интерфейс для настройки системы.
-
…
Но как операционная система понимает, к какому типу файлов в итоге отнести, то что отдает пользователь или зовет приложение? Ответ очень прост, в структуре PE файла существует ряд полей, которые могут быть использованы для того чтобы определить что делать с файлом. Вот некоторые из них:
-
Characteristics
его описание можно найти тут -
Subsystem
, его описание так же можно обнаружить по ссылке выше
Оба этих поля дают возможность понять, какой тип файла придется разбирать и какая подсистема Windows отвечает за его работоспособность. Да, в Windows рекомендованный путь разработки — переиспользование библиотек, которые предоставляются сразу с операционной системой. Наборы библиотек объединяются в подсистемы, одна из них как раз платформа .NET. Кстати, для нее константы не найдете в документации, её там нет.
Для примера сравним 2 файла: первый создан с помошью компилятора для C++, а второй — компилятором C#. (Естественно, для тестов будем брать компиляторы Visual Studio).
Так как файл PE — это бинарный формат, поэтому нам придется прибегнуть к использованию софта, умеющего его разбирать. Для скрина будем использовать Explorer Suite.
На картинке представлены 2 исполняемых файла, слева для создания использовался C#, справа C++. Рассматривать будем в первую очередь части, которые относятся именно к служебной информации, а именно заголовки. Как видно, параметры одинаковые. Что наталкивает на мысль — «А как же операционка понимает, что это .NET?». Ответ стоит искать в секции, которая во многих компиляторах используется для заточения кода, который и будет выполнять алгоритм приложения. Называется эта секция text
. В обычном случае в этой секции находится только код и константы, которые он использует, однако если приложение написано для .NET, то в начале секции будет дополнительный набор служебных данных. Здесь их называют стримами и они содержат в структуре данные, которые могут описать всё, чем пользуется платформа:
-
#~ — стрим метаданных, тут все вперемешку: данные о типах, методах и т.д.
-
#Strings — строки, которые содержат информацию из пространств имен их членов и имен
-
#US — строки, которые были созданы программистом и используются в методах
-
#GUID — GUID данные, которые используются в приложении
-
#Blob — по сути, сырые данные, на которые могут ссылаться другие стримы
Вот такая матрешка. Все это парсится автоматически операционной системой и в момент, когда все разобрано, запускается платформа .NET. Процесс запуска тоже реализован весьма интересно. .NET это по сути виртуальная машина, которая понимает команды, отличные от того, что привык разбирать железный процессор современных устройств. Поэтому, чтобы выполнить код, в каждый .NET файл вставляется специальный трамплин, который запускает начальную функцию виртуальной мащины .NET. Если открыть исполняемые файлы в дизассемблерных приложениях и перевести курсор на первые команды, например в Hiew, то можно увидеть вот такие команды. Слева приложение написанное на C#, справа приложение созданное на C++:
Как видно, .NET даже понятнее, чем то, что писалось на C++ для чтения невооруженным глазом. Теперь о грустном. По причине такой структуры C# исполняемого файла, вернуть исходный читаемый код из уже созданного приложения очень просто. Для этого можно использовать любой декомпилятор, например dnSpy. Декомпилятор вернет все методы и их названия и даже можно будет с этим файлом работать из-под отладчика. Слева исходный код приложения, справа декомпилированная версия.
С одной стороны, такое положение вещей очень удобно. Не всегда надо обращаться к настоящим исходникам и можно искать и исправлять проблемы, но это так же открывает большой простор для нелегитимного переиспользования кода. Как это исправить? Общий рецепт может не понравиться тем, кто любит писать стабильный код — использование методов обфускации, шифрования и упаковки.
В современном мире все подобные подходы реализуются так называемыми протекторами и некоторыми пакерами. Попробуем реализовать такой обфускатор и поищем возможные варианты запаковывания результирующего файла.
Способы защиты приложений
Для защиты алгоритма приложений можно разделить на несколько подходов, причем каждый из них можно развивать до совершенства. Различают несколько видов защиты:
-
запутывание кода путем изменения имен функций — понять алгоритм из чтения такого исходника проблематично, но возможно
-
запутывание кода путем добавления мусорных конструкций. Добавленные конструкции занимают процессорное время, но никак не влияют на конечный результат
-
запутывание алгоритма бесконечными безусловными и условными прыжками — серьезно запутывает задачу отладки
У этих подходов есть общий термин — обфускация.
-
шифрование частей исполняемого файла или самых важных с точки зрения алгоритма частей приложения
-
упаковка частей исполняемого файла или самых важных с точки зрения алгоритма частей
Отличие последних двух пунктов заключается в том, что при шифровании основная задача не дать прочесть зашифрованные данные и без знания ключа алгоритма ничего нельзя выполнить, а в случае упаковки основная задача алгоритма уменьшение размера данных.
Эти подходы можно объединить. Попробуем создать приложение, которое позволит использовать хотя бы один способ зашиты — переименование методов.
Mono.cecil
Применение методов защиты возможно на разных этапах создания программного обеспечения. Считается, что самый эффективный способ это интеграция защиты в исходный код. Но для этого подхода нужно создавать целые библиотеки функций, которые самостоятельно будут работать с низкоуровневым представлением файла и команд приложения. Процесс может затянуться, поэтому будем реализовывать подход с преобразованием уже скомпилированного приложения. В качестве инстумента будем использовать проект, который позволяет программно работать с уже созданными структурами .NET приложения.
Библиотека выбрана не случайно, именно при помощи ее создаются приложения, которые декомпилируют уже собранные проекты. Почему это возможно? .NET приложение в результате компиляции представляет собой набор команд, которые написаны на специальном ассемблере — IL. Конструкции этого ассемблера напрямую могут быть связаны с конструкциями языков программирования .NET платформы. Поэтому достаточно просто получать исходный код приложений после компиляции. Так же, кстати, можно и переводить приложения автоматически на другие языки платформы.
Для использования библиотеки можно загрузить NuGet пакет, для этого достаточно прописать Mono.Cecil в поиске и установить пакет для использования в проекте.
Для преобразований будем использовать простую программу:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestApp2
{
internal class Program
{
static int sumTwoNumbers(int a, int b)
{
return a + b;
}
static int multiple(int a, int b)
{
return a * b;
}
static void Main(string[] args)
{
Console.WriteLine(sumTwoNumbers(4, 3));
Console.WriteLine(multiple(4, 3));
}
}
}
Приложение для выполнения обфускации может выглядеть так:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Mono.Cecil;
namespace TestApp
{
internal class Program
{
private static Random random = new Random();
public static string RandomString(int length)
{
const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
return new string(Enumerable.Repeat(chars, length)
.Select(s => s[random.Next(s.Length)]).ToArray());
}
static void Main(string[] args)
{
AssemblyDefinition asm = AssemblyDefinition.ReadAssembly("TestApp2.exe");
foreach (TypeDefinition t in asm.MainModule.Types)
{
if (t.Name == "Program")
{
foreach (MethodDefinition m in t.Methods)
{
if (m.Name == "sumTwoNumbers" || m.Name == "multiple")
{
m.Name = RandomString(5);
}
}
}
}
asm.Write("TestApp2_obf.exe");
}
}
}
Смотрим, что получилось через dnspy: слева исходный вид, справа пропатченная версия:
Приложения, как и ожидалось, работают одинаково, однако стоит упомянуть, что для корректного запуска такого приложения лучше пользоваться Release версией, там нет отладочных вставок, которые могут аварийно завершать исправленный файл.
Исправление названий коснулось только функций, которые были созданы программистом, при желании можно включить и стандартные имена. Продолжить изменение можно переключившись на названия переменных. Таким образом можно минимально усложнить восстановление алгоритма приложения.
Статью написал Александр Колесников в преддверии старта курса «C# Developer. Professional».
Всех желающих приглашаем на бесплатное demo-занятие «Что полезного в новых версиях C#?». На этом открытом занятии мы разберем ключевые нововведения .Net 4.8 и познакомимся с полезными и часто используемыми новшествами .Net 4.7.2. Если интересно, записывайтесь.
From Wikipedia, the free encyclopedia
«EXE» redirects here. For other uses, see Exe.
Windows Executable File
Filename extension |
.exe |
---|---|
Internet media type |
|
Magic number | 0x4d 0x5a |
Developed by | Microsoft |
Type of format | Executable file |
Container for | MZ, NE, LX, LE, PE, PE32+, W3, W4, DL, MP, P2, P3 |
Open format? | No |
For Microsoft Windows, OS/2, and DOS, .exe is the filename extension that denotes a file as being executable – a computer program – containing an entry point.[1]
In addition to being executable (adjective) such a file is often called an executable (noun) which is sometimes abbreviated as EXE.
The file format of an EXE file varies by operating system version.
An operating system cannot use an EXE file unless it is formatted for it. Note that some formats support multiple operating systems.
- 16-bit DOS MZ executable (MZ)
- The original DOS executable file format. These formats can be identified by the letters «MZ» at the beginning of the file in ASCII. Later formats may contain an MZ DOS stub header.[2]
- 16-bit New Executable (NE)
- Introduced with the multitasking MS-DOS 4.0 and also used by 16-bit OS/2 and Windows, NE can be identified by the «NE» in ASCII.
- 32-bit Linear Executable (LX)
- Introduced with OS/2 2.0, these can be identified by the «LX» in ASCII. These can only be run by OS/2 2.0 and higher.[3]
- Mixed 16/32-bit Linear Executable (LE)
- Introduced with OS/2 2.0, these can be identified by the «LE» in ASCII.
VxD drivers on Windows 3.x and Windows 9x also use LE format.
- 32-bit Portable Executable (PE)
- Introduced with Windows NT, they are fat binaries consisting of a DOS-specific and a Windows-specific part. The DOS-specific part (dubbed DOS stub) is a legitimate 16-bit DOS program. Microsoft C++ linker, by default, uses a minimal DOS stub that prints the following message: «This program cannot be run in DOS mode.»[2][4][5] Windows ignores the DOS stub and executes the Windows-specific portion that starts with the «PE\0\0» ASCII sequence (letters «PE» and two null bytes).[2] With some linkers, it is possible to specify a custom DOS stub.[2][4][6] Indeed, there are a few dual programs, such as regedit in Windows 95[7] and old versions of WinZIP self extractors.
- 64-bit Portable Executable (PE32+)
- Introduced by 64-bit versions of Windows, this is a PE file with wider fields. In most cases, code can be written to simply work as either a 32 or 64-bit PE file.[8] This file also includes a DOS stub.[6]
There are other EXE formats, including but not limited to W3 (a collection of LE files, only used in WIN386.EXE), W4 (a compressed collection of LE files, only used in VMM32.VXD), DL, MP, P2, P3 (last three used by Phar Lap extenders).[9]
- Comparison of executable file formats
- Executable compression
- IExpress
- List of file formats § Object code, executable files, shared and dynamically linked libraries
- CMD file (CP/M)
- Windows Installer files (msi)
- ^ «.EXE File Extension». FileInfo — The File Extensions Database. Sharpened Productions. Retrieved 2019-08-16.
- ^ a b c d «PE Format». Windows App Development. Microsoft. 2019-08-25.
- ^ «OS/2 Operating System». operating system documentation project. 2004-04-03. Retrieved 2014-02-13.
- ^ a b «/STUB (MS-DOS Stub File Name)». C/C++ Building Reference (Visual Studio 2022 ed.). Microsoft. Retrieved 2014-01-10.
- ^ Sedory, Daniel B. (2004-10-12). «DOS Stub Program». The Starman’s Realm. Self-published. Retrieved 2014-01-10.
- ^ a b Ellermann, Frank (2014-01-22). «dostub.exe». Purl.net. Retrieved 2014-01-24.
- ^ «Using Registry Editor in Real Mode». Support. Microsoft. 2006-11-15. Archived from the original on 2014-01-15. Retrieved 2014-01-10.
Windows 95 includes a Registry Editor program (Regedit.exe) that runs in both the real-mode MS-DOS environment and in the protected-mode Windows environment. When you need to modify the registry without starting Windows 95, use Registry Editor in real mode. Note that the switches listed in this article only work in real-mode.
- ^ Pietrek, Matt (February 2002). «An In-Depth Look into the Win32 Portable Executable File Format». MSDN Magazine. Microsoft.
- ^ Brown, Ralf (2000-07-16). «Int 21/AH=4Bh». Ralf Brown’s Interrupt List. Archived from the original on 2015-05-19. Retrieved 2018-10-30.
- Paul, Matthias R. (2002-10-07) [2000]. «Re: Run a COM file». Newsgroup: alt.msdos.programmer. Archived from the original on 2017-09-03. Retrieved 2017-09-03. Second reply
- Dependency Walker
- MZ EXE header format
- PE Explorer
Аннотация: Управление памятью в Windows. Обзор структуры исполняемых файлов в формате Portable Executable (PE). Пример генерации PE-файла.
Формат исполняемых файлов
Исполняемый файл (executable file) — это файл, который может быть загружен в память загрузчиком операционной системы и затем исполнен. В операционной системе Windows исполняемые файлы, как правило, имеют расширения «.exe» и «.dll». Расширение «.exe» имеют программы, которые могут быть непосредственно запущены пользователем. Расширение «.dll» имеют так называемые динамически связываемые библиотеки (dynamic link libraries). Эти библиотеки экспортируют функции, используемые другими программами.
Для того чтобы загрузчик операционной системы мог правильно загрузить исполняемый файл в память, содержимое этого файла должно соответствовать принятому в данной операционной системе формату исполняемых файлов. В разных операционных системах в разное время существовало и до сих пор существует множество различных форматов. В этой главе мы рассмотрим формат Portable Executable (PE). Формат PE — это основной формат для хранения исполняемых файлов в операционной системе Windows. Сборки .NET тоже хранятся в этом формате.
Кроме того, формат PE может использоваться для представления объектных файлов. Объектные файлы служат для организации раздельной компиляции программы. Смысл раздельной компиляции заключается в том, что части программы (модули) компилируются независимо в объектные файлы, которые затем связываются компоновщиком в один исполняемый файл.
А теперь — немного истории. Формат PE был создан разработчиками Windows NT. До этого в операционной системе Windows использовались форматы New Executable (NE) и Linear Executable (LE) для представления исполняемых файлов, а для хранения объектных файлов использовался Object Module Format (OMF). Формат NE предназначался для 16-разрядных приложений Windows, а формат LE, изначально разработанный для OS/2, был уже 32-разрядным. Возникает вопрос: почему разработчики Windows NT решили отказаться от существующих форматов? Ответ становится очевидным, если обратить внимание на то, что большая часть команды, работавшей над созданием Windows NT, ранее работала в Digital Equipment Corporation. Они занимались в DEC разработкой инструментария для операционной системы VAX/VMS, и у них уже были навыки и готовый код для работы с исполняемыми файлами, представленными в формате Common Object File Format (COFF). Соответственно, формат COFF в слегка модифицированном виде был перенесен в Windows NT и получил название PE.
В «.NET Framework Glossary» сказано, что PE — это реализация Microsoft формата COFF. В то же время в [5] утверждается, что PE — это формат исполняемых файлов, а COFF — это формат объектных файлов. Вообще, мы можем наблюдать путаницу в документации Microsoft относительно названия формата. В некоторых местах они называют его COFF, а в некоторых — PE. Правда, можно заметить, что в новых текстах название COFF используется все меньше и меньше. Более того, формат PE постоянно эволюционирует. Например, несколько лет назад в Microsoft отказались от хранения отладочной информации внутри исполняемого файла, и поэтому теперь многие поля в структурах формата COFF просто не используются. Кроме того, формат COFF — 32-разрядный, а последняя редакция формата PE (она называется PE32+) может использоваться на 64-разрядных аппаратных платформах. Поэтому, видимо, дело идет к тому, что название COFF вообще перестанут использовать.
Интересно отметить, что исполняемые файлы в устаревших форматах NE и LE до сих пор поддерживаются Windows. Исполняемые файлы в формате NE можно запускать под управлением NTVDM (NT Virtual DOS Machine), а формат LE используется для виртуальных драйверов устройств (VxD).
Почему в названии формата PE присутствует слово «portable» («переносимый»)? Дело в том, что Windows NT была реализована не только для платформы Intel x86, но и для платформ MIPS R4000, DEC Alpha и PowerPC. И во всех реализациях для хранения исполняемых файлов использовался формат PE. При этом речь не шла о достижении двоичной совместимости между этими платформами, то есть exe-файл, предназначенный для выполнения на платформе Intel x86, нельзя было запустить на PowerPC. Важно понимать, что переносимость формата еще не означает переносимость исполняемых файлов, записанных в этом формате. Формат PE переносим в том смысле, что он слабо зависит от типа процессора и поэтому подходит для разных платформ (в том числе и для платформы .NET).
Далее в этой главе мы не будем затрагивать 64-разрядный вариант формата PE, потому что в настоящее время сборки .NET хранятся в прежнем 32-разрядном формате. Однако отметим, что 64-разрядный PE очень слабо отличается от 32-разрядного. Основное отличие касается разрядности полей структур PE-файла.
Материал из РУВИКИ — свободной энциклопедии
Исполняемый файл DOS MZ | |
---|---|
Расширение | .exe |
Сигнатура | MZ или ZM |
Разработчик | Microsoft |
Тип формата | двоичный, исполняемый, объектный, динамическая библиотека |
Расширен из | .COM |
Развит в |
New Executable Linear Executable Portable Executable |
.EXE (сокр. англ. executable — исполнимый) — расширение исполняемых файлов, применяемое в операционных системах DOS, Windows, Symbian OS, OS/2 и в некоторых других, соответствующее ряду форматов. Кроме объектного кода может содержать различные метаданные (ресурсы, цифровая подпись[1]).
- MZ — 16-битный формат, основной формат файлов .EXE в DOS.
- EXE-файлы для Windows и OS/2 используют другие форматы для основной части программы, но всё равно начинаются с заглушки в формате MZ, которая, как правило, при попытке запустить файл в DOS выводит сообщение
This program cannot be run in DOS mode.
(«Эту программу невозможно запустить в режиме DOS») и завершает выполнение, хотя теоретически может запускать некий произвольный код, работоспособный в DOS.
- EXE-файлы для Windows и OS/2 используют другие форматы для основной части программы, но всё равно начинаются с заглушки в формате MZ, которая, как правило, при попытке запустить файл в DOS выводит сообщение
- NE — 16-битный формат, использовался в Windows 3.x[2], OS/2 и MS-DOS.
- LE — смешанный 16- и 32-битный формат, ранее использовался в OS/2 и Windows (VxD).
- LX — 32-битный формат, используется в OS/2.
- PE — 32- и 64-битный формат, используется в современных версиях Windows, начиная с Windows NT и Windows 95.
Файл EXE, создаваемый компоновщиком, состоит из двух частей:
- управляющая информация для загрузчика;
- загрузочный модуль.
Информация для загрузчика, описанная ниже, расположена в начале файла и образует так называемый заголовок. Сразу за ним следует тело загрузочного модуля, представляющее собой копию образа памяти задачи, построенной компоновщиком.
Стандартная часть заголовка имеет следующий формат[3]:
- 00-01 4D5A — сигнатура файла .EXE;
- 02-03 Длина образа задачи по модулю 512 (то есть число полезных байт в последнем блоке). Компоновщики версий до 1.10 помещали в это поле 04; если оно имеет такое значение, его рекомендуется игнорировать);
- 04-05 Длина файла в блоках;
- 06-07 Число элементов таблицы настройки адресов;
- 08-09 Длина заголовка в 16-байтных параграфах. Используется для выяснения начала тела загрузочного модуля;
- 0A-0B Минимальный объём памяти, которую нужно выделить после конца образа задачи (в 16-байтных параграфах);
- 0C-0D Максимальный объём памяти, которую нужно выделить после конца образа задачи (в 16-байтных параграфах);
- 0E-0F Сегментный адрес начала стекового сегмента относительно начала образа задачи;
- 10-11 Значение SP при входе в задачу;
- 12-13 Контрольная сумма — ноль минус результат сложения без переноса всех слов файла;
- 14-15 Значение IP (счетчика команд) при входе в задачу;
- 16-17 Сегментный адрес начала кодового сегмента относительно начала образа задачи;
- 18-19 Адрес первого элемента таблицы настройки адресов относительно начала файла;
- 1A-1B Номер сегмента перекрытий (0 для корневого сегмента программы).
Далее следует таблица настройки адресов. Таблица состоит из элементов, число которых записано в байтах 06-07. Элемент таблицы настройки состоит из двух полей: 2-байтного смещения и 2-байтного сегмента, и указывает слова в загрузочном модуле, содержащее адрес, который должен быть настроен на место памяти, в которое загружается задача.
Настройка производится следующим образом:
- В области памяти после резидентной части выполняющей загрузку программы строится префикс программного сегмента (PSP);
- Стандартная часть заголовка считывается в память;
- Определяется длина тела загрузочного модуля (разность длины файла 04-07 и длины заголовка 08-09 плюс число байт в последнем блоке 02-03). В зависимости от признака, указывающего загружать задачу в конец памяти или в начало, определяется сегментный адрес для загрузки. Этот сегмент называется начальным сегментом;
- Загрузочный модуль считывается в начальный сегмент;
- Таблица настройки порциями считывается в рабочую память;
- Для каждого элемента таблицы настройки к полю сегмента прибавляется сегментный адрес начального сегмента. В результате элемент таблицы указывает на слово в памяти, к которому прибавляется сегментный адрес начального сегмента;
- Когда таблица настройки адресов обработана, в регистры SS и SP записываются значения, указанные в заголовке, а к SS прибавляется сегментный адрес начального сегмента. В ES и DS записывается сегментный адрес начала PSP. Управление передается по адресу, указанному в заголовке (байты 14-17).
При обращении к нерезидентной команде или вызове программы операцией Exec, DOS определяет минимальный адрес, начиная с которого может быть загружена соответствующая программа. Эта область называется программным сегментом.
По смещению 0000 в программном сегменте DOS формирует префикс программного сегмента (PSP). Сама программа загружается по смещению 0100.
Программа завершается переходом по адресу 0000 в программном сегменте, выполнив INT 20, или выполнив INT 21 с AH=0 или AH=4C, или обратившись к подпрограмме по адресу 0050 в программном сегмент с AH=0 или AH=4C.
Примечание: при завершении иначе, чем операцией 4C, программа должна предварительно заслать в CS адрес начала своего программного сегмента.
Все четыре способа возвращают управление в резидентную часть COMMAND.COM (при этом операция 4C передает код завершения). Все четыре способа приводят к продолжению выполнения программы, обратившейся к операции Exec (4B). При этом вектора прерываний 22, 23 и 24 (завершение, Ctrl-Break, фатальная ошибка обмена) восстанавливаются из Префикса Программного сегмента возобновляемой задачи. Затем управление передается по адресу завершения. Если программа возвращается в COMMAND.COM, то управление передается в нерезидентную часть. Если это происходит во время выполнения командного файла, оно продолжается, иначе COMMAND выдает на терминал приглашение и ждет ввода следующей команды.
Когда загруженная программа получает управление, имеют место следующие условия:
Для всех программ:
- В префиксе программного сегмента по смещению 2C передается адрес среды. Среда представляет собой последовательность строк ASCIIZ, вида параметр=значение. Общая длина строк среды не более 32 Кбайт; среда начинается с границы параграфа. После последней строки следует нулевой байт. Среда, передаваемая задаче от COMMAND, содержит, как минимум, параметр COMSPEC=(значение этого параметра — полное имя файла, содержащего используемый COMMAND.COM). Она также содержит значения, установленные командами PATH, PROMPT и SET. Передаваемая среда является копией среды родительского процесса. Если задача остается резидентом, то последующие команды PATH, PROMPT и SET не будут воздействовать на её среду.
- По смещению 0050 в префиксе программного сегмента содержится программа обращения к операциям DOS. Таким образом, занеся в AH номер операции, программа может вызвать процедуры (LCALL) по адресу PSP + 50, а не обращаться к прерыванию 21.
- Адрес буфера DTA установлен на PSP +80.
- Блоки управления файлами, расположенные по смещениям 5C и 6C в префиксе программного сегмента заполняются в соответствии с параметрами командной строки. При этом если соответствующий параметр включает имя каталога, в FCB заносится только код устройства, имя файла формируется неправильно.
- Неформатная часть, начинающаяся со смещения 81, содержит символы командной строки после имени команды, включая все пробелы и разделители. По смещению 80 помещена длина этой строки. Если командная строка включает параметры переназначения (на них указывают символы > и <) они не попадают сюда, так как переназначение прозрачно для программ.
- Слово по смещению 6 содержит число байт в данном сегменте.
- Регистр AX указывает, правильно ли заданы имена устройств в параметрах:
- AL = FF — имя устройства для первого параметра задано неверно, иначе AL = 00;
- AH = FF — имя устройства для первого параметра задано неверно, иначе AH = 00.
Для программ .EXE:
- DS и ES указывают на начало префикса программного сегмента.
- Регистры CS, IP, SS и SP получают значения, указанные компоновщиком.
Для программ .COM:
- Все четыре сегментных регистра указывают на префикс программного сегмента.
- Программе выделяется вся свободная память. Если программа запускает другие программы операцией Exec, то она должна освободить для неё часть памяти операцией Setblock (4A)
- Счетчик команд IP получает значение 0100H.
- Регистр SP указывает на конец программного сегмента. Длина сегмента в ячейке 6 префикса уменьшается на 0100H, чтобы освободить пространство для стека такого размера.
- На вершину стека помешается нулевое слово.
- ↑ Windows Authenticode Portable Executable Signature Format (англ.) (недоступная ссылка — история). Дата обращения: 11 декабря 2009. Архивировано 1 марта 2012 года.
- ↑ How to open a .DLL or .EXE file in Resource Editor (англ.) (недоступная ссылка — история). Дата обращения: 11 декабря 2009. Архивировано 1 марта 2012 года.
- ↑ Load Windows Programs From the DOS Prompt With WINSTART // PC Mag. — № 30 июня 1992.
- EXE Format (англ.) — формат заголовка MZ