R0 CREW

Neffarion :: 0xg3 :: Первый крак :: Взламываем первую программу (Перевод: Heroin)

0xg3 :: Первый крак :: Взламываем первую программу

Введение

Этот туториал поможет тебе сделать первый крак. Ты узнаешь, как внедрить программу в отладчик и внести в нее изменения с помощью hex редактора. Кроме того, ты начнешь изучать расчет оффсета.

Инфо

Filename… msgbox.exe [download]
Developer… +Neffarion
Toolz… OllyDbg, XVI32, Windows API Reference [download]

Adficio

Первое, что ты должен делать в начале каждого реверсинга - проверить, упакована ли целевая программа.

1 - a. Сканирование программы на наличие упаковщиков используя PEiD

Рисунок 1. Сканирование с помощью PEiD

Кроме проверки на наличие упаковщиков, PEiD также пытается определить, на каком из языков программирования была написана программа. Есть много инструментов, написанных специально для реверсинга, для определенного языка программирования. Например DeDe может декомпилировать программу, написанную на Delphi так эффективно, что мы сразу в одном шаге от того, чтобы получить исходный код :slight_smile:

PEiD не может определить, на каком языке программирования была написана программа. Когда возникает такая ситуация, тебе придется прибегнуть к другим способам. Однако это выходит за рамки этого туториала. Чтобы написать этот CrackMe, мною был импользован MASM32. После проверки программы на наличие упаковщиков, самое время для просмотра.

2 - a. Открытие целевой программы

Рисунок 2. Целевой СrackМe

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

Run sequence: main >= MessageBox() > ExitProcess() 
Strings: Assembly is sexy! | Your First ASM Program 
Functions: MessageBox | ExitProcess

Нахождение всех этих атрибутов я называю этапом “наблюдения”.

3 - a. Загрузка программы в OllyDbg (File > Open)

Рисунок 3. Целевой СrackМe в OllyDbg

Как ты видешь, программа очень мала, поэтому она не состоит из много инструкций. Позволь мне кратко объяснить важные части OllyDbg :slight_smile:

Слева направо: относительный виртуальный адрес, OP код, Инструкции, Анализ.
Относительный виртуальный адрес (RVA): место в памяти, где расположена инструкция. Каждая команда имеет свой собственный адрес, который, как мы определили, находится в определенных частях откомпиленной программы и может быть найден при отладке. RVA может быть найден только отладчиком, так что если ты хочешь создать патч, то тебе придется конвертировать RVA каждой команды на смещение в файле (File Offset).

ОP Код: шестнадцатеричное значение инструкции. Каждая команда прописывается на ASM и OP код переводит значения конкретных инструкций в шестнадцатеричные значения, которые являются, как мы определили, конкретными частями откомпиленной программы.

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

Анализ: OllyDbg будет анализировать определенные инструкции и на выходе предоставлять перевод в “человеческий вид” для каждой команды. Это делает реверсинг намного легче, по понятным причинам :slight_smile:

Первая строка выполняемого кода называется “точка входа” (Entry point, ЕР). Есть 2 вида EP:
Оригинальная Точка входа (OEP): EP по умолчанию установленная компилятором, когда ты скомпилировал исходный код перед упаковкой. Однако этот термин используется только тогда, когда мы знаем, что программа упакована.

Точка входа (EP): первая строка кода, выполняемая при запуске программы. EP отличается от OEP, тем что когда программа упакована (например с ASProtect или Armadillo) OEP смещается в другую часть в программе и EP становится первой инструкцией в качестве собственной защиты.
EP этой программы является 0x401000. Обрати внимание, что адреса памяти начинаются с “0x”, но в большинстве отладчиков они просто отображаются без этого префикса.

От 0x401000 до 0x401015 мы видим линию, нарисованную в секции кода OP. Это означает, что инструкции между верхней и нижней частями этой линии являются частью “блок кода” - набора инструкций, которые принадлежат функции. Это может показаться странным, но на самом деле все очень просто. В секции анализа этого блока мы видим виды информации, такие как “Style”, “Title” и т.д. Это параметры функции API. В этом можно убедиться, глядя на 0x401000E, где мы видим вызов “MessageBox” функции в user32.dll. После показа сообщения вызывается API “ExitProcess” и программа завершает работу (именно так, как мы предполагали в наших наблюдениях).

Примечание: перед вызовом API-функции, его параметры передаются первыми!

Последние 2 линии под этим блоком - импорты, которые объявлены в программе. Импорты - вызовы, которые делает программа в другие библиотеки, с тем чтобы использовать определенные функции из этой библиотеки. Так как сейчас большинство программ сильно зависят от API, это очень правильный шаг к тому, чтобы узнать, как отреверсить API-функцию. Для этого мы будем использовать Windows API Reference.

4-a. Открытие Windows API Reference b. Идем во вкладку "Index" с. Ищем "MessageBox" и двойной щелчок на ней

