Взлом 3-х простых кракми для самых маленьких — HackZona.Ru

Взлом 3-х простых кракми для самых маленьких

Взлом 3-х простых кракми для самых маленьких

Тип статьи:
Со старой ХакЗоны.
Источник:
*** Предисловие ***
Приветствую, уважаемый читатель. Это моя первая статья и я постараюсь написать её как можно более внятно. Т.к. эта статья расчитана на новичков я буду полностью объяснять назначение функций и термины, которые возможно не знают новички..

Нам понадобятся:
Hiew — Hex-редактор (http://cracklab.ru/download.php?action=get&n=MjU=).
OllyDbg — отладчик (http://cracklab.ru/download.php?action=get&n=MzYw).
crackmes(http://tport.be//crackingpage/text/crackme.rar).


*** Crackme #1 ***
Этот крякми (crackme(англ.) — «взломай меня», специальная программа предназначеная в основном для новичков, которые ещё тольно учатся ломать программы) один из простейших на мой взгляд: обычный наг-скрин. Ну чтож, начнем осмотр «жертвы»...


Запускаем crackme, появляется сообщение с заголовком «Nag Nag Nag» и сообщением «Hey, fucking lamer, patch me! :)». Для тех кто незнает английский: Nag ~ заноза, т.е. сообщение которое вылазит в самый неподходящий момент :). Текст сообщения не очень приличный, поэтому переведу лишь смысл: надо пропатчить это сообщение. Жмем ОК, появляется окно с текстом Patch me: Using tools and help (пропатчи меня, используя любые инструменты и помощь). Жмем Exit и вылазит ещё один наг, его надо не просто убрать, а заменить текст сообщения, заголовок и иконку.

Патч — замена кода программы на свой собственный.

Начнем взлом:

Запустим в OllyDbg:
И вот сразу же в коде начинается вызов MessageBoxA, вот его описание от мелкомягких:

int MessageBox(

HWND hWnd, // Хэндл родительского окна
LPCTSTR lpText, // Адрес текста сообщения
LPCTSTR lpCaption, // Адрес заголовка сообщения
UINT uType // Стиль сообщения (отвечает за кнопки и иконки)
);

При запуске программы все эти параметры подаются в обратном порядке, т.е. сначала идет uType, затем lpCaption, lpText, hWnd.
Это сообщение — самое первое, его надо просто убрать, для этого просто занопим его вызов (nop — No OPeration(англ.) — Нет ОПерации (90h в опкодах)):

00401000 >/$ 6A 00 PUSH 0; /Style = MB_OK|MB_APPLMODAL
00401002 |. 68 21304000 PUSH first.00403021; |Title = «Nag Nag Nag»
00401007 |. 68 00304000 PUSH first.00403000; |Text = «Hey, fucking lamer, patch me! :)»
0040100C |. 6A 00 PUSH 0; |hOwner = NULL
0040100E |. E8 7F000000 CALL; MessageBoxA

Так выглядит вызов MessageBox в дизассемблере. Нам нужно занопить 5 байт по адресу 0040100E. Жмем два раза на CALL, откроется маленькое окошко с одним полем для ввода, там напишем один раз nop (OllyDbg автоматом заменит весь вызов функции). Теперь запустим программу нажатием клавиши F9. Ну как? Зловредного нага небыло? :) Теперь чтобы навсегда отучить программу выдавать нехорошие сообщения пропатчим её .exe (Оля(OllyDbg) пропатчила только в памяти) используя HIEW. Открываем файл, два раза [ENTER]. Жмем F5 (переход по адресу) и пишем .40100E, теперь, когда мы на нужном месте: F3 (редактирование) напишем 5 раз 90 (Почему именно 5? Да потому, что команда вызова сообщения (CALL) занимает ровно 5 байт (E8 7F 00 00 00)). F9 для сохранения изменений и Esc для выхода из редактора. Теперь запусти измененный файл. Если все нормально работает и сообщение не выпадает — читай дальше, иначе — читай все заново :).
Приступим к слудующему сообщению. Теперь все не так-то просто, сейчас нам надо заменить текст, заголовок и иконку сообщения. Снова открываем OllyDbg и ищем ещё один MessageBoxA:

0040105A |. 6A 10 PUSH 10; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
0040105C |. 68 74304000 PUSH first.00403074; |Title = «ReplaceMe to [!!CRACKED!!]»
00401061 |. 68 2D304000 PUSH first.0040302D; |Text = «Replace this text on any other, and replace icon to 'information icon'»
00401066 |. 6A 00 PUSH 0; |hOwner = NULL
00401068 |. E8 25000000 CALL; MessageBoxA

