0xg3 :: Первый крак :: Взламываем первую программу
Введение
Этот туториал поможет тебе сделать первый крак. Ты узнаешь, как внедрить программу в отладчик и внести в нее изменения с помощью hex редактора. Кроме того, ты начнешь изучать расчет оффсета.
Инфо
Filename..... msgbox.exe [download]
Developer... +Neffarion
Toolz........... OllyDbg, XVI32, Windows API Reference [download]
Adficio
Первое, что ты должен делать в начале каждого реверсинга - проверить, упакована ли целевая программа.
1 - a. Сканирование программы на наличие упаковщиков используя PEiD
Рисунок 1. Сканирование с помощью PEiD
Кроме проверки на наличие упаковщиков, PEiD также пытается определить, на каком из языков программирования была написана программа. Есть много инструментов, написанных специально для реверсинга, для определенного языка программирования. Например DeDe может декомпилировать программу, написанную на Delphi так эффективно, что мы сразу в одном шаге от того, чтобы получить исходный код :)
PEiD не может определить, на каком языке программирования была написана программа. Когда возникает такая ситуация, тебе придется прибегнуть к другим способам. Однако это выходит за рамки этого туториала. Чтобы написать этот CrackMe, мною был импользован MASM32. После проверки программы на наличие упаковщиков, самое время для просмотра.
2 - a. Открытие целевой программы
Рисунок 2. Целевой СrackМe
Разбери, что ты видишь в ходе выполнения программы; какие элементы управления, текст и события в программе. Проделывая это, ты строишь для себя смысловой портрет программы. В этой целевой программе в самом начале мы видим следующие вещи:
Нахождение всех этих атрибутов я называю этапом "наблюдения".Code: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 :)
Слева направо: относительный виртуальный адрес, OP код, Инструкции, Анализ.
Относительный виртуальный адрес (RVA): место в памяти, где расположена инструкция. Каждая команда имеет свой собственный адрес, который, как мы определили, находится в определенных частях откомпиленной программы и может быть найден при отладке. RVA может быть найден только отладчиком, так что если ты хочешь создать патч, то тебе придется конвертировать RVA каждой команды на смещение в файле (File Offset).
ОP Код: шестнадцатеричное значение инструкции. Каждая команда прописывается на ASM и OP код переводит значения конкретных инструкций в шестнадцатеричные значения, которые являются, как мы определили, конкретными частями откомпиленной программы.
Инструкция: единичная операция от программы в CPU. Когда открывается программа, она загружается в память, где затем преобразуется в ASM инструкции. Затем процессор продолжает выполнять следующие действия на основе передаваемой инструкции с конкретным файлом. Крэкинг - это искусство поиска тех инструкций (загруженных в память), которые соответствуют системе безопасности программы и работы с ними в целях обнулить/обойти эту систему.
Анализ: OllyDbg будет анализировать определенные инструкции и на выходе предоставлять перевод в "человеческий вид" для каждой команды. Это делает реверсинг намного легче, по понятным причинам :)
Первая строка выполняемого кода называется "точка входа" (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. Когда ты знаешь, какие значения могут быть переданы для параметров, у тебя и взлом пойдет полегче :)
Функция MessageBox определяется так:
HWND: Handle of the owner window, в данном случае NULL (0);Code:int MessageBox( HWND hWnd LPCTSTR lpText LPCTSTR lpCaption UINT uType );
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












Reply With Quote
Thanks