Рисунок 4. Windows API Reference

Эта ссылка имеет неоценимое значение для любого крэкера, потому что ты можешь найти здесь все родные Windows API. Когда ты знаешь, какие значения могут быть переданы для параметров, у тебя и взлом пойдет полегче :slight_smile:

Функция MessageBox определяется так:

int MessageBox( 
HWND hWnd 
LPCTSTR lpText 
LPCTSTR lpCaption 
UINT uType 
);

HWND: Handle of the owner window, в данном случае NULL (0);
lpText: Текст в окне сообщения, в данном случае “Assembly is sexy!”. Это указатель, так что сам текст не хранится по адресу этого параметра.
lpCaption: заголовок окна сообщения, в данном случае “Your First ASM Program”. Это указатель, поэтому фактически заголовок не хранится по этому адресу, этот параметр будет найден в другом месте программы.
uType: Стиль окна сообщения, в данном случае MB_OK (0). Существуют различные стили для окна сообщения, а именно: сообщение с 3 кнопками или с одной кнопкой и значком слева, и т.д. Для получения дополнительной информации по этому вопросу см. справочник по Windows API.

Теперь мы точно знаем конструкцию функции окна сообщения, поэтому для начала просто изменим значения используемых строк:) Мы уже видели важные части в отладчике, поэтому пришло время познакомиться с шестнадцатеричным редактором.

5 - a. Загрузка цели в XVI32 (File > Open)

Рисунок 5. Целевой CrackME в XVI32

Слева направо: смещение в файле, Hex данные, Raw данные.
Смещение в файле: то же самое, что виртуальный адрес в отладчике, только написанный по-другому. Виртуальный адрес, который ты видишь в отладчике - адрес в памяти, куда отладчик загрузил инструкцию твоей цели. Поэтому виртуальный адрес относительная величина. File Offset - абсолютное значение виртуального адреса, а именно, - это точное местоположение внутри файла, в котором находится инструкция и может быть доступна отдельно от отладчика (т.е.: Visual Basic или антивирусным сканером).

Hex данные: Все инструкции целевой порграммы представлены в шестнадцатеричной форме.

Raw данные: Все hex данные представлены в форме текстовых. Это поле имеет смысл только при поиске строк, потому что большинство данных, представленных здесь, бесполезно для нас.

Как я упоминал, что для того чтобы получить доступ к инструкции вне отладчика необходимо преобразовать RVA каждой команды в эквивалентный FO. Но если ты хочешь найти без напрягов, то ты также можешь использовать функцию поиска в XVI32.

6 - a. В XVI32 нажимаем CTRL + F b. Выбираем опцию "Text string" c. Ищем "sexy"

Рисунок 6. Поиск в XVI32

Рисунок 7. Поиск в XVI32

8 - a. Выбираем букву “s” в raw данных и пишем “fail”.

Рисунок 8. Измененная строка

Шаг 9. Жмем File > Save As

Рисунок 9. Новое окно

В шаге 7 мы изменили строку с “sexy” на “fail”. Но обратной стороной использования Hex редактора для замены строки является возможность замены только строки фиксированной длины, то есть: строка “sexy” имеет 4 символа, таким образом, новая строка должна также иметь 4 символа. Если это не выполняется, то в программе будет ошибка выполнения, так как смещения в файлах были изменены:(

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

© +Neffarion
http://www.0xNeff.eu

© Translated by Ex0rcist a.k.a. Heroin from GR TeaM
© Resident of r0 Crew

Спасибо)
Ждем продолжений…

В ближайшее время пробегусь по туториалу, постараюсь восстановить скрины.

Ты нашел где-то копию этих туториалов?

по моему у меня на локалке остались, на днях посмотрю, если не забуду…

Было бы не плохо, если бы они нашлись, а то меня уже раз пять спрашивали: “можно ли что-то с этими скринами сделать”.

Да я вообще думал просто пройтись по тексту, и восстановить примерно похожие изображения.

Ясно =)

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

Всем привет!
В данном и следующих уроках приводятся ссылки на файлы, расположенные на ресурсе https://www.0xneff.eu/… К сожалению, данный ресурс (и соответственно, файлы) не доступен. Можно ли где еще найти эти файлы?
И еще вопрос: нашлась ли копия этих туториалов со скринами?
Спасибо!

Приветствую всех,
можно ли восстановить ссылки на исполняемые файлы для упражнений?

К сожалению, нет. Все ссылки вели на сайт автора, никто не додумался к себе сохранить.

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

Пока могу предложить такой вариант:

  1. Вы нумеруете картинки 1-2-3-4-5-…-N.jpg и проставляете их в теги [IMG].
  2. Архивируете все картинки и даете мне ссылку на скачивание.
  3. Я загружаю на сервер картинки и добавляю в теги [IMG] путь к этим файлам.