Сначала сменим иконку, чтобы узнать какой код соответствует 'information icon' напишем на ассемблере программу выводящую сообщение с этой самой иконкой:

_____________________________________________________
.386
.model flat, stdcall
option casemap :none
include MASM32INCLUDEwindows.inc
include MASM32INCLUDEkernel32.inc
include MASM32INCLUDEuser32.inc
includelib MASM32LIBkernel32.lib
includelib MASM32LIBuser32.lib

.data
message db «Hello World!»,0
.code
start:
invoke MessageBox,0,addr message,addr message,MB_ICONINFORMATION
invoke ExitProcess,0
end start
_____________________________________________________


Скомпелировав откроем в дизассемблереотладчике и посмотрим код вызова сообщения:

00401000 >/$ 6A 40 PUSH 40; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
00401002 |. 68 00304000 PUSH 324.00403000; |Title = «Hello World!»
00401007 |. 68 00304000 PUSH 324.00403000; |Text = «Hello World!»
0040100C |. 6A 00 PUSH 0; |hOwner = NULL
0040100E |. E8 0D000000 CALL; MessageBoxA

А вот и код иконки — 40h. Меняем PUSH 10 на PUSH 40 по адресу 40105A.

Заголовок сообщения. Его надо изменить на [!!CRACKED!!]. Открываем Memory Map находим там секцию .data с адресом 403000. Двойной щелчек мыши и открывается дамп этой секции, ищем там строку [!!CRACKED!!]. Она находится по адресу 403081. ЗАменяем PUSH first.00403074 (0040105C) на PUSH 403081 (двойным щелчком на команде push). Теперь осталось Заменить сам текст сообщения, в дампе была запись: You can use this text for replace text of message по адресу 40308F, вот на нее то мы и заменим сообщение. Попровив все в OllyDbg запускаем по F9 и лицезреем собственноручно взломанную программу :). При желании можешь править программу в HIEW. Чтобы узнать что и как править, можешь воспользоваться подсветкой олли (отредактированные фрагменты кода выделяются красным цветом, да и опкоды там тоже показаны.). Поздравляю! :) Теперь настоящий кракер! :)


*** CRACKME #2 ***
Защита этого кракми основанна на пароле. Очень простая защита. Запускаем программу: видим одну строку для ввода пароля, две кнопки: OK и Exit. При вводе произвольного пароля программа мягко посылает нас куда подальше :).
Открываем в олли и жмем правой кнопкой на коде -> Search For -> Alle referenced text strings. В появившемся окне ведем поиск подозрительных строчек… Ага! Вот: m3g4p455w07d Запускаем кракми по F9 и вводим этот пароль. Вуаля, и защита взломанна! :( НО! Этот способ подходит лишь для маленьких программок, а что, если в программе миллионы разных строчек? Есть ещё несколько разных способов, один из них я покажу. Существуют разные API функции для сверки строк, одной из них является lstrcmpA:

int lstrcmp(

LPCTSTR lpString1, // Адрес первой строки
LPCTSTR lpString2 // Адрес второй строки
);

В этом кракми была использованна кокраз эта функция. Поставим на нее брейкпоинт (breakpoint — точка останова выполнения программы): в нижней строке (commandbar) напишем bp lstrcmpA и запустим на выполнение программу. Вводим любой пароль и жмем OK. Попадаем в дебри системной библиотеки, менм Ctrl+F9 и F8 последовательно, для выхода и нее.Оказываемся на таком месте:

00401054 |. 68 00304000 PUSH second.00403000; /String2 = «m3g4p455w07d» — строка 2
00401059 |. 68 44304000 PUSH second.00403044; |String1 = «123321» — строка 1
0040105E |. E8 83000000 CALL; lstrcmpA — мы тут

В строке номер 2 лежит тот самый заветный пароль :). Теперь, после того как мы нашли пароль, неплохо бы и полностью сломать кракми (чтобы при любом пароле кракми «вел себя правильно»:)). После этой функции идет ещё 2 строки:

00401063 |. 83F8 00 CMP EAX,0
00401066 |. 75 40 JNZ SHORT second.004010A8

Поясняю, если строки одинаковы, функция возвращает в eax 0, иначе любое другое число.
В этих строках происходит соравнение eax c нулем, если eax=0 тогда прыгает на сообщение о хорошем пароле, иначе на плохое :) Этот «прыжек» осуществляется при помощи JNZ (условный переход), чтобы всегда пароь был хорошим просто занипим JNZ, т.к. сразу после него идет сообщени о валидном пароле, либо изменим его на JZ. Думаю объяснять как это сделать уже не надо, поэтому переходим к crackme #3

