PDA

Просмотр полной версии : Туториалы про крякми фантома (для начинающих и не только)


Ra$cal
28.08.2006, 16:13
Позвольте представить Вам серию статей (если получитсяи потребуется) для новичков. Рассматриваться здесь будут крякми от фантома. Инструменты: OllyDbg - основной, остальное что понадобится будем добавлять по мере необходимости. В этих статьях будут описаны: теоритические данные, необходимые для понимания работы программы, основные принципы построения защит и соответственно способы их обхода. Все материалы предназначены только чтобы Вы понимали, как не стоит делать.

Начнём мы с первого крякми фантома.
Линк: http://rascalspb.narod.ru/fantom/1.zip (4Kb)
Он Вам покажется знакомым с крякми одного товарища, но отличается размером - 4 килобайта ;) Советую для удобства добавить ярлык на OllyDbg добавить в папку SendTo. Теперь открываем крякми в отладчике. Запускаем (F9) и смотрим на него. Видим поле ввода и кнопку. Из поля ввода текст может читаться с помощью апи GetWindowTextA(W), GetDlgItemA(W), SendMessageA(W) с сообщением WM_GETTEXT. Нас интересуют только первые 2 апи. Ставим туда бряки. Это можно сдеать следующим образом: или написав в командной строке bp GetDlgItemA или поискав все апи (в окне дизасма ПКМ->Search for->All intermodular calls) и ставимть на них бряки, или Control+G->GetDlgItemTextA и двойной клик в столбце Hex Dump. Как видим вариантов много. Теперь плюсы и минусы: когда бряк ставится в программе на call API не стоитт забывать про вызовы апи через GetProcAddress, call eax. Поэтому я считаю верным ставить точку останова в начало апи. так и сделали. Не забудьте про GetWindowTextA. Теперь пишем в поле что угодно и смотрим.

Остановились примерно здесь.
77D8AC26 U> 8BFF MOV EDI,EDI
77D8AC28 55 PUSH EBP
77D8AC29 8BEC MOV EBP,ESP
77D8AC2B FF75 0C PUSH DWORD PTR SS:[EBP+C]

Это начало функции GetDlgItemTextA (смотрим регистр EIP). А нам надо попасть в код програмы. Смотрим в стек (справа внизу).

0012FC64 00401287 /CALL to GetDlgItemTextA from CRACKME1.00401282
0012FC68 000D056C |hWnd = 000D056C ('FaNt0m's Crackme #1',class='DLGCLASS')
0012FC6C 000003E8 |ControlID = 3E8 (1000.)
0012FC70 0040309C |Buffer = CRACKME1.0040309C
0012FC74 00000100 \Count = 100 (256.)

На вершине стека лежит адрес, попадающий в пределы программы. Так же видим адрес на буфер, куда попадёт прочитаный текст. На нём жмём ПКМ->Follow in dump. Теперь жмём Control+F9. Остановились на GetWindowTextA. Как видите GetDlgItemTextA использует для получения текста эту апи. Чтобы выйти обратно в код программы жмём Ctrl+F9 и затем ещё раз (сначала остановимся на выходе из GetWindowTextA, в слдеующий раз на GetDlgItemTextA). Теперь F8 и мы в коде программы. В дампе введённый нами текст. Стоим здесь:

00401287 |. 68 9C304000 PUSH CRACKME1.0040309C ; /String2 = "tratata"
0040128C |. 68 29304000 PUSH CRACKME1.00403029 ; |String1 = "m0tNaF-EmKCARc"
00401291 |. E8 BC000000 CALL <JMP.&KERNEL32.lstrcmpA> ; \lstrcmpA
00401296 |. 83F8 00 CMP EAX,0
00401299 |. 74 15 JE SHORT CRACKME1.004012B0
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
004012AE |. EB 13 JMP SHORT CRACKME1.004012C3
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

Это, как Вы надеюсь уже заметили, есть проверка. Проверка простая - сравнение строк. Если мы ввели строку m0tNaF-EmKCARc, то увидим поздравление. Иначе нет. Текст этот, если Вы опять же заметили, есть повёрнутый текст Crackme-Fantom.

Задание для самостоятельной работы - сделайте, чтобы на любой текст было сообщение о правильном пароле, замените пароль на более простой. Причём интересны вВаши решения этих вопросов. Все решения постите - за оригинальные и интересны +

ProTeuS
28.08.2006, 16:49
респект! хорошая статейка - многим на4инающим должна помо4ь. дерЖи +

bul.666
28.08.2006, 17:28
Добавлю, что многие, даже не знают, что такое "Бряки"... Бряки или BreakPoints Устанавливаются на фуекции, тоесть когда программа переходит на них, то она останавливается и выводит эту область... Помойму хреново объяснил =)

Ra$cal
28.08.2006, 17:41
Брекпоинт, это например опкод 0xCC, когда программа наступает на него она вызывает исключение и управление берёт на себя отладчик. Есть отладчики, которые обрабатывают все int 3 (опкод 0xCC). А OllyDbg проверяет, чтобы он входил в заданные Вами точки останова. Ибо есть такой способ запалить отладчик, вызвав исключение и не обработав, т.к. такой отладчик обработает его сам

bul.666
28.08.2006, 17:48
когда программа наступает на него она вызывает исключение и управление берёт на себя отладчик. ГЫ... Это и имел ввиду =)