Розпакування asprotect 2

Перед початком роботи, проаналізуємо програму в Peid:

Розпакування asprotect 2

Програма упакована ASProtect 1.2x - 1.3x [Registered]. Спробуємо уточнити версію пакера, для чого застосуємо plugin VerA 0.15:

Розпакування asprotect 2

Програма упакована ASProtect 2.3 SKE build 06.26 Beta [Extract].

Тепер подивимося на цю програму в DiE v0.64:

Розпакування asprotect 2

Тут ми бачимо, що програма скомпільована на Delphi.

1. Запуск файлу в OllyDbg

Як завжди, спробуємо запустити програму в відладчик, щоб перевірити наявність анти-налагоджувальних пасток. Завантажуємо програму в відладчик, і отримуємо повідомлення про помилку:

Подивимося на карту пам'яті програми:

Розпакування asprotect 2

Програма ще не зупинилася на Entry Point, а ми вже отримали повідомлення про помилку.

Добре, в таких випадках рекомендується зупиняти в отладчике НЕ Entry Point програми, а на системній BreakPoint. Робимо відповідні зміни на вкладці відладчика "Події":

Розпакування asprotect 2

Перезавантажуємо програму, і зупиняємося тут:

Ми зупинилися на системній BreakPoint.

Розпакування asprotect 2

Розпакування asprotect 2

Натискаємо клавішу F9, і програма зупиняється на Entry Point:

Це - звичайне початок програм, захищених протектором ASProtect.

Намагаємося запустити програму, натиснувши клавішу F9, і програма нормально запускається:

Розпакування asprotect 2

Примітка: При завантаженні програми в відладчик, до її зупинки на системній BreakPoint, може бути показана наступна заставка з повідомленням про помилку

2. Пошук оригінальної точки входу (OEP)

При запуску же нашої програми, якщо ми подивимося в вікно LOG, виключення не генеруються:

Розпакування asprotect 2

Розпакування asprotect 2

Значить, таблиця IAT знаходиться тут (в секції 00481000. яка має розмірі 3000 байтів):

Розпакування asprotect 2

Розпакування asprotect 2

Запускаємо програму, натиснувши клавішу F9. і потрапляємо в цикл, який нам не потрібен:

Розпакування asprotect 2

Встановлюємо BP (F2) після стрибка JNZ, який виконується на початок циклу, і видаляємо BPM on write. Натискаємо клавішу F9, щоб пройти цей цикл, видаляємо встановлену BP, і знову встановлюємо BPM on write на секцію IAT. Такі дії нам доведеться повторити кілька разів, оскільки йде раскріптовка і запис коду в секцію .code. І, нарешті, ми приходимо сюди:

Розпакування asprotect 2

Натискаємо клавішу F9. і зупиняємося тут:

Розпакування asprotect 2

Потрапляємо на цикл записи; тому, встановлюємо BP на виході з цього циклу (після стрибка JA), видаляємо BPM on access. і натискаємо клавішу F9. Видаляємо BP і знову встановлюємо BPM on access на область коду. Такі дії нам доведеться зробити кілька разів, і ми потрапляємо сюди:

Розпакування asprotect 2

Ми прийшли на OEP, але - це помилкова OEP. Це твердження можна перевірити ще й в такий спосіб. Клацаємо правою кнопкою миші по інструкції CALL 01BA0000. і вибираємо команду:

Розпакування asprotect 2

У вікні посилань (кнопка R) бачимо багато посилань на цю інструкцію:

Розпакування asprotect 2

Очевидно, що ми маємо справу з Віртуальної Машиною (VM), в якій повинна виконуватися реальна OEP.

Розпакування asprotect 2

Розпакування asprotect 2

Тут ми бачимо інструкцію PUSH EBP. і, цілу купу сміттєвого коду. З інструкції PUSH EBP починається Entry Point програма, написаних на Delphi. Якщо ми прокрутимо трохи вниз вікно коду, то побачимо багато інструкцій CALL 01C30000:

Розпакування asprotect 2

Розпакування asprotect 2

Перезавантажуємо програму, і натискаємо клавішу F9, і, програма зупиняється на Hardware BP on access:

Розпакування asprotect 2

Дивимося у вікно регістрів:

Розпакування asprotect 2

