Windows exe file format

Файл формата exe: чем открыть, описание, особенности

EXE – распространенный файловый формат еще со времен ОС MS-DOS. Рассмотрим, что это за файлы, их наз.

EXE – распространенный файловый формат еще со времен ОС MS-DOS. Рассмотрим, что это за файлы, их назначение и задачи, какими программами запускаются, на что обратить внимание при работе с ними.

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

Формат EXE

EXE применяется для названия файлов-исполнителей. Это сокращение английского «executable files» – исполняемый файл. Используется в операционных системах Microsoft Windows, MS-DOS. Его задача – запуск инсталляции (деинсталляции) софта на устройство. Для этого в нем записан сценарий и код, которые запустят процесс.

В файле EXE находятся:

  • Стартовый блок установки.
  • Данные для загрузчика файла.
  • Ресурсы программы – графические, медиа-элементы в сжатом виде.
  • Формы объектов – иконки программ, листы.

При открытии файла запускается автоматический процесс распаковки компонентов папки с приложением или загрузочного диска. Типичные примеры файлов .EXE – Setup.exe, Install.exe. Они входят в состав разных программ: игр, офисных и графических редакторов, других.

Файл может быть закодирован и сжат архиватором в самораспаковывающийся архив. Инсталляция проводится в ту же директорию или в указанную пользователем.

Создание файлов .EXE

Формат разработан в 1981 году для ОС MS-DOS. Пришел на смену формату .COM. Преимуществом было отсутствие ограничений и полноценное использование адресного пространства ЭВМ. Модернизации в формате происходили по мере появления новых компьютеров IBM PC с виртуальной памятью, новыми режимами переадресации и расширенной функциональностью. Обновленный и расширенный, формат по-прежнему применяется в современных Microsoft Windows.

Открываем EXE расширение

На персональном компьютере с ОС Microsoft Windows затруднений при открытии файла не возникает (об исключениях ниже). Сложности будут, если у пользователя Linux, Mac OS или мобильное устройство. Частый вопрос – как открыть EXE файл для редактирования или просмотра. Разбираемся по порядку.

На компьютере

Как открыть файл .EXE зависит от операционной системы устройства. Если это версии ОС Microsoft Windows, то сложностей быть не должно – под эту ОС файлы и разрабатывались. В основном они запускаются автоматически, для просмотра содержимого можно применить ряд утилит. Сложнее задача решить на ОС Linux или Mac. Но и тут выходы есть. Разберем подробней.

ОС Microsoft Windows 7

Для запуска применяем двойной щелчок манипулятора. Файл начнет устанавливаться и распаковываться (если это архив). Для просмотра содержимого без инсталляции подойдут утилиты Windows:

  • 7Zip – утилита для сжатия данных. Нужный файл выбирается при помощи пункта меню архиватора.
  • VMware ThinApp – софт для просмотра и переноса программ на другие платформы.
  • Microsoft Visual Studio – программа для разработки приложений.
  • IcoFX – утилита для просмотра, изменения значков из файловых ресурсов.

Для редактирования файлов .EXE подойдет Resource Hacker и аналогичные программы. Это редактор с функцией доступа в исполнительные файлы (.EXE, .DLL) для просмотра и замены в них данных.

ОС Microsoft Windows 10

Программы и принцип применения аналогичны, описанным выше. Сложность может быть в некорректном редактировании реестра Windows. Поможет модификация конфигурационного Reg-файла. Для него скачивается архив, соответствующий версии ОС Microsoft Windows, он распаковывается и после перезагрузки ПК файл .EXE должен открываться.

ОС Mac

На ПК с этими ОС напрямую открыть и запустить файл с форматом .EXE невозможно. Потребуются программы-эмуляторы, которые запустят Windows и ее приложения на ОС Mac:

Читайте также:  Очередность автозагрузки windows 10

Windows приложения работают с эмуляторами без сбоев, для переключения на установленную на компьютере ОС не нужно перезагружать ПК.

