<< Все статьи по взлому Распаковка Private ExE Protector 1.9 Обсудить эту статью >>
Автор:SubZero [SnD], Sh [AHT]
Уровень:Для опытных
Программа:UnpackME
Тип защиты:Private ExE Protector 1.9

Перевод статьи Sh [AHTeam] – http://ahteam.org


[ Кое-что об упаковщике ]

Private ExE Protector (PEP) – это несложный протектор. В нем имеются функции:

1. Анти-отладчик:

a) Проверка PЕВ (для скрытия используйте OllyAdvance By MarKuS-DJM или другой плагин).

b) FindWindow: Получает список окон, используя EnumWindows API, проверяет первые символы на соответствие "Import REC" / "OllyDBG" (нужно патчить заголовки окон ImpREC и OllyDBG).

c) К файлу добавляется большая секция:



OllyDBG виснет, и дамперы могут вести себя непредсказуемо.

2. Краденые байты:

Мы найдем их и добавим к файлу.

3. Краденые ресурсы:

Протектор шифрует ресурсы, добавляет к упакованному файлу и очищает секцию .rsrc. Затем перехватываются и эмулируются функции работы с ресурсами FindResource, LoadResource, SizeOfResource.

4. Импорт:

Импорты Kernel32 эмулируются при помощи переходников (мы напишем плагин для ImpREC).


[ Перед отладкой ]

Итак, нам нужно:

Настроить любой антиотладочный плагин для ollydebugger; выбрать все возможные опции защиты, изменить заголовки окна ollydebugger при помощи Anti-Detect-Olly by TeST for ExeCryptor (либо взять сборку Shadow Olly).

1. Изменить заголовок окна ImpRec.

2. Удалить большую секцию (в данном случае .reloc), и изменить виртуальное смещение VOffset секции .rdata на 0B000 (значение VOffset секции .reloc)

Откроем программу в отладчике… проблема… мы забыли про таблицу импорта. В ней только одна функция - ExitProcess. Удаляем таблицу полностью (обнуляем значения):



Дальше нам нужно выделить память по адресу 3550B000 (VA = 3510B000 RVA + 400000 IMGBASE), и скопировать туда секцию .rdata ( потому что все адреса относительные и замена смещения VOffset секции .rdata все испортит!).

Для этого нужно добавить 50 байт в файл и перенести туда значение OEP. В этих байтах мы напишем такой код:



Файл готов к отладке.


[ Эмуляция функций Kernel32 / нахождение Stolen Codes / OEP ]

Установить breakpoint на ntdll.ZwCreateThread (потому что kernel32.CreateThread эмулирована; и упаковщик использует Zw вместо обычного API).

В отладчике Shift+F9 и ждем остановки...

Удаляем breakpoint и ставим другой на ntdll.LdrGetProcedureAddress (потому что kernel32.GetProcAddress тоже эмулирована).

Еще раз Shift+F9 и ждем ...

Удаляем breakpoint, и переходим на второй адрес возврата (как на рисунке):



Код должен выглядеть так (признак того, что мы в нужном месте - Virtual Protect):



Добро пожаловать в область эмуляции импорта и переходников! Прокручиваем окно немного вниз:



Как видно, идет сравнение адреса импорта с адресом kernel32. Если не равно, происходит переход… нам нужно сделать его постоянным, чтобы импорт не эмулировался. Ок, некоторые функции могут не определиться… посмотрим…

Ставим hardware breakpoint на условный переход и перезапускаем программу.

Когда произойдет остановка, изменим его на JMP и удалим breakpoint. Прокручиваем окно еще ниже:



Ставим breakpoint на RETN 8, запускаем программу (Run) и ждем остановки. F8 один раз. Затем Ctrl+F9 (Execute till return)



Еще раз F8... мы нашли краденые байты (которые немного отличаются от оригинальных, так что мы не можем их просто скопировать на OEP. Но мы можем добавить их в новую секцию!)

Вот они, краденые байты… сохраним их:



Ставим breakpoint на RETN... запускаем ... потом F8 - и мы приземлились возле OEP. Отлично, делаем дамп! (автор рекомендует OllyDump). Потом открываем полученый дамп в LordPE, удаляем эти секции и делаем Rebuilt PE.



Автор использует следующие опции для получения лучшего результата:



Время заняться импортом; запускаем ImpREC, пишем смещение EP (Offset Of The EP) ... можно использовать плагин от автора, но сначала нам нужно поправить защищенный файл:

Заходим в функцию импорта ( jump / call to API :)



Нам нужно изменить плагин так, чтобы на выходе значение EAX было равно адресу API (как показано на рисунке). После правки плагина весь импорт должен корректно восстановиться! Теперь откроем дамп с поправленным импортом в редакторе ToPo и добавим 0x77+5 байт в новую секцию (не забудьте выставить "Redirect EntryPoint") ... и запишем туда краденые байты ( не забудьте исправить относительные смещения - relative Calls).

Файл полностью распакован. В будущем автор попробует найти способ исправить краденые ресурсы, так что ждите новую версию статьи ;)

Исходный текст плагина для ImpRec
UnpackMe можно скачать здесь

Thanx And Greeting to :
All SnD / Shabgard / UnReal Friends.
SUB Z3R0 | Spirit Of The Wind | - SnD TeaM 2oo6
SnD TeaM 2oo6 Forum -> http://www.tuts4you.com/forum/


От переводчика: респект Woodmann forum, Wasm.ru, CrackL@b, ARTeam и всем авторам замечательных статей.

<< Все статьи по взлому Обсудить эту статью >>

ALIEN Hack Team - http://ahteam.org
Только для образовательных целей