Часть первая: Вступление.Я подозреваю что мало кто из присутствующих знаком с реверсингом (крекингом) и потому я тешил взять самое простое что нашел.
Это классическое Crackme написанное на ассемблере не пакованное и не использующее крипто-алгоритмы.
Сегодня мы рассмотрим один из самых простых приемов - это Патч. Патч намного проще так как не требует изучения и понимания алгоритма
генерации ключа но не следует относится к нему как к панацее, это грязный и не интересный способ, в большинстве случаев заключающийся
в замене одного перехода другим (условный безусловным или противоположным) или просто забиванием части программы нопами (nop – инструкция которая ничего не делает ).
Часть вторая: Инструментарий.
Несмотря на то что бескрайние просторы Интернета просто кишат всяким разным софтом, реверсеру зачастую хватает лишь несколько программ
это Отладчик, Дизассемблер, PE едитор, Текстовый редактор и Компилятор Ассемблера. Сегодня мы ограничимся всего лишь Дебагером для исследования жертвы.
Теперь то чем буду пользоваться я:
Отладчик: OllyDbgЧасть третья: Первая Жертва. Патч.
Первой жертвой будет
FaNt0m's CrackMe #1, нашей целью будет найти правильный пароль, а также заставить его принимать любой пароль за правильный.
Итак приступим.
Загружаем нашего подопытного в OllyDbg и начнем наше изучение.
Первое что делаем это запускаем наш крякми (жмем F9) и смотрим на его поведение вводя в поле пароля все что придет в голову.
При Нажатии на кнопку "Check" мы видим сообщение об ошибке которое гласит что пароль неверный.
Появление этого окошка существенно упрощает нам жизнь так как будет проще найти условие проверки пароля.
Немного пролистав листинг нашего крякми (окно CPU) мы наткнемся на
вызов того самого окошка которое указывает на неправильность введенного пароля
Окошко вызывается с помощью WinApi функции MessageBoxA:КОД
0040129B |. 6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL
0040129D |. 68 38304000 PUSH CRACKME1.00403038 ; |Title = "Check Status"
004012A2 |. 68 45304000 PUSH CRACKME1.00403045 ; |Text = "Wrong Password! Keep trying, you'll get it!"
004012A7 |. 6A 00 PUSH 0 ; |hOwner = NULL
004012A9 |. E8 5C000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
Немного выше мы видим еще два вызова WinApi:
Функция GetDlgItemTextA принимающая текст из контрола Edit (поле ввода) и записывающая его в переменную по адресу ds:[0040309C]
КОД
00401270 |. 68 00010000 PUSH 100 ; /Count = 100 (256.)
00401275 |. 68 9C304000 PUSH CRACKME1.0040309C ; |Buffer = CRACKME1.0040309C
0040127A |. 68 E8030000 PUSH 3E8 ; |ControlID = 3E8 (1000.)
0040127F |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd
00401282 |. E8 6B000000 CALL <JMP.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
И функция сверки двух строк lstrcmpA одна из которых по адресу ds:[0040309C] введена нами а вторая ds:[00403029] правильный пароль
КОД
00401287 |. 68 9C304000 PUSH CRACKME1.0040309C ; /String2 = "Whats up ?"
0040128C |. 68 29304000 PUSH CRACKME1.00403029 ; |String1 = "m0tNaF-EmKCARc"
00401291 |. E8 BC000000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA
Функция lstrcmpA возвращает в EAX 0 если строки равныДальше мы видим проверку EAX на 0 и переход на окошко с поздравлениями
КОД
00401296 |. 83F8 00 CMP EAX,0 ; Сравниваем EAX c 0
00401299 |. 74 15 JE SHORT CRACKME1.004012B0 ; Если равны переходим по адресу 004012В0
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
004012B0 |> 6A 40 PUSH 40 ; /Style = MB_OK|MB_ICONASTERISK|MB_APPLMODAL
004012B2 |. 68 38304000 PUSH CRACKME1.00403038 ; |Title = "Check Status"
004012B7 |. 68 71304000 PUSH CRACKME1.00403071 ; |Text = "You got it! Your now a cracker! :)"
004012BC |. 6A 00 PUSH 0 ; |hOwner = NULL
004012BE |. E8 47000000 CALL <JMP.&USER32.MessageBoxA> ; \MessageBoxA
чтобы проверить правы ли мы в своих догадках, попробуем ввести в поле пароль строку с которой проходит сверка (у вас может быть другая строка):
КОД
0040128C |. 68 29304000 PUSH CRACKME1.00403029 ; |String1 = "m0tNaF-EmKCARc"
видим окошко о правильном пароле что и подтверждает наши мысли.
Теперь сделаем так чтобы программа принимала любой введенный пароль за правильный:
Все что нам надо это заменить (жмем пробел на выделенной строке) JE на JMP:
Было:
КОД
00401299 |. 74 15 JE SHORT CRACKME1.004012B0 ; Если равны переходим по адресу 004012В0
Стало:
КОД
00401299 |. 74 15 JMP SHORT CRACKME1.004012B0 ; Всегда переходим по адресу 004012В0
И теперь наш крякми будет принимать любой введенный пароль за правильный.
Теперь сохраним уже отредактированный .ехе файл, для этого жмем mouse2 выбираем Copy to Executable -> All Modifications -> Copy All
в открывшемся окне опять жмем mouse2 потом Save File и указываем имя нового файла.
Ну вот вроде бы все. Продолжение будет и будет скоро. В продолжении я расскажу о написании Патчера.