ОС Linux

Как и ОС Мас напрямую из Linux открыть .EXE не удастся. Применяются программы-эмуляторы Windows, указанные выше. После запуска виртуального сеанса Windows, файл будет открыт.

ОС Android

Как открыть EXE файл на Андроиде при том, что формат не предназначен для работы с ним? Структура и состав файлов EXE другой, прямой запуск невозможен. Есть два способа открыть файл:

  • При помощи удаленного доступа.
  • С программой-эмулятором Microsoft Windows.

Второй вариант проще. К таким утилитам относятся: BOCHS, Limbo, QEMU и другие. Принцип действий идентичен: скачать и установить приложение на мобильное устройство, запустить утилиту.

Возможные проблемы с файлами .EXE

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

Файлы .EXE могут не работать, если рассчитаны на другую версию ОС Windows. Решение – в разделе «Свойства» файла зайти в пункт «Совместимость» и вручную изменить версию ОС. Не в 100% случаев, но такие действия помогают.

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

Статья [0x01] Исследуем Portable Executable (EXE-файл) [Формат PE-файла]

Доброго времени суток, форумчане. Сегодня, мы немного поговорим, рассмотрим и изучим под микроскопом структуру исполняемых файлов Windows ( Portable EXEcutable , или просто PE ), а в следующих статьях изучим технику модифицирования (инфицирования) PE-файлов, для того, чтобы исполнять свой собственный код после запуска чужого исполняемого файла (кстати, эта техника используется многими вирусами, для собственного «паразитического» распространения) и другие «хаки» с использованием знаний о структуре PE.

Portable Executabe файл (PE-файл) — это отдельный исполняемый модуль с расширением .exe (или .dll), получаемый в процессе сборки (компиляции и линковкии). В него включены код, ресурсы (иконки и другие данные), библиотеки, данные программы и т.д..

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

Как мы можем увидить, исполняемый файл состоит из двух основных частей:

  1. Заголовки
  2. Секции

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

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

Давайте изучим по-порядку какие есть заголовки и что в них указано. Заголовками PE-файла являются следующие заголовки в указанном порядке:

  1. DOS заголовок
  2. Заглушка DOS
  3. PE заголовок
  4. Таблица секций

Начнём наше приключение с изучения DOS заголовка.

Как я и сказал, заголовки хранят необходимую информацию для загрузки PE-файла. Поэтому данный заголовок является обязательным для загрузки PE-файла, хоть и не несёт в себе большой смысловой информации.

Заголовок состоит из полей, как список состоит из пунктов свойств. Каждый пункт хранит в себе какое-либо значение. Естественно, в файле всё это представленно в байтовом представлении. Не все поля нужны для загрузки (запуска) PE-файла. Поэтому комментировать и рассматривать мы будем только поля, необходимые для загрузки файла в память.

Читайте также:  Hkey current user software microsoft windows currentversion policies explorer

Вот его структура на языке C/C++.

