Старый 09.06.2011, 12:15   #1
Svet
 
Аватар для Svet
 
Регистрация: 11.09.2010
Сообщений: 172
Репутация: 42
По умолчанию [Перевод] Manually unpacking Asprotect 1.23 RC4 - 1.3.08.24

Введение
Asprotect - это один из сложнейших пакеров для реверсера средней квалификации, так что для первого урока по распаковке защитных схем я выбрал именно эту защиту. Так же Вы выучите как восстановить IAT (Import Address Table), возвратить перемещенные байты и как использовать лог трассировки.

Данные о цели
Файл..... iconmaker.exe [ download ]
Разработчик... King Lee, Fred Xu, Steven Bai
Программное обеспечение .. OllyDbg, ImportREC + Asprotect Plugin [ download ], LordPE [ download ]

Adficio
При использовании Asprotect с программой происходят следующие изменения:
  • Искажается OEP, EP определяется Asprotect'ом.
  • Обфусцируются вызовы модулей (функции заменяются на JMP).
  • Asprotect берет определенное количество байт с исходной программы и перемещает их.
Так что для распаковки нашей программы нам необходимо найти OEP, восстановить IAT и возвратить перемещенные байты (если таковые имеются; Asprotect не всегда перемещает байты). Но перед тем, как мы сможем приблизиться к защите через отладчик, нам необходимо настроить его немного иначе, чем обычно.

1 - a. Открываем Ollydbg
b. Идем в Options > Debugging options > Exceptions
c. Устанавливаем настройки как показано ниже:


Рис. 1 Опции Ollydbg

2 - a. Перезапускаем Ollydbg
b. Идем в File > Open и загружаем программу
c. Нажимаем No в окне сообщения


Рис. 2 Запрещаем анализ кода

Первый шаг - это нахождение OEP. Причиной смены конфигурации отладчика (задаем игнорирование большого количества исключений) является то, что Asprotect ловко использует исключения с целью запутать реверсера. Каждая программа, защищенная при помощи Asprotect, проходит через несколько (иногда до 30) исключений перед выполнением кода исходной программы. Нам необходимо точно определить, сколько исключений необходимо пройти перед тем, как программа выполнится, а потом пройти их еще раз, что бы на этот раз мы остановимся на последнем из них перед run-time

3 - a. Нажимаем [SHIFT] + [F9] (приблизительно 27 раз) пока не достигнем этого блока:


Рис. 3 Последнее исключение перед run-time

4 - a. Ставим точку останова на первом RETN в 0xA33A29
b. Нажимаем Yes в окне сообщения


Рис. 4 Подозрительна точка останова

5 - a. Нажимаем [SHIFT] + [F9] для прохождения нашей точки останова


Рис. 5 Успешная остановка на точке останова

Мы установили точку останова на первом RETN последнего исключения перед run-time и, благодаря этому, мы загрузили все команды, которые Asprotect выполняет глубоко в памяти. Так же благодаря этому, мы прошли все исключения, которые использует Asprotect перед распаковкой фактических инструкций программы. Запомните, следующая техника может быть использована во всех Ваших будущих руководствах по распаковке.

6 - a. Нажимаем [ALT] + [M]
b. Правый клик на 0x401000 и выбираем Set memory breakpoint on access


Рис. 6 Установка точки останова на секции .code

Установив другую точку останова (в этот раз - в начале секции .code) мы можем точно определить EP, так как в секции .code содержится код программы, так что ее первая инструкция, очевидно, и есть началом главной программы.

7 - a. Нажимаем [F9]


Рис. 7 EP

Этот раздел - это EP программы-цели (не OEP) недавно назначенный Asprotect'ом. " set_app_type" - это стандартная функция Microsoft Visual C++ 6.0, которая определяет тип приложения: консольное или оконное. Зачастую не важно значение этой функции, а важно само наличие ее. Сейчас мы знаем, что:
  • EP программы - 0x43608F
Что бы узнать, были ли перемещены некоторые байты программы, нам необходимо прокрутить вверх несколько строк и посмотреть на код. Если в программе с этим пакером были перемещены некоторые байты, то их можно найти как раз перед EP; это отличительная черта Asprotect'а этой версии

8 - a. Прокручиваем вверх до адреса 0x43605C
b. Нажимаем [CTRL] + [A]


Рис. 8 Ячейки перемещенных байт

В указанном участке мы видим 44 ячейки перемещенных байт. Надо вернуть их назад

9 - a. Нажимаем [CTRL] + [F2]
b. Нажимаем Yes в первом окне сообщения
c. Нажимаем No во втором окне сообщения
d. Повторяем шаги 4 - 6


Рис. 9 (шаг 6)

Теперь, когда у нас BP указывает на секцию .code, мы запустим условную трассировку.

10 - a. Нажимаем [CTRL] + [T]
b. Устанавливаем настройки, как показано на рисунке, и жмем OK:


Рис. 10 Настройка условной трассировки

11 - a. Нажимаем [CTRL] + [F11] и ждем примерно ~40 секунд пока не получим:


Рис. 11 Профит

Эти 5 инструкций являются "сигнатурой" этой версии Asprotect'а, так что достигнув этой точки, мы запускаем трассировку в наш назначенный раздел.

12 - a. Идем в View > Run Trace
b. Правый клик в любой точке (не забываем, что Highlight register > EBP is selected)


