Помощь - Поиск - Пользователи - Календарь
Полная версия: Реверсинг
Форумы HomeNet.kr.ua > Увлечения > В мире науки техники > Программирование
xxor
Данная тема создана лиш в ознакомительных целях.

Основной идеей темы являетса иследование защиты программ и их слабых мест на конкретных примерах.

В качестве примеров будут розсматриватса только специально предназначиные для этого программы далее Crackme.

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

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

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

Плагиат а также темы с других ресурсов неприветствуютса.

А теперь о хорошем.

Буду очень рад активности в теме (по существу конечно)...
Если чего непонятно нестесняйтесь задавать вопросы... если будет много непонятков открою тему по асемблеру так как без него никак...
Возможно скоро выложу гденибуть в сети инструменты так как для некоторых траф стоит денег...

Новые статьи будут и будут интерестнее но только если вы этого захотите...


Я надеюсь на вашу заинтересованость и поддержку... потому как меня очень задевает почти полное отсутствие активности в данной ветке форума
4ok

"Уроки" будут проводится с помощью дебагера и декомпилятора???

зы Выложи софт плз! Наше ДС++ Поддерживает пользывателей с "заграницы" ..
Teenager
Чок, насколько я знаю, дц наш как раз закрыт. С заливкой файлов, думаю, проблем не возникнет.
Ксксор... пока что я тебя поддерживаю в твоем начинании!! smile.gif

в ближайшее время выложу основные инструменты , а также видео по первой статье.
Вообще тема меня заинтересовала, ибо это очень обидно, если ты пишешь для кого-то прогу, даешь демо-версию на тестирование, а они ее легко крэкают. Очень легко, честно говоря. Вот поэтому я одобряю данную тему.
xxor
Часть первая: Вступление.
Я подозреваю что мало кто из присутствующих знаком с реверсингом (крекингом) и потому я тешил взять самое простое что нашел.
Это классическое 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 и указываем имя нового файла.

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

*по просьбе автора выкладываю кое-что
Teenager
xxor! и последнее... попробовал упаковать с помощью UPX одну мою прогу, которая тоже пароль просит smile.gif - не разобраться как крэкать... это вселяет маленькую надежду smile.gif
Это "текстовая" версия, возможен просмотр только основного контента. Для просмотра полной версии этой страницы, пожалуйста нажмите сюда.
Invision Power Board ©