Введение

Средства сжатия исполняемого файла

Сжатие исполняемого файла – это любой способ сжатия исполняемого файла и объединения сжатых данных с кодом распаковки в единый исполняемый файл. При запуске такого сжатого исполняемого файла код распаковки восстанавливает исходный код из сжатых данных перед его выполнением. В большинстве случаев это происходит прозрачно, поэтому сжатый исполняемый файл можно использовать точно так же, как и исходный. Исполняемые компрессоры часто называют упаковщиками исполняемых файлов, упаковщиками во время выполнения, упаковщиками программного обеспечения, средствами защиты программного обеспечения или даже "полиморфными упаковщиками" и "инструментами обфускации". Сжатый исполняемый файл можно рассматривать как самораспаковывающийся архив, в котором сжатый исполняемый файл упакован вместе с соответствующим кодом распаковки в исполняемом файле. Некоторые сжатые исполняемые файлы можно распаковать для восстановления исходного программного файла без его непосредственного запуска. Две программы, которые можно использовать для этого, – CUP386 и UNP. Большинство сжатых исполняемых файлов распаковывают исходный код в память и, как правило, требуют немного больше памяти для работы (поскольку им необходимо хранить код распаковщика, сжатые данные и распакованный код). Более того, некоторые сжатые исполняемые файлы имеют дополнительные требования, например, записывают распакованный исполняемый файл в файловую систему перед его выполнением. Сжатие исполняемых файлов не ограничивается бинарными исполняемыми файлами, но также может применяться к скриптам, таким как JavaScript. Поскольку большинство языков скриптов предназначены для работы с кодом, читаемым человеком, который обладает высокой избыточностью, сжатие может быть очень эффективным и таким же простым, как замена длинных имен, используемых для идентификации переменных и функций, на более короткие версии и/или удаление пробелов.

Преимущества и недостатки

Дистрибьюторы программного обеспечения используют сжатие исполняемых файлов по ряду причин, в первую очередь для снижения требований к объему памяти для хранения их программного обеспечения. Поскольку компрессоры исполняемых файлов разработаны специально для сжатия исполняемого кода, они часто достигают более высокой степени сжатия, чем стандартные средства сжатия данных, такие как gzip, zip или bzip2. Это позволяет дистрибьюторам программного обеспечения оставаться в рамках ограничений выбранного носителя (например, CD-ROM, DVD-ROM или дискеты) или сократить время и пропускную способность, необходимые пользователям для доступа к программному обеспечению, распространяемому через Интернет. Сжатие исполняемых файлов также часто используется для затруднения обратной разработки или сокрытия содержимого исполняемого файла (например, для скрытия присутствия вредоносного ПО от антивирусных сканеров) с помощью запатентованных методов сжатия и/или дополнительного шифрования. Сжатие может использоваться для предотвращения прямой дизассемблии, маскировки строковых литералов и изменения сигнатур. Хотя это не исключает возможность обратной разработки, оно может сделать этот процесс более затратным. Сжатый исполняемый файл занимает меньше места в файловой системе, а значит, требуется меньше времени на передачу данных из файловой системы в память. С другой стороны, для начала выполнения требуется время на распаковку данных. Однако скорость различных носителей информации не успевает за ростом производительности процессоров, поэтому хранение данных очень часто является узким местом. Таким образом, сжатый исполняемый файл будет загружаться быстрее на большинстве распространенных систем. На современных настольных компьютерах это редко заметно, если только исполняемый файл не слишком велик, поэтому скорость загрузки не является решающим фактором при сжатии исполняемого файла. В операционных системах, которые подгружают исполняемые образы по требованию с диска, сжатые исполняемые файлы делают этот процесс менее эффективным. Заголовок декомпрессора выделяет блок памяти для хранения распакованных данных, который остается выделенным до тех пор, пока исполняемый файл загружен, независимо от того, используется он или нет, конкурируя за ресурсы памяти с другими приложениями. Если операционная система использует файл подкачки, распакованные данные должны быть записаны в него для освобождения памяти, вместо того чтобы просто отбрасывать неиспользуемые блоки данных и перезагружать их из исполняемого образа при необходимости. Обычно это незаметно, но становится проблемой, когда исполняемый файл загружается несколько раз одновременно — операционная система не может повторно использовать уже загруженные блоки данных, данные должны быть распакованы в новый блок памяти и будут выгружены независимо, если они не используются. Дополнительные требования к хранилищу и времени означают, что необходимо тщательно взвешивать целесообразность сжатия исполняемых файлов, которые обычно запускаются несколько раз одновременно. Еще одним недостатком является то, что некоторые утилиты больше не могут определять зависимости от библиотек времени выполнения, поскольку виден только статический заголовок-извлекатель. Кроме того, некоторые старые антивирусные сканеры просто сообщают обо всех сжатых исполняемых файлах как о вирусах, поскольку заголовок декомпрессора имеет с ними общие характеристики. Большинство современных антивирусных сканеров могут распаковывать несколько слоев сжатия исполняемых файлов для проверки фактического исполняемого файла внутри, но некоторые популярные антивирусные и антишпионские программы сталкивались с ложными срабатываниями на сжатых исполняемых файлах. В попытке решить проблему вредоносного ПО, скрытого с помощью динамических упаковщиков, группа безопасности IEEE Industry Connections Security Group представила систему программных тегов. Сжатие исполняемых файлов было более популярно, когда компьютеры были ограничены емкостью хранения дискет, которые были медленными и имели небольшую емкость, а также небольшими жесткими дисками. Это позволяло компьютеру хранить больше программного обеспечения на том же объеме памяти, без необходимости вручную распаковывать архив каждый раз, когда пользователь хотел использовать программу. Однако сжатие исполняемых файлов стало менее популярным из-за увеличения емкости хранилища на компьютерах. Оно находит применение в демо-сцене, где демо-версии должны соответствовать ограничениям по размеру, например, 64-килобайтному интро. Только очень сложные форматы сжатия, которые увеличивают время загрузки, позволяют исполняемому файлу оставаться достаточно маленьким для участия в этих соревнованиях.

Исполняемая программа CP/M и MSX-DOS

Известные исполняемые компрессоры для CP/M 80 / MSX DOS COM файлов:

PMexe (с 1990 года, разработанный Йошихико Мино, PMARC.COM + PMEXE.CPM, сигнатура "pms")