Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 8 мая!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь


Создание Inline Patch для ExeCryptor 2.xx




Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Создание Inline Patch для ExeCryptor 2.xx

Copyright © RSI, 2009

ОГЛАВЛЕНИЕ

  1. Введение 3

  2. Создание примера 4

  3. Обычный патч 5

  4. Inline Patch версий до 2.4.1 6

Inline Patch версии 2.4.1 9

Введение

Как оказалось на паблике почти совсем нет инфы по инлайну криптора, а если и есть то такие «извращенные» приемы, хотя он не обновлялся уже очень давно, поэтому я решил это исправить.

Методы инлайна немного различаются для версий криптора до 2.4.1 и после 2.4.1. Это связано с тем что когда была версия 2.4.0 вышел мой анпакер и авторы сделали апдейт до версии 2.4.1 куда вставили несколько моментов для противостояния автоматической распаковки и по мелочам остального.

Поэтому я решил расписать отдельно создание патча для этих 2 групп.

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

Собственно этого достаточно.

Создание примера

Нам нужна программа на которой мы будем тренироваться, я не стал брать в пример какую-нибудь shareware программу, ограничился созданием своего маленького и наглядного примера.

Итак, взял VC++ 6.0 и сделал простенькую заготовку с таким кодом( Example.exe) :

Создание Inline Patch для ExeCryptor 2.xx



После компиляции в отладчике этот код выглядит следующим образом:

Создание Inline Patch для ExeCryptor 2.xx



Обычный патч

Теперь рассмотрим пример обычного патча неупакованной программы, для того чтобы она работала как нам нужно.

Итак, если запустим сейчас тестовый пример (Example.exe) то он нам выдаст следующее:

Создание Inline Patch для ExeCryptor 2.xx



Нам же нужно чтобы появилось сообщение об успешной регистрации.

Для этого нам нужно пропатчить код следующим образом (один из вариантов):

Создание Inline Patch для ExeCryptor 2.xx



Красным цветом выделена строка в которой произошли изменения.

Это сделали мы ручками, аналогия этого программно,

патч состоит из команды MOV DWORD PTR DS: [00401007], 11111111

после того как мы это сделали и сохранили (Example_.exe), запускаем и получаем:

Создание Inline Patch для ExeCryptor 2.xx



То что и нужно, собственно на этом и остановимся с рассмотрением примера, теперь нам нужно сделать такой же патч, но только в упакованных криптором примерах.

Inline Patch версий до 2.4.1

Я запротектил наш пример версией криптора 2.2.6 ( Example_2.2.6.exe ) С опциями сжатия кода и данных ( по умолчанию ).

Итак, собственно приступим:

Грузим файл в OllyDbg проблемы антиотладки и прочего тут не будут рассматриваться.

Логика создания любого инлайн патча это:

  1. Дождаться пока распакуется нужный код

  2. Пропатчить код

  3. Пропатчить проверки CRC ( если нужно ).

1) Дождаться пока распакуется нужный код:

Т.к. интересующий нас участок кода находится в секции .text

Name: VOffset: VSize: ROffset: RSize: Flags: .text 00001000 00003000 00000400 00000000 E0000020

То ставим мемори бряк на запись в эту секцию, попадаем на такой код:

Создание Inline Patch для ExeCryptor 2.xx



Это фунция которая распаковывает код, немножко не то что нам нужно, позже обьясню почему, а пока просто снимаем мемори бряк с секции .text и ставим бряк на код в конец функции распаковки.

Если вы попадете не на команду REP, а там будет STOS это всего лишь говорит что это выставлена доп. опция максимальной компрессии по алгоритму JCALG1 от Jeremy Collake.

В любом случае ищите ниже команду конца цикла распаковки

MOV EAX, ESI тут она у нас по адресу 442D13.

После того как функция распаковки отработала. В секции .text содержится распакованный код, но это еще не финальный вариант, т.к. особенностью данного алгоритма компрессии данных ( как в LZMA ) является после распаковки поправка смещений инструкций с опкодами E8 (call) и E9(jmp).