Нас интересуют только первое ( e_magic ) и последнее поле ( e_lfanew ) этого заголовка. Они является самыми важными и влияют непосредственно на загрузку PE-файла.

    e_magic
    Двухбайтовое поле e_magic хранит в себе специальную сигнатуру. Эта сигнатура нужна, чтобы указать что это действительно исполняемый файл. Вот она — «MZ». Каждый PE-файл обязан начинаться с неё. Если это не так, файл просто не запустится.
  • e_lfanew
    Четырёхбайтовое поле e_magic хранит в себе смещение до заголовка PE. То есть хранит, количество байтов, которое нужно отсчитать с начала файла, для того, чтобы попасть прямо к PE-заголовку, т.е. проще говоря, адрес PE-заголовка относительно начала файла. Только этот адрес хранится в обратном порядке. Например, на изображении ниже 08 01 00 00 — это 00 00 01 08 (0x108) наоборот. Почему наоборот? Не будем углубляться, но скажу, что компьютеру так легче работать с данными.
  • Я выделил самым большим красный прямоугольником область DOS-заголовка. Здесь мы можем увидеть байты в шестнадцатеричном представлении.

    Вы можете поинтересоваться, для чего же другие поля? Дело в том, что система Windows построена на базе старой системы MS DOS (была до Windows). И на самом деле, это заголовок для DOS программы. Так вот, эти поля хранятся на случай, если кто-то попытается запустить PE-файл в DOS . В наше время никто практически ей не пользуется, но они остаются, так как если поменяют формат PE-файла, то перестанут работать программы с нынешним стандартом.

    Дальше у нас по списку PE-заголовок, который на самом деле, состоит из трёх частей: сигнатуры, файлового подзаголовка и дополнительного подзаголовка.

    Вот его структура на языке C/C++:

    Теперь давайте разберём каждое поле по-порядку.

      Signature
      Это четырёхбайтовое поле содержит сигнатуру, а именно значение 50 45 00 00 (или «PE\x00\x00»). Эта сигнатура указывает на то, что перед нами действительно PE-файл (Ага, ещё одна проверка).

    FileHeader
    Это обязательный подзаголовок PE-заголовка. Он хранит в себе базовые характеристики исполняемого файла.

    На C/C++ структура данного заголовка выглядит так:

    Разберём и этот подзаголовок по порядку.

      Machine
      Данное двухбайтовое поле содержит информацию о характеристике процессора, на котором может быть выполнена данная программа. Вот 3 основных значения, которые может принять этот заголовок:
      1. IMAGE_FILE_MACHINE_I386 ( 0x014c ) — означает, что программа может выполняться на x32
      2. IMAGE_FILE_MACHINE_IA64 ( 0x0200 ) — означает, что программа может выполняться на процессорах Intel Itanium (Intel x64).
      3. IMAGE_FILE_MACHINE_AMD64 ( 0x8664 ) — означает, что программа может выполняться на процессорах AMD64 (x64).

    NumberOfSections
    Двухбайтовоеполе NumberOfSections содержит в себе число секций (комнат) в PE-файле.

    SizeOfOptionalHeader
    Двухбайтовое поле содержащее размер дополнительного заголовка, который идёт сразу за файловым заголовком.

    Characteristics
    Даное двухбайтовое поле содержит характеристики PE-файла. Например, является ли это exe-файлом, или dll. Также, тут описано, является ли данная программа x64-битной или x86-битной.

    Перейдём к следующему подзаголовку PE-заголовка.

    OptionalHeader
    Это ещё один обязательный подзаголовок PE-файла. В нём хранится необходимая информация для загрузки PE-файла. Он имеет всего два формата PE32+ (для 64-битных программ) и PE32 (для 32-битных).

    Структура дополнительного заголовка представлена следующий C/C++ кодом.

    И на этот раз рассмотрим только основные поля, необходимые для загрузки PE-файла в память.

      Magic
      Это двухбайтовое поле отвечает за битность программы (x32/x64). Оно может принимать следующие значения:

    1. IMAGE_NT_OPTIONAL_HDR32_MAGIC ( 0x10b ) — означает, что это x32 (x86) исполняемый образ.
    2. IMAGE_NT_OPTIONAL_HDR64_MAGIC ( 0x20b ) — означает, что это x64 исполняемый образ.
    3. IMAGE_ROM_OPTIONAL_HDR_MAGIC ( 0x107 ) — означает, что это ROM образ.

    Читайте также:  Форматировать диск linux windows

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

    ImageBase
    Это четырёхбайтовое поле содержит предпочтительный адрес загрузки программы в память. В следующей статье мы разберём для чего он нужен.

    SectionAlignment
    Это четырёхбайтовое поле содержит относительный виртуальный адрес (относительно ImageBase, т. е. сколько байтов нужно отсчитать с адреса загрузки программы, чтобы попасть к началу секций) начала секций в виртуальной памяти.

    FileAlignment
    Это четырёхбайтовое поле содержит смещение относительной файла (сколько байтов нужно отсчитать с начала файла) начала секций в исполняемом файле.

    MajorSubsystemVersion и MinorSubsytemVersion
    В этих двухбайтовых полях содержится необходимая версия Windows.

    SizeOfImage
    Это четырёхбайтовое поле содержит размер (в байтах) загруженного исполняемого файла в памяти.

    SizeOfHeaders
    Четырёхбайтовое поле SizeOfHeaders содержит размер (в байтах) заголовков файла в памяти.

    Subsystem
    Двухбайтовое поле содержащее тип подсистемы (GUI, CLI, Driver, . ).

    NumberOfRvaAndSizes
    Данное четырёхбайтовое поле содержит число каталогов в массиве каталогов. По умолчанию равна 16.

    DataDirectory
    Это поле — на самом деле массив, которая содержит информацию о каталогах. Их число определено в поле NumberOfRvaAndSizes (по умолчанию (и почти всегда) 16) дополнительного заголовка. Каждый элемент информации о каталоге хранит относительный виртуальный адрес (относительно ImageBase, т. е. сколько байтов нужно отсчитать с адреса загрузки программы, чтобы попасть к началу секций) и размер какого-либо каталога (которые являются и секциями), которая определяется по её позиции в массиве.

    Вот структура каталога на языке C/C++:

    А вот идентификаторы (порядковый номер в DataDirectory):

    Перейдём к последнему заголовку. Этот заголовок — таблица, которая содержит различную информацию о секциях . Мы уже знаем, что их количество определено в файловом заголовке в поле NumberOfSections. Проще говоря, это массив с NumberOfSections элементов. Этот массив содержит элементы типа IMAGE_SECTION_HEADER.

    Давайте подробно рассмотрим основные поля.

      Name
      Это поле, размером в 8 байт, содержит имя секции, в ASCII кодировке.

    VirtualSize
    Это четырёхбайтовое поле содержит размер (в байтах) секции (той самой комнаты) в виртуальной памяти.

    VirtualAddress
    А это четырёхбайтовое поле уже содержит относительный адрес секции в виртуальной памяти.

    SizeOfRawData
    Данное четырёхбайтовое поле содержит размер секции в файле.

    PointerToRawData
    А указатель на эти самые данные, содержаться в этом четырёхбайтовом поле.

    Characteristics
    Это четырёхбайтовое поле содержит атрибуты секции. Например, права чтения, записи и исполнения (Read Write Execute) (RWE).

    По сути, в таблице секций просто зафиксирована информация о секциях.

    Вот и всё, мы закончили изучать заголовки. Теперь мы приступаем к изучению секций. По сути, секции являются простыми последовательными блоками данных. Они следуют друг за другом и у них нет определенного формата, так как их характеристики описаны в таблице секций. А вот формат данных, в этих секциях, зависят от типа информации, которая в них хранится. Секции, как я уже сказал, можно представить в виде комнат. Также, их можно представить и как в виде коробок с информацией. Размер каждой секции зафиксирован в таблице секций, поэтому секции должны быть определённого размера, а для этого их дополняют NULL-байтами (00). Вот и всё, что касается секций.

    Также, небольшая шпаргалка, для того, чтобы понимать какое назначение носит имя определенного заголовка секции в таблице:

    • .text : Код
    • .data : Инициализированные данные
    • .bss : Неинициализированные данные
    • .rdata : Константные (рид-онли) данные
    • .edata : Дескрипторы экспорта
    • .idata : Дескрипторы импорта
    • .reloc : Таблица релокации
    • .rsrc : Ресурсы
    • .tls : __declspec(thread) данные

    Также, секциями являются и различные каталоги.

    На этом всё. Спасибо за внимание. Если у Вас есть какие-либо вопросы или вы обнаружите неточности в статье, прошу отписаться в комментариях. Буду рад ответить на все ваши вопросы.

    Оцените статью