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

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

Програма упакована ASProtect 2.3 SKE build 06.26 Beta [Extract].
Тепер подивимося на цю програму в DiE v0.64:

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

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

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


Натискаємо клавішу F9, і програма зупиняється на Entry Point:
Це - звичайне початок програм, захищених протектором ASProtect.
Намагаємося запустити програму, натиснувши клавішу F9, і програма нормально запускається:

Примітка: При завантаженні програми в відладчик, до її зупинки на системній BreakPoint, може бути показана наступна заставка з повідомленням про помилку
2. Пошук оригінальної точки входу (OEP)
При запуску же нашої програми, якщо ми подивимося в вікно LOG, виключення не генеруються:


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


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

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

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

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

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

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

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


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


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

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

Тут я показав, як вручну можна знайти 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.

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

Збираємо необхідну інформацію:
004AB030. Початок таблиці INIT.

004AB1F8. Кінець таблиці INIT.
Ось таку таблицю ми і повинні відновити на нашій програмі Reactive MYCOP Cleaner. Яким чином це можна зробити?
Завантажуємо програму в OllyDbg, і коли вона зупинилася на Entry Point, натискаємо клавіші ALT + M. і встановлюємо BPM on write на секцію коду:

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

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

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

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


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

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

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

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


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



Вставляємо і зберігаємо цей новий файл з ім'ям Recovery_INIT.
Далі ми розглянемо відновлення IAT і стрибків на IAT, віртуальну машину Asprotect, і реєстрацію програм, які використовують Asprotect.
Ви знаходитесь на EXELAB.rU