Каждый программист хочет писать маленькие, быстрые и защищенные программы. В поисках путей оптимизации, некоторые из них наталкиваются на т.н. утилиты для паковки исполняемых файлов. На первый взгляд кажется, что использование этих утилит является во многом рациональным решением: уменьшается размер исполняемых файлов и библиотек в среднем на 40%, повышается устойчивость к взлому и изменению программы, особенно при использовании специализированных утилит типа AsProtect, PE-Shield, PECrypt32.
Эти преимущества приводятся в качестве главных аргументов при решении исспользовать упаковку, хотя именно их можно частично оспорить проведя соответствующие тестирования. Для примера, будем использовать две наиболее популярные утилиты: AsPack v2.1 и UPX v1.01. Итак, займемся скрытыми особенностями упаковщиков...
Во время популярности операционной системы DOS, паковка исполняемых файлов с точки зрения уменьшения размера, была очень выгодна, т.к. весь код программы загружается в память, и неважно что его загрузит, сама операционная система или маленький загрузчик. Но с появлением Windows ситуация начала меняться, т.к. появляется мультизадачность и виртуальная память. Теперь, в отличии от DOS, Windows загружает не весь код программы, а только тот, который используется в данный момент. Например, если в программе есть процедура печати, то она загрузиться только при активизации соответственного пункта меню. И если некоторое время этот код будет не будет исспользоваться, то память выделенная под него освобождается.
Другая приятная особенность виртуальной памяти, это возможность нескольких программ использовать одну и туже область памяти. Если использовать предыдущий пример, то можно сказать, что несколько одинаковых программ, будут загружены в память, то процедура печати будет для них общей, т.е. если первая копия программы загрузит эту процедуру по определенному адресу, то вторая копия не будет еще раз загружать тот-же код, а использует его из первой копии.
Теперь, можно разобраться, что делает компрессор с Вашими программами или динамическими библиотеками (DLL). Оказывается он в обход операционной системы и виртуальной памяти, загружают весь код программы в память и держат его там до завершения. И т.к. на диске программы не в "сыром" формате, то и windows не может загружать нужный код, в нужное время, как и не может делить его между несколькими копиями программ. (приведенные примеры немного упрощены, т.к. не упоминались мелочи, не касающиеся этой статьи)
Для демонстрации "возможностей"
паковщиков исполняемых файлов, проведем
эксперимент над двумя наиболее
распространенными утилитами - UPX v1.01 и
AsPack v2.1. В качестве "кролика" будет
исполняемый файл почтового клиента The Bat!
v1.41 (thebat.exe).
Размер файла | Размер файла (разность) | Место в памяти | Место в памяти (разность) | |
---|---|---|---|---|
Без компрессии | 3019.5 Kb | 0Kb | 2172Kb | 0Kb |
UPX v1.01 | 1082.5Kb | -1937.0Kb (64.14%) | 4472Kb | +2300Kb (105.9%) |
AsPack v2.1 | 1034.0Kb | -1985.5Kb (65.7%) | 4364Kb | +2192Kb (100.9%) |
Эта маленькая табличка говорит красноречивее всех слов сказанных выше, вместе взятых. Здесь можно увидеть, что упаковщики действительно хорошо сжимают файлы, но при уменьшении размера файла на 64%, потребуется на 100% больше оперативной памяти!
Бесспорно, упаковка файла несколько препятствует взлому программы и это широко используется создателями shareware программ. Но как говориться: "Кто ищет, тот всегда найдет". И уже на сегодняшний день существует много программ (например, ProcDump) и учебников, предназначенных для борьбы с упакованными программами. Так что, устойчивость программ к взлому была только в начале распространения упаковщиков, а сейчас, когда они стали достаточно известны, пользы от них в этом смысле осталось очень мало.
Хотя есть некоторое количество малоизвестных шифровальщиков, которые могут обеспечить начальную защиту. Но вам никто не даст хоть какой ни будь гарантии, что обработанные ими исполняемые файлы будут работоспособны на всех компьютерах.
Есть одна альтернатива упаковщикам, это оптимизаторы. Конечно они не дают такой степени компрессии, но зато и не имеют побочных эффектов. Кстати, пытаясь протестировать, один из лучших и популярных оптимизаторов, StripReloc v1.02 оказалось, что The Bat, как и Netscape уже оптимизированы в этом направлении, а вот Explorer был сжат на 5.98% и Adobe ImageStyler на 4.34%.
Хотя с моей стороны будет нечестно не упомянуть об еще одной возможности упаковки. Она совершенно забыта и потерянна во времени, может быть из-за своей кривости? Принцип этой упаковки немного отличается от AsPack, UPX, и др., но в тоже время он не имеет проблем с оперативной памятью, но зато использует жесткий диск и немного тормозит программу. Если Вам интересно, советую посмотреть на программу EPack v1.60. Эта утилита сжала исполняемый файл программы The Bat на 54.56%. Это конечно не такой уж большой процент, как у AsPack и UPX, но если учесть, что утилита малоизвестная и использует не самый оптимальный алгоритм сжатия, то степень сжатия можно считать удовлетворительной. (Реально исспользование программы затрудняет некоторое количество ошибок, внимания может заслуживать только "вирусный" алгоритм)
Как видите, при более глубоком
рассмотрении упаковщиков исполняемых
файлов, выясняется их нерациональность.
Но им еще можно найти применение в
маленьких (до 300Kb) программах, а также в
программах, которые не проектируются
для запуска в мультизадачном режиме,
например, очень удачно использование
упаковщика в файлах установки, в том
числе самораспаковывающихся архивах. А
вот в таких как ReGet, Site Publisher, Bullet Proof FTP,
WinNavigator 1.85, DvmMail 0.833 (которые и запакованы
каким либо упаковщиком), я бы не
рекомендовал, т.к. эти программы
запросто можно использовать
одновременно, тем самым очень хорошо
засорять память. А вот использовать StripReloc
можно и даже нужно рекомендовать всем,
без исключений.
Автор: Кушнир
Константин- <chpock@softhome.net>
Источник: http://www.exetools.agava.ru/,
http://www.jordanr.cjb.net/