Паканем и зашифруем

Дубовцев Алексей

Xakep, номер #061, стр. 061-064-1

(mrorbit@mail.ru)

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

Свершилось! Ты написал свою первою программу и сделал это при помощи Delphi или какой-нибудь другой визуальной среды разработки. Все прекрасно! Прога работает! Но размер?! Одно окошко с кнопкой ОК занимает 300 килобайт. Что же будет, если добавить две кнопки? Это никуда не годится. На помощь к тебе придут самые лучшие паковщики в мире - они уменьшат твою прогу до невероятных размеров.

Как работают паковщики

О существовании архиваторов ты наверняка слышал не раз и, скорее всего, уже успел ими попользоваться. Ведь именно эти чудо-программы сохраняют место на твоем харде, берегут трафик и сокращают время скачивания файла в Сети. В общем, понятно, что архиваторы полезная в хозяйстве вещь. Но сегодня мы будем говорить не о классических реализациях, вроде WinRAR и WinZIP, а об уменьшении размера исполняемых файлов (exe’шников). Кстати, уменьшение размера подобных файлов - очень актуальная проблема для многих разработчиков, кроме, конечно, программистов из Microsoft :).

Мне в свое время, для того чтобы сделать свои программы маленькими и шустрыми, пришлось научиться программировать на Asm’е, C, разбираться в структуре исполняемых файлов и сделать много других занимательных вещей. Тебе же, в отличие от меня, придется только понять устройство волшебных паковщиков!

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

Что же выбрать?

Паковщиков существует множество, и надо найти лучший из них. Я проводил оценку по следующим двум параметрам: скорость запуска приложения (она же скорость распаковки) и степень сжатия файла. На мой взгляд, лучшим по этим позициям является UPX.

Для того чтобы проверить все его возможности, мне пришлось создать маленькое приложение на Delphi – всего-навсего одну форму с кнопкой. При компиляции этого нехитрого творения у меня материализовалось 373 килобайта исполняемого файла. Это меня, естественно, не порадовало. Надо заметить, что на любимом С++ мне бы удалось добиться результата в пару килобайт. Поэтому было решено бороться с результатом Delphi. Для этого я натравил UPX на только что созданный файл, задал ему максимальную степень компрессии и посмотрел, что получилось. А получилось относительно неплохо: размер файла уменьшился более чем в два раза, и он стал весить 153 Кб. При этом он сохранил способность нормально запускаться и функционировать :).

Такой компрессии мне показалось мало, поэтому я начал экспериментировать с другими упаковщиками. Вот что попало в мои руки: 32Lite, ASPack, NeoLite 2.0, PeComact, PeCompress, PeCrypt, PePack, PkLite, Shrinker, WinLite, Telock. Как оказалось, всем им далеко до UPX – в лучшем случае сжатие достигало 161 Кб, что было на целых 8 килобайт больше, чем у лидера. Но самое интересное, что тот же монстр RAR сумел ужать исходный файл все до тех же 161 Кб. Это заставило меня задуматься – а можно ли получить еще лучший результат? После ковыряния в архиваторах и пробы различных вариантов мне удалось ужать файл еще на три кило. Этот результат дал мне все тот же RAR, но натравленный на упакованный UPX’ом файл.

Содержание  Вперед на стр. 061-064-2
ttfb: 3.4561157226562 ms