Тут я показав, як вручну можна знайти VOEP. Уміння ручного знаходження OEP дуже важливо для будь-якого cracker's програм. Знайшовши вручну OEP, можна написати скрипт для проходження на OEP, оскільки, при розпакуванні програм, цю процедуру доводиться виконувати багато разів. REVENGE Crew написав скрипт, який успішно виконує цю роботу, і дуже мені подобається в роботі. Але цей скрипт не працює на ASProtect v2.3 SKE build 06.26 Beta, тому що в цій версії пакера не збігається одна "реперна" точка - це перевірка ланцюжка байтів 5B5E5F5D. Замість цього ланцюжка байтів, пакер ASProtect v2.3 SKE build 06.26 Beta має іншу ланцюжок байтів - C35B5E5F. яку потрібно використовувати в даному скрипті. Тому я трохи допрацював цей скрипт, який тепер виглядає наступним чином:

3. Відновлення INIT: Таблиця ініціалізації.

Таблиця ініціалізації INIT є тільки в програмах, скомпільованих на Delphi, і, оскільки наша програма скомпільована тим же самим компілятором, то нашу роботу, після проходження на VOEP. треба починати з відновлення Таблиці ініціалізації INIT.

Щоб трохи розібратися, як працює ця таблиця, давайте подивимося на будь-яку неупаковані програму, скомпільовану на Delphi. У мене встановлена ​​така програма -Resource Hacker v3.3.4.75, яка добре відома всім cracker's. Давайте на неї і розглянемо формат Init Table:

Завантажуємо цю програму в відладчик, і вона зупиняється на Entry Point - 004AB1FC:

Тут ми бачимо OEP (або, точніше Entry Point), тому перейдемо на цю OEP в Dump, і, щоб зробити її більш наочною, вибираємо режим відображення Long → Address.

Розпакування asprotect 2

Давайте трохи прокрутимо вгору, і знаходимо початок таблиці INIT:

Розпакування asprotect 2

Збираємо необхідну інформацію:

004AB030. Початок таблиці INIT.

Розпакування asprotect 2

004AB1F8. Кінець таблиці INIT.

Ось таку таблицю ми і повинні відновити на нашій програмі Reactive MYCOP Cleaner. Яким чином це можна зробити?

Завантажуємо програму в OllyDbg, і коли вона зупинилася на Entry Point, натискаємо клавіші ALT + M. і встановлюємо BPM on write на секцію коду:

Розпакування asprotect 2

Натискаємо клавішу F9. і програма зупиняється тут:

Ця область пам'яті нас не цікавить, тому кілька разів натискаємо клавішу F9, поки не опинимося тут:

Розпакування asprotect 2

Встановлюємо BP (F2) після стрибка JNZ, видаляємо BPM on write. натискаємо клавішу F9. і зупиняємося на BP. Видаляємо цю BP, і знову встановлюємо BPM on write на секції .code. як це робили раніше. Натискаємо клавішу F9. і зупиняємося тут:

Розпакування asprotect 2

Встановлюємо BP після стрибка JA, і видаляємо BPM on write. Натискаємо клавішу F9, і зупиняємося на BP. Видаляємо цю BP, і знову встановлюємо BPM on write на секції .code. як це робили раніше. Натискаємо клавішу F9. і зупиняємося тут:

Розпакування asprotect 2

І знову встановлюємо BP після стрибка, видаляємо BPM on write. запускаємо програму з F9, і зупиняємося на BP; знову видаляємо BP і встановлюємо BPM on write на секцію .code. запускаємо програму, і зупиняємося тут:

Розпакування asprotect 2

Розпакування asprotect 2

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

Таблиця Nº1: INIT

Таблиця Nº1: INIT

Розпакування asprotect 2

Виклик першої процедури раскріптовкі таблиці INIT: Тепер ми напишемо іншу таблицю, яку назвемо "Таблиця № 2 - Виклик першої процедури раскріптовкі таблиці INIT".

Таблиця Nº2: Виклик першої процедури раскріптовкі таблиці INIT

Розпакування asprotect 2

Перше, що нам треба знайти - це кінець таблиці INIT. Для цього проходимо в вікно dump, і шукаємо останнім відновлене значення INIT (згадайте, що в 1-му скрипті ми завершили відновлення першої частини таблиці INIT записом 0):

Розпакування asprotect 2

Запускаємо цей скрипт, який я назвав Recovery_INIT_2.osc.

Розпакування asprotect 2

Розпакування asprotect 2

Отже, ми відновили таблицю INIT. і тепер знаємо, де повинна бути наша нова OEP.

Нам потрібно скопіювати цю відновлену таблицю INIT:

Розпакування asprotect 2

Розпакування asprotect 2

Розпакування asprotect 2

Вставляємо і зберігаємо цей новий файл з ім'ям Recovery_INIT.

Далі ми розглянемо відновлення IAT і стрибків на IAT, віртуальну машину Asprotect, і реєстрацію програм, які використовують Asprotect.


Ви знаходитесь на EXELAB.rU