Пакувальники і розпаковують програм

Видання друге, доповнене

Тема даної статті виникла ось яким чином. В розсилку Dummpy. одним з гуру якої я є, було поставлене таке запитання:

Привіт всім! Поясніть мені, що таке unpacker? Рився на диску в прогах і наткнувся на такий звір - "unpacker". Поясніть, що з ним можна робити? Для чого він? З чим це їдять? Я так зрозумів, це такий тип програм.

Значить, unpacker. Це - распаковщик програм. Отже, програма може бути упакована. Яким чином? Для цього існують спеціальні пакувальники. Але, спочатку давайте пригадаймо, що позначають терміном "упаковка".

Архіватори, сподіваюся, всім відомі. Приклади таких програм - популярні в Інтернеті WinZip і WinRAR. Архіватор дозволяє упакувати файли. А в чому полягає упаковка, або як ще кажуть, стиснення?

Спрощено справу можна уявити так. Використовуючи спеціальні алгоритмічні методи, архіватор знаходить в файлах часто повторювані послідовності і замінює їх більш короткими кодами. Наприклад, в текстових файлах дуже часто повторюються деякі букви, скажімо, "е", "а" або знак пробілу. Архіватор розраховує число входжень символів в тексті, а потім будує оптимізовану таблицю символів, в якій найбільш уживані символи мають найкоротші коди, як в азбуці Морзе. Весь текст перекодируется згідно нової таблиці, і процес повторюється заново. Адже часто зустрічаються не тільки окремі літери, а й їх послідовності, наприклад поєднання "пр", "ст" або "<запятая><пробел>". Перекодування файлу припиняється, коли його розмір після оптимізації перестає зменшуватися.

Природно, архіватори дозволяють стискати не тільки текстові файли. Оскільки текст представлений у вигляді набору кодів, архіватор з тим же успіхом стискає і нетекстові файли. Наприклад, в файлах програм, типу EXE або DLL, деякі коди команд зустрічаються набагато частіше за інших. Крім цього, багато компоновщики здійснюють так зване вирівнювання. при якому окремі сегменти програми доповнюються нулями до тих пір, поки розмір сегмента не стане кратним певній величині, скажімо, 8 або 16 байтам. Отже, програмні файли також містять багато "води", яку можна "вичавити" архіватором. В середньому, файли програм стискаються десь на 40-50%.

Стиснення дуже вигідно для поширення інформації, оскільки дозволяє без втрат розмістити її на носії меншого розміру і значно скоротити час завантаження по мережі. Але, архіви, створені звичайними програмами стиснення, мають один суттєвий недолік: файли в них недоступні безпосередньо. Для подальшого використання файли потрібно витягти з архіву (розпакувати). Як правило, це робиться тією ж самою програмою, що використовувалася для їх упаковки. Є, звичайно, така річ, як архіви, але суті справи це не змінює. Просто, для розпакування такого архіву ніяких додаткових програм не потрібно, і все. А файли з нього для прямого використання все одно недоступні.

"Шкода!" - скажете ви. У мене є багато великих програм, якими я користуюся рідко, але тримати їх в архіві незручно. А що, якби можна було запускати програму, не розпаковуючи? Це було б здорово! Чи можливо таке?

Можливо. Над цим замислювалися не тільки ви. Програмістами давно створений цілий клас програм спеціально для цієї мети. Називають їх пакувальниками. Найбільш відомі програми такого роду - LZExe, PKLite, DIET для DOS і ASPack для Windows. Вони дозволяють упакувати програму, отримуючи здійсненний файл меншого розміру. Т. е. Скажімо, якась програма, prg.exe, мала розмір 800 КБ, а після стиснення зменшилася до 350 КБ, але як і раніше працездатна.

Ніякої фантастики в цьому немає. Робота пакувальника багато в чому схожа на роботу архіватора. По суті, пакувальник є спеціалізованим архиватором, що створює виконувані файли програм. Результат його роботи - саморозпаковується, що містить програму. При запуску програма сама себе розпаковує, а потім починає працювати.

Дії пакувальника наступні. Основний код програми (EXE, DLL, CPL, BPL і ін.) Посегментно упаковується тим чи іншим методом (LZW, ZIP і ін.). Потім в початок програми додається процедура її розпакування перед виконанням, і модифікований файл записується на диск. Пакувальники програм для Windows ще витягують з файлу ресурсів основну іконку програми і компонують її в незапакованном вигляді, щоб файл програми в "Провіднику" виглядав пристойно.

