Позвольте представить Вам серию статей (если получитсяи потребуется) для новичков. Рассматриваться здесь будут крякми от фантома. Инструменты: 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. Теперь пишем в поле что угодно и смотрим. Остановились примерно здесь. Code: 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). А нам надо попасть в код програмы. Смотрим в стек (справа внизу). Code: 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 и мы в коде программы. В дампе введённый нами текст. Стоим здесь: Code: 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. Задание для самостоятельной работы - сделайте, чтобы на любой текст было сообщение о правильном пароле, замените пароль на более простой. Причём интересны вВаши решения этих вопросов. Все решения постите - за оригинальные и интересны +
Добавлю, что многие, даже не знают, что такое "Бряки"... Бряки или BreakPoints Устанавливаются на фуекции, тоесть когда программа переходит на них, то она останавливается и выводит эту область... Помойму хреново объяснил =)
Брекпоинт, это например опкод 0xCC, когда программа наступает на него она вызывает исключение и управление берёт на себя отладчик. Есть отладчики, которые обрабатывают все int 3 (опкод 0xCC). А OllyDbg проверяет, чтобы он входил в заданные Вами точки останова. Ибо есть такой способ запалить отладчик, вызвав исключение и не обработав, т.к. такой отладчик обработает его сам