*** CRACKME #3 ***
Запускаем программу и смотрим, что имеем. Кнопка «Scan for debugger» явно свидетельствует от том, что защитой является анти-отладка. Итак, приступим к подробному изучению. Открываем в OllyDbg и смотрим на предмет подозрительностей :) Открываем Memory map, там смотрим дам секции .rdata (там находится таблица импорта (хотя, таблицу импорта лучше смотреть дизассемблере(немного удобнее))) и смотрим на подозрительные функции. Вот она: IsDebuggerPresent,

BOOL IsDebuggerPresent(VOID)

Эта функция находится в kernel32.dll и следит за использованием пользователем отладчика. При нахождении отладчика помещает в eax не ноль, иначе 0. Найдем в коде программы вызов этой функции, вот он:

0040104B. E8 A8000000 CALL; [IsDebuggerPresent

после идет проверка eax на ноль, если ноль, то продолжает выполнение программы, иначе на вывод сообщения о том, что программа обноружила отладчик:

00401050. 83F8 00 CMP EAX,0
00401053. 75 42 JNZ SHORT three.00401097
....
00401097 > 68 00304000 PUSH three.00403000; /Text = «Hey, stop debug me! :'(»
0040109C. 68 ED030000 PUSH 3ED; |ControlID = 3ED (1005.)
004010A1. FF75 08 PUSH DWORD PTR SS:[EBP+8]; |hWnd
004010A4. E8 3D000000 CALL; SetDlgItemTextA


Чтобы программа никогда не видела отладчик, занопим этот переход (замена JNZ на JZ в данный момент не нужна, т.к. если это сделать, то при отсутствии отладчика программа будет «видеть» его.). Редактируем, запускаем, проверяем работоспособность программы, жмем клавишу Exit и видим сообщение «LOL, deactivate anti-patch protection! :)». Хех, программа заметила, что мы пропатчили её. Как? Посмотрим… Ищем в отладчике вызод MessageBox:

004010B0 > 6A 10 PUSH 10; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
004010B2. 68 42304000 PUSH three.00403042; |Title = «Anti-Patch»
004010B7. 68 18304000 PUSH three.00403018; |Text = «LOL, deactivate anti-patch protection! :)»
004010BC. 6A 00 PUSH 0; |hOwner = NULL
004010BE. E8 1D000000 CALL; MessageBoxA

Жмем правой кнопкой мыши на PUSH 10 (что находится по адресу 004010B0) -> Go to -> JNZ from 0040106C. Появляемся вот в таком месте:

00401060. E8 00000000 CALL three.00401065 << — «Звоним» на 00401065
00401065 $ 58 POP EAX << — Заносим в eax адрес из стека
00401066. 83E8 12 SUB EAX,12 << — Вычитаем из eax,12h
00401069. 8038 75 CMP BYTE PTR DS:[EAX],75 << — Сверяем байт по сдрусу находящемуся в eax с 75h
0040106C. 75 42 JNZ SHORT three.004010B0 << — Если возвращенное значение не истенно, то продолжаем выполнение программы, иначе прыгаем на 004010B0 (начало вызова сообщения об обноружении отладчике)

Т.е. этот код выполняет следующее, сверяется байт по 00401053 с 75h (это место условного перехода), если это не правда, то выдается сообщение о том, что программа пропатчена, иначе следует простой выход из программы.
Ну чтож, вы уже поняли, что нужно сделать? Конечно! Нужно сверять байт по 00401053 не с 75h, а с 90h и все! :). Патчим, запускаем, радуемся! :)

Нуу… на сегодня все. Думаю этот материал хоть чем-то вам помог в понимании взлома. Если есть какие-либо вопросы — sparow@udm.net
Нравится
Не нравится

7 комментариев

16:32
Меня интересует такой вопрос: открываем HIEW,находим
first.exe ,открываем его ,F5 ,пишем .0040100Е(в статье .40100Е?),жмем Enter? или сразу F3 и пишем 5 раз 90?Может кто-нибудь обьяснить эту последовательность по пунктам,подробнее?Заранее
Спасибо!
09:39
У кого есть эти крекми? Скиньте плиз на ящик =) А то по линкам их уже давно нет =)
02:13
to 4to ty napisal ni4ego ne poneatno! Leg4e vzlomati akkaunty v la2!
10:49
У автора крякмисов больше нет. Так что просьба не отписывать ему не e-mail по этому поводу.
10:00
Пожалуйста скиньте на ящик эти крекми. Буду очень благодарна!!!!!!!
22:14
Не плохо )
03:34
хорошая статья :)