Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Туториалы про крякми фантома (для начинающих и не только) (https://forum.antichat.xyz/showthread.php?t=23236)

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

Цитата:

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


Время: 08:27