Поэтому после того как мы стоим в конце функции распаковки данных, ставим мемори бряк на запись в секцию опять, чтобы попасть на функцию поправки смещений. И попадаем туда, выглядит она следующим образом:

Создание Inline Patch для ExeCryptor 2.xx



Параметры функции:

EAX - Адрес начала распакованных данных = VA секции EDX - Размер данных = VS секции

После того как закончится цикл, стоя на адресе 004276CF в ESI будет лежать число равное = Адрес начала данных + его размер - 4.

Для распаковки первой секции функцию вызовут с параметрами: EAX = 00401000 EDX = 00003000

После выполнения ESI = 00401000 + 00003000 - 4 = 00403FFC Зачем я обратил внимание на ESI, да потому что с этой функции мы и будем начинать делать свой патч, а ESI нам будет служить для идентификации какая секция в данный момент распаковалась.

Возникает вопрос зачем нам это знать, ведь мы можем просто вставить код патча который постоянно будет выполняться с этой функцией, но тут есть маленький нюанс, после того как криптор распаковал и поправил смещения, он выставляет секции оригинальные атрибуты доступа, по умолчанию у кода нет атрибутов для записи и если мы будем делать прыжок на наш патч позже, нам придется или ставить снова атрибуты на запись или программа просто упадет с ошибкой! Поэтому нам нужно сделать своеобразную switch конструкцию для ESI где для определенного значения вызывать свои действия.

Скажем, если ESI = 1 то была распакована секция кода и мы будем патчить необходимый нам код, если ESI = 2 то была распакована секция данных и мы там подправим строчку, если ESI = 3 то была распакована «Экстра» секция криптора и мы будем патчить там проверку CRC файла, т.е. думаю смысл понятен.

Функция которая правит смещения открыто лежит в секции протектора, т.е. тут нет многослойных распаковщиков как например в версиях ASProtect.

2) Пропатчить код

В общем начинаем делать наш патч. Ищем свободное место в файле, если патч будет маленький, то можно использовать PE заголовок, если большой, то добавить свою секцию к файлу. Я решил добавить свою секцию.

И собстенно как выглядит функция патча.

Name: VOffset: VSize: ROffset: RSize: Flags: .inline 00048000 00001000 00020A00 00000200 E00000E0

Итак, патчим функцию таким образом:

Создание Inline Patch для ExeCryptor 2.xx




Создание Inline Patch для ExeCryptor 2.xx



3) Пропатчить проверки CRC ( если нужно ).

Если бы нужно было патчить еще CRC, то пришлось бы вставить еще одно сравнение ESI и в том участке сделать фикс для CRC.

Сохраняем изменения, запускаем. Все работает! ( Example_2.2.6_inline.exe ).


Inline Patch версии 2.4.1

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

Поэтому берем пример (Example_2.4.1.exe) и проделываем все те же действия как для версии 2.2.6 для поиска функции поправки смешений и попадаем:

Создание Inline Patch для ExeCryptor 2.xx



Как видим с адреса 004236С0 до 004236E5 идет фейковая функция.

А вот ниже идет нужная нам функция поправки смещений, только этот код перед выполнением расксоривается, а после выполения опять заксоривается.

Поэтому нам нужно пропатчить ее как и в предыдущем примере, далее дождаться пока криптор ее заксорит и уже тот код сохранить.


Создание Inline Patch для ExeCryptor 2.xx



Далее потрейсим этот цикл до конца его выполнения, а точнее до:


Пропатчили (предполагаем что код патча по адресу 443000 в новой секции уже есть ), ставим бряк на доступ к памяти 42370B. И попали вот сюда:

Создание Inline Patch для ExeCryptor 2.xx




Создание Inline Patch для ExeCryptor 2.xx




Создание Inline Patch для ExeCryptor 2.xx



Как видим, криптор заксорил код с нашим джампом теперь этот код и нужно нам сохранить чтобы при следующем запуске он его раскорил и там уже был наш патч.

Сохраняем эти 5 байт + код патча в новой секции, запускаем и видим что работает!

Ну вот и Все!!! ;)



Скачать статью "Создание Inline Patch для ExeCryptor 2.xx" в авторском оформление + файлы.
пароль архива на картинке



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS