Файл COM — это тип простого исполняемого файла . В операционных системах Digital Equipment Corporation (DEC) VAX 1970-х годов использовался как расширение имени файла для текстовых файлов, содержащих команды, которые должны быть выданы операционной системе (аналогично пакетному файлу ). [1] С появлением CP/M ( операционной системы для микрокомпьютеров ) компании Digital Research тип файлов, обычно связанных с расширением COM, изменился на тип исполняемых файлов. Это соглашение позже было перенесено в DOS . Даже будучи дополненными более общим форматом файла EXE для исполняемых файлов, компактные файлы COM оставались жизнеспособными и часто использовались в DOS..COM
Расширение .COM
имени файла не имеет никакого отношения к доменному имени верхнего уровня .com (для "commercial"). Однако это сходство в имени было использовано авторами вредоносных программ .
Формат COM — это оригинальный двоичный исполняемый формат, используемый в CP/M (включая SCP и MSX-DOS ), а также в DOS . Он очень прост; у него нет заголовка (за исключением файлов CP/M 3), [2] и он не содержит стандартных метаданных , только код и данные. Эта простота имеет свою цену: двоичный файл имеет максимальный размер 65 280 (FF00 h ) байт (на 256 байт меньше 64 КБ) и хранит весь свой код и данные в одном сегменте .
Поскольку в нем отсутствует информация о перемещении , он загружается операционной системой по заранее заданному адресу со смещением 0100h сразу после PSP , где и выполняется (отсюда и ограничение размера исполняемого файла): точка входа зафиксирована на 0100h. [примечание 1] Это не было проблемой на 8-битных машинах, поскольку они могут адресовать максимум 64 КБ памяти, но 16-битные машины имеют гораздо большее адресное пространство, поэтому этот формат вышел из употребления.
В архитектуре процессора Intel 8080 можно было адресовать только 65 536 байт памяти (диапазон адресов от 0000h до FFFFh). В CP/M первые 256 байт этой памяти, от 0000h до 00FFh, были зарезервированы для системного использования нулевой страницей , и любая пользовательская программа должна была быть загружена точно в 0100h для выполнения. [nb 1] Файлы COM идеально соответствуют этой модели. До появления MP/M и Concurrent CP/M не было возможности запускать более одной программы или команды одновременно: запускалась программа, загруженная в 0100h, и никакая другая.
Хотя формат файла в DOS и CP/M одинаков, файлы .COM для этих двух операционных систем несовместимы; файлы DOS COM содержат инструкции x86 и, возможно, системные вызовы DOS , в то время как файлы CP/M COM содержат инструкции 8080 и системные вызовы CP/M (программы, ограниченные определенными машинами, также могут содержать дополнительные инструкции для 8085 или Z80 ).
Файлы .COM в DOS устанавливают все регистры сегмента x86 в одно и то же значение, а регистр SP (указатель стека) — в смещение последнего слова, доступного в первом сегменте размером 64 КБ (обычно FFFEh), или в максимальный размер памяти, доступный в блоке, в который загружена программа, для обоих: программа плюс не менее 256 байт стека, в зависимости от того, что меньше, таким образом, стек начинается с самого верха соответствующего сегмента памяти и идет вниз оттуда. [3] [4]
В оригинальном API DOS 1.x , который был производным от API CP/M, завершение программы .COM-файла выполнялось вызовом функции INT 20h (Terminate Program) или INT 21h Function 0, которая служила той же цели, и программист также должен был убедиться, что регистры сегмента кода и данных содержат одинаковое значение при завершении программы, чтобы избежать потенциального сбоя системы. Хотя это можно было использовать в любой версии DOS, Microsoft рекомендовала использовать INT 21h Function 4Ch для завершения программы, начиная с DOS 2.x, что не требовало установки одинакового значения сегмента данных и кода.
Можно сделать .COM-файл для запуска в обеих операционных системах в виде толстого двоичного файла . На уровне инструкций нет настоящей совместимости; инструкции в точке входа выбираются так, чтобы они были одинаковыми по функциональности, но разными в обеих операционных системах, и заставляют выполнение программы переходить к разделу для используемой операционной системы. По сути, это две разные программы с одинаковой функциональностью в одном файле, которым предшествует код, выбирающий ту, которую следует использовать.
В CP/M 3, если первый байт COM-файла — C9h, есть 256-байтовый заголовок; [2] поскольку C9h соответствует инструкции 8080RET
, это означает, что COM-файл немедленно завершится, если будет запущен на более ранней версии CP/M, которая не поддерживает это расширение. (Поскольку наборы инструкций 8085 и Z80 являются надмножествами набора инструкций 8080, это работает на всех трех процессорах.) C9h — недопустимый код операции на 8088/8086, и он вызовет сгенерированное процессором исключение прерывания 6 в режиме v86 на чипах 386 и более поздних x86. Поскольку C9h — это код операции для LEAVE со времен 80188/80186 и , следовательно, не используется в качестве первой инструкции в допустимой программе, исполняемый загрузчик в некоторых версиях DOS отклоняет COM-файлы, которые начинаются с C9h, избегая сбоя.
Файлы могут иметь имена, заканчивающиеся на .COM, но не быть в простом формате, описанном выше; это указано магическим числом в начале файла. Например, файл COMMAND.COM в DR DOS 6.0 на самом деле находится в исполняемом формате DOS, на что указывают первые два байта, представляющие собой MZ (4Dh 5Ah), инициалы Марка Збиковски .
В DOS нет управления памятью, предоставляемого для COM-файлов загрузчиком или средой выполнения. Вся память просто доступна для COM-файла. После выполнения командная оболочка операционной системы COMMAND.COM перезагружается. Это оставляет возможности, что COM-файл может быть либо очень простым, использующим один сегмент , либо произвольно сложным, предоставляющим собственную систему управления памятью. Примером сложной программы является COMMAND.COM, оболочка DOS, которая предоставила загрузчик для загрузки других программ COM или EXE . В системе .COM могут быть загружены и запущены более крупные программы (в пределах доступного размера памяти), но загрузчик системы предполагает, что весь код и данные находятся в первом сегменте, и программа .COM должна обеспечить любую дальнейшую организацию. Программы, превышающие доступную память, или большие сегменты данных , могут обрабатываться с помощью динамического связывания , если необходимый код включен в программу .COM. Преимущество использования формата .COM вместо .EXE заключается в том, что двоичный образ обычно меньше и его проще программировать с помощью ассемблера . [5] После того, как стали доступны компиляторы и компоновщики достаточной мощности, использование формата .COM для сложных программ стало невыгодным.
Формат по-прежнему исполняем на многих современных платформах на базе Windows NT , но он работает в подсистеме эмуляции MS-DOS , NTVDM , которая отсутствует в 64-битных вариантах. Файлы COM также могут исполняться на эмуляторах DOS, таких как DOSBox , на любой платформе, поддерживаемой этими эмуляторами.
Операционные системы на базе Windows NT используют расширение .com для небольшого числа команд, перенесенных со времен MS-DOS, хотя на самом деле они в настоящее время реализованы как файлы .exe . Операционная система распознает заголовок файла .exe и правильно выполнит их, несмотря на их технически неправильное расширение .com. (На самом деле любой файл .exe можно переименовать в .com и все равно выполнить правильно.) Использование исходных расширений .com для этих команд обеспечивает совместимость со старыми пакетными файлами DOS, которые могут ссылаться на них по их полным исходным именам файлов. Эти команды — CHCP
, DISKCOMP
, DISKCOPY
, FORMAT
, MODE
, MORE
и TREE
. [6]
В DOS, если каталог содержит как COM-файл, так и EXE- файл с одинаковым именем, когда расширение не указано, то для выполнения в первую очередь выбирается COM-файл. Например, если каталог в системном пути содержит два файла с именами foo.com
и foo.exe
, будет выполнено следующее foo.com
:
C:\>фу
Пользователь, желающий выполнить команду, foo.exe
может явно указать полное имя файла:
C:\>foo.exe
Пользуясь этим поведением по умолчанию, вирусописатели и другие вредоносные программисты использовали notepad.com
для своих творений имена вроде , надеясь, что если поместить его в тот же каталог, что и соответствующий EXE-файл, команда или пакетный файл могут случайно запустить их программу вместо текстового редактора notepad.exe
. Опять же, эти файлы .com могут на самом деле содержать исполняемый файл формата .exe.
В Windows NT и производных ( Windows 2000 , Windows XP , Windows Vista и Windows 7 ) переменная PATHEXT используется для переопределения порядка предпочтения (и допустимых расширений) для вызова файлов без указания расширения из командной строки. Значение по умолчанию по-прежнему помещает файлы перед файлами. Это очень похоже на функцию, ранее обнаруженную в линейке расширенных процессоров командной строки JP Software 4DOS , 4OS2 и 4NT ..com
.exe
Некоторые авторы компьютерных вирусов надеялись воспользоваться тем, что современные пользователи компьютеров, вероятно, не знают о расширении файла .com и связанном с ним двоичном формате, а также тем, что они, скорее всего, знакомы с доменным именем .com в Интернете. Электронные письма отправлялись с именами вложений, похожими на "www.example.com". Неосторожные пользователи Microsoft Windows, нажимая на такое вложение, ожидали бы начать просмотр сайта с именем , но вместо этого запускали прикрепленный двоичный командный файл с именем , предоставляя ему полное разрешение делать с их машиной все, что задумал его автор. [ необходима цитата ]http://www.example.com/
www.example
В самом формате файла COM нет ничего вредоносного; это эксплуатация случайного совпадения имен между командными файлами .com и коммерческими веб-сайтами .com .