Варіантів упаковки і розпаковування - різне безліч. Найпростіший варіант: програма при запуску розпаковується цілком. У деяких витончених випадках, спрямованих на боротьбу проти хакерів, ділянки програми розпаковуються тільки в міру звернення до них (знижує швидкодію). Більшість пакувальників працюють за методом "з пам'яті в пам'ять", т. Е. Програма розпаковується в новий сегмент пам'яті і потім звідти запускається. DIET (може бути, деякі реалізації) розпаковував в тимчасовий файл на диску, що дуже незручно, та й захисту ніякої.

Упаковка програми є також найпростішим методом захисту її від злому непрофесійним хакером-крякери. Деякі так і роблять. Крім цього, стисла програма певним чином захищена від вірусів, оскільки її основний код недоступний для модифікації файловим вірусом.

Найпопулярніший приклад програми, яка завжди поставлялася у вигляді запакованого файлу - антивірус Dr. Web. DOS-версія програми упакована DIET, а версія для Windows - ASPack'ом. Адже, напевно ви багато раз користувалися Dr. Web'ом, навіть не підозрюючи про те, що він запакований.

Детально розглянувши процес упаковки програм, ми можемо повернутися до питання, заданому на початку статті: "Що це за звір - unpacker?"

Якщо є програми-пакувальники, скажете ви, значить і повинні існувати програми-пакувальники. На кожен замок знайдеться свій ключ. Адже, як згадувалося вище, упаковка програми защіает її від злому непрофесіоналом. Але для справжніх профі це ж не проблема?

Все правильно. Пакувальників теж є досить. Це AutoHack, Intruder, CUP тощо. - всі вони для DOS. Мені особисто ще жоден распаковщик програм Windows не попадався. Хоча, ні, брешу, був один - UnASPack. Правда, він повинен був проводити розпакування ASPack тільки ранніх версій, і тому виявився непотрібний - у мене таких файлів не було. Зустрічалося ще згадка про UCFCUP32. Судячи з назви, це повинна бути Windows-версія названого раніше CUP. Тестувати його не доводилося, і нічого більш конкретного з цього приводу сказати не можу.

Існує два принципово різних методу розпакування упакованих програм: орієнтований на конкретний пакувальник і метод трасування.

Інший метод розпакування, - трасування, - принципово інший. Він був придуманий хакерами. Трасувальник запускає програму на виконання, а потім входить в режим відладчика і намагається "засікти" той момент, коли розпакування програми завершиться, і їй буде передано управління. Якщо це вдалося, трассировщик знаходить сегменти програми, виконує їх компонування і записує на диск. Кажуть ще, що він "здирає snapshot з програми" (так було написано в документації до якоїсь з програм, здається, AutoHack або Intruder). Отриманий в результаті файл не буде байт в байт ідентичний вихідній програмі, т. К. Методи компонування напевно різняться у трасувальника і вихідного компоновщика програми. З іншого боку, для операційної системи порядок запису сегментів в файлі не має абсолютно ніякого значення, якщо програма працює правильно. Таким чином, трасування є універсальним способом розпакування програм.

Не завжди, правда, вдається "зловити" момент запуску розпакованої програми. Є методи маскування, спрямовані проти трасувальникові. Один з них вже згадувався при огляді упаковки програм - розпакування частин програми у міру звернення до них. Якщо під час виконання програма ніколи не розпаковується повністю, - тут вже ніякої трассировщик не допоможе. Хоча, як методи захисту, так і методи злому постійно удосконалюються.

На закінчення дозволю собі навести ще один конкретний приклад. При тестуванні програма CUP для DOS, що працює методом трасування, розпакувала всі файли, які я їй дав. У тому числі упаковані самими екзотичними програмами, про які розробники CUP просто знати не могли. Все це зайвий раз підтверджує сказане про трасувальникові.

Якщо ви знаєте що-небудь нове про пакувальників або пакувальників програм, а також маєте питання по даній темі, пишіть. буду дуже радий.


[An error occurred while processing this directive]

[An error occurred while processing this directive]

Схожі статті