Открыть сервис

Исполняемая программа

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

История

Ранние этапы

Первые исполняемые программы появились в 1940-х — 1950-х годах вместе с первыми электронными вычислительными машинами, такими как ENIAC и EDVAC. На ранних этапах программы вводились в память машины напрямую через перфокарты, перфоленты или наборные панели. Формат исполняемого файла отсутствовал: программа представляла собой последовательность машинных кодов, загружаемую в память вручную. В 1950-х годах с развитием ассемблеров и первых компиляторов (например, FORTRAN) появилась необходимость в стандартизированном хранении машинного кода на внешних носителях.

Развитие форматов

В 1960-х годах, с появлением операционных систем с разделением времени (например, CTSS, Multics), начали формироваться первые форматы исполняемых файлов. Одним из первых стал формат a.out (assembler output), использовавшийся в UNIX-системах. В 1970-х годах в UNIX появился формат COFF (Common Object File Format), который поддерживал секции (код, данные, таблицы символов) и позволял связывать несколько объектных файлов в один исполняемый. В 1980-х годах, с развитием персональных компьютеров, компания Microsoft разработала формат Portable Executable (PE) для Windows, а в UNIX-системах стал стандартом Executable and Linkable Format (ELF). Эти форматы остаются основными и по сей день.

Современность

В XXI веке исполняемые программы стали более сложными: они включают цифровые подписи для аутентичности, метаданные для совместимости с разными версиями операционных систем, а также механизмы защиты от обратной разработки (обфускация, упаковка). С развитием виртуализации и контейнеризации (например, Docker) исполняемые программы могут быть упакованы в образы, содержащие все зависимости, что упрощает развёртывание.

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

Основные форматы

  • Executable and Linkable Format (ELF) — стандартный формат для UNIX-подобных систем (Linux, FreeBSD, Solaris). Поддерживает динамическую и статическую компоновку, содержит секции (например, .text для кода, .data для данных, .bss для неинициализированных данных).
  • Portable Executable (PE) — формат, используемый в операционных системах Windows (Windows NT, 2000, XP, 10, 11). Включает заголовок DOS, заголовок PE, секции (например, .text, .data, .rdata) и таблицу импорта/экспорта.
  • Mach-O — формат, используемый в macOS и iOS. Поддерживает несколько архитектур (fat binary), содержит заголовок, команды загрузки и сегменты.
  • a.out — устаревший формат, использовавшийся в ранних версиях UNIX. В настоящее время практически не применяется из-за ограничений (например, отсутствие поддержки динамической компоновки).

Специализированные форматы

  • COM — простой формат для MS-DOS, не имеющий заголовка; программа загружается в память по фиксированному адресу (0x100).
  • EXE — формат для MS-DOS (MZ-формат), содержащий заголовок и сегменты кода/данных.
  • APK — формат исполняемых файлов для Android (на основе ZIP-архива, содержащего Dalvik/ART байт-код).
  • IPA — формат для iOS (на основе ZIP-архива, содержащего Mach-O исполняемый файл).

Структура исполняемой программы

Заголовок

Любой исполняемый файл начинается с заголовка, который содержит метаданные: тип формата, целевую архитектуру (например, x86, ARM, RISC-V), точку входа (адрес первой инструкции), размеры секций, контрольные суммы. В формате PE заголовок также включает DOS-заглушку (для обратной совместимости с MS-DOS) и подпись «PE\0\0».

Секции

Исполняемый файл делится на секции, каждая из которых имеет определённое назначение:

  • .text (или __TEXT) — содержит машинный код программы (инструкции процессора).
  • .data — содержит инициализированные данные (глобальные переменные, константы).
  • .bss — содержит неинициализированные данные (занимает место в памяти, но не в файле).
  • .rdata (или .rodata) — содержит read-only данные (например, строковые константы).
  • .reloc — таблица перемещений для динамической загрузки (используется в PE).
  • .plt, .got — таблицы для динамической компоновки (используются в ELF).

Таблицы символов и импорта

Для поддержки динамической компоновки (использования общих библиотек, таких как DLL в Windows или .so в Linux) исполняемый файл содержит таблицы импорта (список функций, загружаемых из внешних библиотек) и экспорта (список функций, предоставляемых самой программой). В формате ELF эти таблицы находятся в секциях .dynsym и .dynstr, в PE — в секции .idata.

Процесс выполнения

Загрузка

При запуске программы операционная система выполняет следующие шаги:

  1. Создаёт новый процесс и выделяет виртуальное адресное пространство.
  2. Загружает заголовок исполняемого файла для проверки формата и архитектуры.
  3. Считывает секции и отображает их в память (с помощью механизма memory-mapped files).
  4. Разрешает зависимости: загружает динамические библиотеки (DLL, .so, .dylib) и связывает их с программой.
  5. Устанавливает точку входа и передаёт управление процессору.

Выполнение

Процессор последовательно выполняет инструкции из секции .text, начиная с точки входа. Программа может использовать системные вызовы (syscalls) для взаимодействия с операционной системой (например, открытие файлов, выделение памяти, ввод-вывод). В многозадачных системах выполнение прерывается планировщиком для переключения между процессами.