Рис. 12 Подсветка регистра EBP

13 - a. Прокручиваем вниз до конца лога трассировки


Рис. 13 Перемещенные байты

Для того, что бы быть точным касательно трассировки: мы использовали условную трассировку для того, что бы достигнуть момента, когда Asprotect начинает "распаковку" программы в память.

Мы обнаружили перемещенные байты, которые находятся по адресу 0xA856C3, однако Asprotect добавил немного мусорного кода. Но не стоит волноваться по этому поводу, нет ничего тяжелого в том, что бы убрать этот мусор из исходного кода, потому что мусор - это команды JMP SHORT

Всякий раз, когда Asprotect перемещает байты из программы, их исходное начало это OEP (в нашем случае - 0x436062).

14 - a. Запишем каждую инструкцию с 0xA856C3 по 0xA856FE в блокнот пропуская JMP SHORT


Рис. 14 Перемещенные байты

Посмотрим на несколько линий под этой секцией (0xA85708), где можно увидеть вызов, который заносит текущий EP в стек. Ячейки перемещенного кода начинаются с 0x436062, а EP находится по адресу 0x43608F. Для начала изменим точку перехода jump'a на наш OEP (который указывает на ячейки с перемещенными байтами).

15 - a. Выбираем 0xA85708 в Run Trace dialog и нажимаем [ENTER]
b. Двойной клик на выбранной инструкции по адресу 0xA85708 и пишем:


Рис. 15 Воcстановление OEP

Хотя мы и определили перемещенные байты и восстановили OEP, мы еще не готовы к восстановлению перемещенных байт. Для начала необходимо восстановить IAT (спасибо dqtln за указание на это!). Теперь мы собираемся сделать дамп программы.

16 - a. Повторяем шаг 9
b. Повторяем шаги 7 и 8
c. Правый клик на 0x436062 и выбираем New origin here


Рис. 16 Воcстановление OEP

17 - a. Идем в Plugins > OllyDump > Dump debugged process
b. Ставим настройки как показано ниже (затем нажмите Dump и сохраните файл как "dump.exe"):


Рис. 17 Делаем дамп программы

18 - a. Сворачиваем ollydbg и открываем imprec and и выбираем нашу программу из комбобокса
b. В поле "OEP" задаем значение "00036062"
c. Нажимаем AutoSearch
d. Нажимаем OK в окне сообщения


Рис. 18 Подготовка imprec

19 - a. В поле "Size" задаем значение "00001000"
b. Нажимаем Get Imports



Рис. 19 Загрузка импортов

20 - a. Нажимаем Show Invalid
b. Правый клик на отмеченных элементах и выбираем Trace Level1 (Disasm)


Рис. 20 Восстановление импорта Level1

21 - a. Нажмите Show Invalid (еще раз)
b. Правый клик на отмеченных элементах и нажимаем Plugin Tracers > ASProtect 1.23 RC4


Рис. 21 Автотрассировка при помощи плагина

В логе видно немалое количество ошибок и только несколько успешных результатов трассировки, но не стоит волноваться: так и должно быть Остальные thunks в файле могут быть безболезненно удалены, потому что они всего лишь мусор, который Asprotect добавил в программу.

22 - a. Нажимаем Show Invalid (...очередной раз)
b. Правый клик на одном из отмеченных элементов и выбираем Delete thunk(s)


Рис. 22 Убираем мусорные thunks

23 - a. Нажимаем Fix Dump
b. Выбираем дамп ("dump.exe") и нажимаем Open


Рис. 23 Сохраняем новый дамп

Imprec сохранил наш новый дамп как "dump_.exe" и теперь мы собираемся добавить перемещенные байты в него для того, что бы снова сделать его рабочим.

24- a. Закрываем ollydbg и открываем "dump_.exe" в заново открытом ollydbg
b. Выбираем все команды начиная с 0x436062 по 0x43608C, правый клик и выбираем Assemble
c. Восстанавливаем все инструкции из перемещенных байт
d. Нажимаем [CTRL] + [A]



Рис. 24 Восстановление перемещенных байт

25 - a. Правый клик в любой точке и выбираем Copy to executable > All modifications
b. Нажимаем Copy All
c. Нажимаем "x" в верхнем правом углу и жмем Yes
d. Выбираем дамп ("dump_.exe") и нажимаем Save


Рис. 25 Сохраняем распакованную программу

26 - a. Открываем LordPE и нажимаем Rebuild PE
b. Выбираем "dump_.exe" и жмем Open
c. Нажимаем OK


Рис. 26 Сохраняем распакованную программу

Сейчас мы загрузили программу в детектор пакеров и видим, что все отлично восстановилось





Перевел Svet

PDF-версия
Svet вне форума   Ответить с цитированием
Старый 09.06.2011, 16:38   #2
destiny
 
Аватар для destiny
 
Регистрация: 11.08.2010
Сообщений: 242
Репутация: 79
По умолчанию

#1: аспротект 1.23 стриппером почти всегда снимается
#2: на экзелабе есть даже спецтопик "список тем об аспротект"

Последний раз редактировалось .Slip; 10.06.2011 в 07:49.. Причина: нету больше .нет в заголовке
destiny вне форума   Ответить с цитированием
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход



Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot