Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Средства сжатия исполняемого файла
Means of compressing an executable file
Сжатие исполняемого файла – это любой способ сжатия исполняемого файла и объединения сжатых данных с кодом распаковки в единый исполняемый файл. При запуске такого сжатого исполняемого файла код распаковки восстанавливает исходный код из сжатых данных перед его выполнением. В большинстве случаев это происходит прозрачно, поэтому сжатый исполняемый файл можно использовать точно так же, как и исходный. Исполняемые компрессоры часто называют упаковщиками исполняемых файлов, упаковщиками во время выполнения, упаковщиками программного обеспечения, средствами защиты программного обеспечения или даже "полиморфными упаковщиками" и "инструментами обфускации". Сжатый исполняемый файл можно рассматривать как самораспаковывающийся архив, в котором сжатый исполняемый файл упакован вместе с соответствующим кодом распаковки в исполняемом файле. Некоторые сжатые исполняемые файлы можно распаковать для восстановления исходного программного файла без его непосредственного запуска. Две программы, которые можно использовать для этого, – CUP386 и UNP. Большинство сжатых исполняемых файлов распаковывают исходный код в память и, как правило, требуют немного больше памяти для работы (поскольку им необходимо хранить код распаковщика, сжатые данные и распакованный код). Более того, некоторые сжатые исполняемые файлы имеют дополнительные требования, например, записывают распакованный исполняемый файл в файловую систему перед его выполнением. Сжатие исполняемых файлов не ограничивается бинарными исполняемыми файлами, но также может применяться к скриптам, таким как JavaScript. Поскольку большинство языков скриптов предназначены для работы с кодом, читаемым человеком, который обладает высокой избыточностью, сжатие может быть очень эффективным и таким же простым, как замена длинных имен, используемых для идентификации переменных и функций, на более короткие версии и/или удаление пробелов.
Executable compression is any means of compressing an executable file and combining the compressed data with decompression code into a single executable. When this compressed executable is executed, the decompression code recreates the original code from the compressed code before executing it. In most cases this happens transparently so the compressed executable can be used in exactly the same way as the original. Executable compressors are often referred to as executable packers, runtime packers, software packers, software protectors, or even "polymorphic packers" and "obfuscating tools". A compressed executable can be considered a self extracting archive, where a compressed executable is packaged along with the relevant decompression code in an executable file. Some compressed executables can be decompressed to reconstruct the original program file without being directly executed. Two programs that can be used to do this are CUP386 and UNP. Most compressed executables decompress the original code in memory and most require slightly more memory to run (because they need to store the decompressor code, the compressed data and the decompressed code). Moreover, some compressed executables have additional requirements, such as those that write the decompressed executable to the file system before executing it. Executable compression is not limited to binary executables, but can also be applied to scripts, such as JavaScript. Because most scripting languages are designed to work on human readable code, which has a high redundancy, compression can be very effective and as simple as replacing long names used to identify variables and functions with shorter versions and/or removing white space.
Преимущества и недостатки
Дистрибьюторы программного обеспечения используют сжатие исполняемых файлов по ряду причин, в первую очередь для снижения требований к объему памяти для хранения их программного обеспечения. Поскольку компрессоры исполняемых файлов разработаны специально для сжатия исполняемого кода, они часто достигают более высокой степени сжатия, чем стандартные средства сжатия данных, такие как gzip, zip или bzip2. Это позволяет дистрибьюторам программного обеспечения оставаться в рамках ограничений выбранного носителя (например, CD-ROM, DVD-ROM или дискеты) или сократить время и пропускную способность, необходимые пользователям для доступа к программному обеспечению, распространяемому через Интернет. Сжатие исполняемых файлов также часто используется для затруднения обратной разработки или сокрытия содержимого исполняемого файла (например, для скрытия присутствия вредоносного ПО от антивирусных сканеров) с помощью запатентованных методов сжатия и/или дополнительного шифрования. Сжатие может использоваться для предотвращения прямой дизассемблии, маскировки строковых литералов и изменения сигнатур. Хотя это не исключает возможность обратной разработки, оно может сделать этот процесс более затратным. Сжатый исполняемый файл занимает меньше места в файловой системе, а значит, требуется меньше времени на передачу данных из файловой системы в память. С другой стороны, для начала выполнения требуется время на распаковку данных. Однако скорость различных носителей информации не успевает за ростом производительности процессоров, поэтому хранение данных очень часто является узким местом. Таким образом, сжатый исполняемый файл будет загружаться быстрее на большинстве распространенных систем. На современных настольных компьютерах это редко заметно, если только исполняемый файл не слишком велик, поэтому скорость загрузки не является решающим фактором при сжатии исполняемого файла. В операционных системах, которые подгружают исполняемые образы по требованию с диска, сжатые исполняемые файлы делают этот процесс менее эффективным. Заголовок декомпрессора выделяет блок памяти для хранения распакованных данных, который остается выделенным до тех пор, пока исполняемый файл загружен, независимо от того, используется он или нет, конкурируя за ресурсы памяти с другими приложениями. Если операционная система использует файл подкачки, распакованные данные должны быть записаны в него для освобождения памяти, вместо того чтобы просто отбрасывать неиспользуемые блоки данных и перезагружать их из исполняемого образа при необходимости. Обычно это незаметно, но становится проблемой, когда исполняемый файл загружается несколько раз одновременно — операционная система не может повторно использовать уже загруженные блоки данных, данные должны быть распакованы в новый блок памяти и будут выгружены независимо, если они не используются. Дополнительные требования к хранилищу и времени означают, что необходимо тщательно взвешивать целесообразность сжатия исполняемых файлов, которые обычно запускаются несколько раз одновременно. Еще одним недостатком является то, что некоторые утилиты больше не могут определять зависимости от библиотек времени выполнения, поскольку виден только статический заголовок-извлекатель. Кроме того, некоторые старые антивирусные сканеры просто сообщают обо всех сжатых исполняемых файлах как о вирусах, поскольку заголовок декомпрессора имеет с ними общие характеристики. Большинство современных антивирусных сканеров могут распаковывать несколько слоев сжатия исполняемых файлов для проверки фактического исполняемого файла внутри, но некоторые популярные антивирусные и антишпионские программы сталкивались с ложными срабатываниями на сжатых исполняемых файлах. В попытке решить проблему вредоносного ПО, скрытого с помощью динамических упаковщиков, группа безопасности IEEE Industry Connections Security Group представила систему программных тегов. Сжатие исполняемых файлов было более популярно, когда компьютеры были ограничены емкостью хранения дискет, которые были медленными и имели небольшую емкость, а также небольшими жесткими дисками. Это позволяло компьютеру хранить больше программного обеспечения на том же объеме памяти, без необходимости вручную распаковывать архив каждый раз, когда пользователь хотел использовать программу. Однако сжатие исполняемых файлов стало менее популярным из-за увеличения емкости хранилища на компьютерах. Оно находит применение в демо-сцене, где демо-версии должны соответствовать ограничениям по размеру, например, 64-килобайтному интро. Только очень сложные форматы сжатия, которые увеличивают время загрузки, позволяют исполняемому файлу оставаться достаточно маленьким для участия в этих соревнованиях.
Software distributors use executable compression for a variety of reasons, primarily to reduce the secondary storage requirements of their software; as executable compressors are specifically designed to compress executable code, they often achieve better compression ratio than standard data compression facilities such as gzip, zip or bzip2 This allows software distributors to stay within the constraints of their chosen distribution media (such as CD ROM, DVD ROM, or floppy disk), or to reduce the time and bandwidth customers require to access software distributed via the Internet. Executable compression is also frequently used to deter reverse engineering or to obfuscate the contents of the executable (for example, to hide the presence of malware from antivirus scanners) by proprietary methods of compression and/or added encryption. Executable compression can be used to prevent direct disassembly, mask string literals and modify signatures. Although this does not eliminate the chance of reverse engineering, it can make the process more costly. A compressed executable requires less storage space in the file system, thus less time to transfer data from the file system into memory. On the other hand, it requires some time to decompress the data before execution begins. However, the speed of various storage media has not kept up with average processor speeds, so the storage is very often the bottleneck. Thus the compressed executable will load faster on most common systems. On modern desktop computers, this is rarely noticeable unless the executable is unusually big, so loading speed is not a primary reason for or against compressing an executable. On operating systems which page executable images on demand from the disk, compressed executables make this process less efficient. The decompressor stub allocates a block of memory to hold the decompressed data, which stays allocated as long as the executable stays loaded, whether it is used or not, competing for memory resources with other applications all along. If the operating system uses a swap file, the decompressed data has to be written to it to free up the memory instead of simply discarding unused data blocks and reloading them from the executable image if needed again. This is usually not noticeable, but it becomes a problem when an executable is loaded more than once at the same time—the operating system cannot reuse data blocks it has already loaded, the data has to be decompressed into a new memory block, and will be swapped out independently if not used. The additional storage and time requirements mean that it has to be weighed carefully whether to compress executables which are typically run more than once at the same time. Another disadvantage is that some utilities can no longer identify run time library dependencies, as only the statically linked extractor stub is visible. Also, some older virus scanners simply report all compressed executables as viruses because the decompressor stubs share some characteristics with those. Most modern virus scanners can unpack several different executable compression layers to check the actual executable inside, but some popular anti virus and anti malware scanners have had troubles with false positive alarms on compressed executables. In an attempt to solve the problem of malware obfuscated with the help of runtime packers the IEEE Industry Connections Security Group has introduced a software taggant system. Executable compression used to be more popular when computers were limited to the storage capacity of floppy disks, which were both slow and low capacity media, and small hard drives; it allowed the computer to store more software in the same amount of space, without the inconvenience of having to manually unpack an archive file every time the user wanted to use the software. However, executable compression has become less popular because of increased storage capacity on computers. It has its use in the demoscene where demos have to stay within a size limit, e. g. 64k intro. Only very sophisticated compression formats, which add to load time, keep an executable small enough to enter these competitions.
Исполняемая программа CP/M и MSX-DOS
Известные исполняемые компрессоры для CP/M 80 / MSX DOS COM файлов:
Known executable compressors for CP/M 80 / MSX DOS COM files:
PMexe (с 1990 года, разработанный Йошихико Мино, PMARC.COM + PMEXE.CPM, сигнатура "pms")
PMexe (since 1990, written by Yoshihiko Mino, PMARC. COM+PMEXE. CPM, signature " pms ")