Завершение

Программа завершается либо при достижении инструкции возврата (exit), либо при возникновении неустранимой ошибки (например, segmentation fault). Операционная система освобождает выделенную память, закрывает файловые дескрипторы и удаляет процесс из таблицы процессов.

Классификация

По типу компоновки

  • Статически скомпонованные — содержат весь код и данные, необходимые для работы, включая библиотеки. Такие программы не зависят от внешних библиотек, но имеют больший размер.
  • Динамически скомпонованные — используют внешние библиотеки, загружаемые во время выполнения. Это уменьшает размер файла и позволяет обновлять библиотеки независимо, но требует наличия библиотек в системе.

По платформе

  • Нативные — исполняются непосредственно процессором целевой платформы (например, .exe для Windows x86).
  • Кроссплатформенные — используют байт-код (например, Java .class, .NET .exe) или интерпретатор (например, Python .pyc). Для выполнения требуется среда выполнения (JVM, .NET CLR, интерпретатор).
  • Виртуализированные — запускаются внутри виртуальной машины (например, .wasm для WebAssembly).

По типу интерфейса

  • Консольные — не имеют графического интерфейса, взаимодействуют с пользователем через командную строку.
  • Графические — используют оконные системы (например, Win32, X11, Cocoa) для отображения интерфейса.
  • Служебные — работают в фоновом режиме (демоны, службы, сервисы).

Применение

Пользовательские приложения

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

Системное программное обеспечение

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

Серверное программное обеспечение

Веб-серверы, базы данных, серверы приложений (например, Apache, Nginx, PostgreSQL) — это исполняемые программы, работающие в фоновом режиме и обрабатывающие запросы от клиентов.

Встраиваемые системы

В микроконтроллерах и IoT-устройствах исполняемые программы загружаются в flash-память и выполняются без операционной системы (bare-metal) или под управлением RTOS. Форматы таких программ зависят от архитектуры (например, .hex, .bin).

Инструменты для работы с исполняемыми программами

Компиляторы и компоновщики

Исходный код преобразуется в исполняемую программу с помощью компилятора (например, GCC, Clang, MSVC) и компоновщика (ld, link.exe). Компилятор создаёт объектные файлы, а компоновщик объединяет их в единый исполняемый файл, разрешая ссылки между модулями.

Дизассемблеры и отладчики

Для анализа исполняемых программ используются дизассемблеры (например, IDA Pro, Ghidra, objdump), которые преобразуют машинный код в ассемблерный листинг. Отладчики (GDB, WinDbg, x64dbg) позволяют выполнять программу пошагово, устанавливать точки останова и просматривать состояние памяти.

Упаковщики и протекторы

Для защиты от обратной разработки исполняемые программы могут быть упакованы (например, UPX, ASPack) или защищены протекторами (например, VMProtect, Themida). Упаковщики сжимают код, а протекторы добавляют виртуальные машины и обфускацию, что затрудняет анализ.

Безопасность

Угрозы

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

Защита

Операционные системы применяют механизмы защиты:

  • Цифровые подписи — проверка подлинности исполняемого файла (например, Authenticode в Windows).
  • ASLR (Address Space Layout Randomization) — случайное размещение секций в памяти для предотвращения атак переполнения буфера.
  • DEP (Data Execution Prevention) — запрет на выполнение кода из сегментов данных.
  • Антивирусное ПО — сканирование исполняемых файлов на наличие сигнатур вредоносного кода.

Законодательство РФ

В Российской Федерации распространение вредоносных исполняемых программ, а также программ, предназначенных для несанкционированного доступа к информации, преследуется по закону (статья 273 УК РФ). Операционные системы и приложения, используемые в государственных учреждениях, должны проходить сертификацию на соответствие требованиям безопасности (ФСТЭК России).

Интересные факты

  • Самый маленький исполняемый файл для Windows (PE) может занимать менее 100 байт, если он не содержит секций, а только заголовок и точку входа.
  • В формате ELF существует возможность создавать исполняемые файлы, которые работают без операционной системы (например, для загрузчиков ядра).
  • Некоторые исполняемые программы могут быть одновременно и архивами (например, самораспаковывающиеся архивы SFX).
  • В 1980-х годах исполняемые файлы для MS-DOS часто содержали «подпись» в виде текстовой строки (например, «MZ» для Марка Збиковски — одного из разработчиков MS-DOS).

Источники

  • Таненбаум Э., Бос Х. «Современные операционные системы». — 4-е изд. — СПб.: Питер, 2015.
  • Брайант Р., О’Халларон Д. «Компьютерные системы: архитектура и программирование». — М.: ДМК Пресс, 2020.
  • Спецификация формата ELF (TIS Committee, 1995).
  • Спецификация формата PE (Microsoft Corporation, 2008).
  • ГОСТ Р 56545-2015 «Защита информации. Уязвимости информационных систем. Классификация уязвимостей». — М.: Стандартинформ, 2015.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →