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

22 июля 2011

Самый простой способ уменьшить размер приложения — использование программы для сжатия исполняемых файлов. Среди разнообразия таких программ можно выделить ASPaсk (http://aspack.com) И открытую библиотеку UPX. Эта библиотека распространяется в исходных кодах и легко может быть найдена (например: http://rafsoft.narod.ru) Как работает сжатие? Сначала весь код программы сжимается архиватором.

В программе ASPaсk используется алгоритм сжатия LZWA, оптимизированный для сжатия двоичного кода. В конец сжатого кода добавляется код разархиватора. И в самом конце ASPaсk изменяет заголовок исполняемого файла так, чтобы при старте сначала запускался разархиватор, который будет во время выполнения распаковывать программу в первоначальное состояние прямо в памяти и запускать распакованный вариант на исполнение. В UPX алгоритм сжатия с высоким коэффициентом сжатия, а разархиватор достаточно маленький (меньше 1 Кбайт), поэтому сжатие происходит очень сильно, а к результирующему файлу добавляется только один килобайт. Таким образом, программа может сжать файл размера в 1,5 Мбайт в 300-500 Кбайт.

Теперь, когда Вы запускаете сжатую программу, сначала заработает разархиватор, который разожмет бинарный код программы и аккуратно поместит его в память компьютера. Как только этот процесс закончится, разархиватор передаст управление вашей программе

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

При нормальном программировании с использованием всех современных возможностей типа визуальное и объектного программирования код получается большим, но его можно сжать специальным архиватором на 60-70%. А писать такой код намного легче и быстрее.

Еще одно "за" использование сжатия — заархивированный код труднее взломать, потому что не каждый дизассемблер сможет прочитать упакованные команды. Так что помимо уменьшения размера вы получаете защиту, способную остановить большинство взломщиков. Конечно же, профессионала этим не отпугнешь. Но взломщик средней руки не будет возиться со сжатым двоичным кодом.

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

Коммерческие программы сжатия, такие как ASPack, имеют функции шифрования, которые могут усложнить жизнь хакерам. Опять же, только усложнить, но не испортить вовсе. Для исполнения код в любом случае будет расшифрован, а в арсенале взломщиков есть утилиты, позволяющие снимать код из памяти для дальнейшего анализа. Этот процесс не из легких, но вполне возможный.

Рейтинг@Mail.ru