![]() |
eXeL@B —› Вопросы новичков —› Обсуждение Crackme |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 18 марта 2012 01:17 · Личное сообщение · #1 Как бы не нашел общий раздел для обсуждения Crackme, предлогаю тут обсуждать После просмотра видеоуроков от Bad_guy по крекинду, и скачав вредварительно крэкми Задача: - Find a valid serial for your nick/name - Patch the crackme to accept any input as valid serial В ollydbg как бы вроде понял логику, но вот не хватает знания насчет "генераций" логин и пароля.. Вот мне кажется тут что -то мутится: CPU Disasm Code:
А после этого выполняется JE (если равно) переход на Code:
а если условие не выполняется, то выполняется дальше: Code:
т.е. если ZF=0, то логин и пароль подошли. Но это второй часть, я думаю место JE написать JMP и написать переход на 00401240. А вот с первой частью не понимаю - откуда найти логин и пароль? В видеокурсе на первом Crackme пароль была написань в самом коде, а тут уже "серьезная защита" ![]() Подкажите пожалуйста как решать задачу? ненадо сказать логин и пароль, а скажите только на каком направлений копать. Мне явно не хватает знаний команд и не понимаю где зашифрован логин и пароль. ![]() |
|
Создано: 18 марта 2012 02:10 · Личное сообщение · #2 Contrafack пишет: Подкажите пожалуйста как решать задачу? ненадо сказать логин и пароль, а скажите только на каком направлений копать. Остановись по этому адресу: 00401236 |. E8 BE000000 CALL CRACKME4.004012F9 и зайди в CALL CRACKME4.004012F9 (жмешь F7), а дальше нажимаеш F8 и смотриш, там увидиш и Name и Serial... ----- We do what we want because we can. ![]() |
|
Создано: 18 марта 2012 02:54 · Поправил: Vovan666 · Личное сообщение · #3 http://exelab.ru/art/?action=view&id=259 на ютубе даже мультик есть http://www.youtube.com/watch?v=0OR5CDBH7DI&feature=related ![]() |
|
Создано: 18 марта 2012 02:55 · Личное сообщение · #4 Сделал, но не нашел там не Name не serial ![]() вот целый модуль, который вызывает 00401236: Code:
перешел по стракам с F8, но нигде не было инфы такого.. P.S. Еще любопытный момент: команда CALL 004012F9 он же значит "вызывать функцию/подпрограмму 004012F9"? верно? а почему после нажатие F7 переходит на адрес 00401002 ? ![]() |
|
Создано: 18 марта 2012 03:48 · Личное сообщение · #5 Vovan666 Спасибо, на видео уже понял где смотреть данные. только вот из за отсутсвия математических навыков хрен понял что за вычисления: Code:
Хоть написано по той ссылке, но все же доходит... ![]() Ручной можно считать к логину серийник? может так пойму работу этого цикла? ![]() |
|
Создано: 18 марта 2012 04:00 · Личное сообщение · #6 |
|
Создано: 18 марта 2012 04:39 · Поправил: Contrafack · Личное сообщение · #7 |
|
Создано: 18 марта 2012 07:22 · Поправил: Djeck · Личное сообщение · #8 Contrafack Да там вроде всё очень просто. Главная процедура: Code:
Каждой букве твоего имени подбирается один символ кода, т.е. сколько символов в имени, то столько и пароль будет символов. За это отвечает: 00401310 |> /803E 00 /CMP BYTE PTR DS:[ESI],0 Таким образом проверяется, что в ячейке по адресу ESI находится символ имени (если имя закончилось, то в ячейке будет 0 и мы выйдем из этого цикла) переход на следующий символ расположен чуть ниже: 00401326 |. |46 |INC ESI Т.е. увеличивается адрес ESI на одну единицу. 00401313 |. |74 15 |JE SHORT CRACKME4.0040132A Собственно при окончании символов сработает прыжок и мы идем на выход. 00401315 |. |8A06 |MOV AL,BYTE PTR DS:[ESI] в EAX копируем код символа в шестнадцатиричном формате К этому шестнадцатидцетричному символу прибавляем значение из регистра ECX: 00401317 |. |02C1 |ADD AL,CL Значение начинается с 0, а с каждым проходом цикла это значение увеличивается на единицу: 00401327 |. |41 |INC ECX Затем между регистрами EAX и ECX производим операцию XOR (логическое ИЛИ) 00401319 |. |32C1 |XOR AL,CL Делим EAX на EBX, результат в EAX. 0040131B |. |F6F3 |DIV BL Получается, что делим на 1A всегда каждый символ имени. Значение EBX (1A) записывается чуть раньше цикла генерации пароля: 0040130E |. B3 1A MOV BL,1A Эта величина постоянная и не меняется. Далее сдвиг EAX на 8 разрядов вправо: 0040131D |. |66:C1E8 08 |SHR AX,8 Прибавляем к EAX значение 41: 00401321 |. |04 41 |ADD AL,41 и записываем получившийся символ пароля в ячейку по адресу EDI 00401323 |. |8807 |MOV BYTE PTR DS:[EDI],AL Ну а далее повторяем всё вышесказанное к остальным символам нашего имени. P.S. Для генерации серийника достаточно просто калькулятора Windows ![]() ![]() |
|
Создано: 18 марта 2012 13:58 · Личное сообщение · #9 |
|
Создано: 18 марта 2012 14:22 · Личное сообщение · #10 |
|
Создано: 18 марта 2012 15:30 · Личное сообщение · #11 Contrafack пишет: CMP BYTE PTR DS:[ESI],0 Сравнение числового значения байта по адресу, находящемуся в регистре ESI с нулем. Это прямая суть данной инструкции. Логически же это поиск конца строки языка Си (в Си признаком конца строки служит нуль-символ). Djeck пишет: SHR AX,8 Логический сдвиг вправо (сокращение от англ. Shift Right - сдвиг вправо). Тут надо понимать основы двоичной логики, тот факт, что число, например, 278 в привычной нам десятичной системе счисления равно числу 100010110 в двоичной системе счисления. Логический сдвиг вправо на 8 бит по сути "стирает" 8 цифр справа, т.е. получаем число 1 (как в двоичной системе счисления, так и в десятичной). Логический сдвиг вправо эквивалентен целочисленному делению на степень двойки, в данном случае 2^8=256. Делим - 278 / 256 = 1 (22 в остатке). Опять же это прямая логика данной инструкции. В контексте исследуемого алгоритма это получение остатка от деления на 26 (это 0x1A в шестнадцатеричной системе счисления) в регистре EAX. Далее прибавляется код символа 'A' (шестнадцатеричное число 0x41). Остатки от деления имеют значения от 0 до 25. Итого, строка с серийным номером - строго литеры верхнего регистра английской алфавита. Что рекомендую подучить: двоичная система счисления, двоичная логика, базовая архитектура процессора (буквально базовые и сегментные регистры), базовая арифметика (сложение, вычитание, деление, умножение на базовых регистрах). Читать для этого интеловские талмуды не рекомендую, может стошнить от объема теории и желание возвращаться к реверсу пропадет на долго. Программы можно ломать не понимая до конца ассемблер и даже не разбираясь в логике программы вообще (ну кроме отдельных маленьких кусков). В этом, собственно, и красота. А уже на более сложных задачах, требуется знать не только 90 - 100%% инструкций ассемблера, но и умение понимать их смысл не по отдельности, а как шагов одного алгоритма. ![]() |
|
Создано: 19 марта 2012 00:43 · Личное сообщение · #12 перешел на 5-й Crackme ![]() первый пунк сделал, нашел пароль и патчил, чтб любой пароль принимал. но вот с вторым пунктом не получается, чтоб CD-ROM проверку отключить. вот код оригинала: Code:
вроде очень прост: на 0040144E идет проверка ZF если равно 1, то выдать, что CDROM found, а если нет, то перейти к 00401467. я прописал так: Code:
![]() Попробовал даже строку 00401450 |EB 15 JMP SHORT 00401467 забивать NOP_ом, но тоже не помог... на Crackme 2 или 3_м была такая задача, решил на ура, а тут что то не получается. И еще - от чего зависит ZF=1 или 0 ? может патчить так, чтоб он всегда был 1 и выполнился переход на 00401452 ? ![]() ![]() |
|
Создано: 19 марта 2012 01:07 · Поправил: verdizela · Личное сообщение · #13 Попробуй поставить бряк по адресу Code:
затем дойди до этого места Code:
забей NOPами этот переход и будет всегда CDROM found. ----- We do what we want because we can. ![]() |
|
Создано: 19 марта 2012 01:14 · Личное сообщение · #14 |
|
Создано: 19 марта 2012 01:31 · Личное сообщение · #15 |
|
Создано: 19 марта 2012 01:41 · Поправил: verdizela · Личное сообщение · #16 Contrafack пишет: знал бы что такое БРЯК Contrafack пишет: А может заодно и обьяснить в чем прикол? что происходит по адресу 0040143C ? SReg пишет: http://w32api.narod.ru/functions/GetDriveType.html И ко всему этому я так понял, что нужно еще разъяснить, что такое NOP ----- We do what we want because we can. ![]() |
|
Создано: 19 марта 2012 02:12 · Личное сообщение · #17 Спасибо, просто я не обратил на то, что ДО 00401450 есть еще условие перехода на 00401467 ![]() ну ипо поводу GetDriveType почитал. получается мы его отключили, да? хотя так и не понял как он проверят, если в реале проверяет, то у меня есть CD-ROM, должен определить, а если там какой то механим, то вот это не понял уже.. ну ладно, может со временем пойму.. спасибо и на это ![]() |
|
Создано: 19 марта 2012 02:13 · Личное сообщение · #18 |
|
Создано: 19 марта 2012 02:20 · Поправил: hlmadip · Личное сообщение · #19 Contrafack пишет: хотя так и не понял как он проверят, если в реале проверяет, то у меня есть CD-ROM, должен определить, а если там какой то механим, то вот это не понял уже.. ну ладно, может со временем пойму.. lpRootPathName [in, optional] The root directory for the drive. A trailing backslash is required. If this parameter is NULL, the function uses the root of the current directory. .text:0040143A push 0 ; lpRootPathName <-задаём параметр pRootPathName = 0 .text:0040143C call GetDriveTypeA ![]() |
|
Создано: 19 марта 2012 11:01 · Личное сообщение · #20 Ребята, помогать человеку - доброе дело делать, но сдается мне, что толку было бы больше от прочтения тс хотя бы первых 10-12 глав Нарвахи, а затем просмотра (опять же порядка 10) видеков от Лены. З.ы. Уж очень больно примитивными показались некоторые вопросы тс. ----- ds ![]() |
|
Создано: 19 марта 2012 11:09 · Личное сообщение · #21 |
|
Создано: 19 марта 2012 13:56 · Личное сообщение · #22 |
|
Создано: 19 марта 2012 14:16 · Личное сообщение · #23 |
|
Создано: 19 марта 2012 14:24 · Личное сообщение · #24 |
|
Создано: 16 июня 2013 14:48 · Личное сообщение · #25 |
|
Создано: 16 июня 2013 17:38 · Личное сообщение · #26 g3r0n1m0 в аттаче ![]() ![]() |
|
Создано: 16 июня 2013 19:09 · Поправил: g3r0n1m0 · Личное сообщение · #27 |
|
Создано: 18 июня 2013 09:19 · Поправил: dfnsff · Личное сообщение · #28 Решил покрякать эти крекми, штуки 3 ломанул без проблем(какие-то простые оказались).но один чёт я вообще непойму как ломануть - крякми ![]() |
|
Создано: 18 июня 2013 11:20 · Личное сообщение · #29 Лично меня всегда поражали такие черезжопные способы нахождения адресов в делфишных прогах. Ну да, во времена 98 винды была такая hmemcpy, в NT-линейке её нет. Но есть нормальные, классические, так сказать, способы. Показываю на примере и прикладываю в аттаче. Надеюсь, что все прониклись, и кряков к делфи софту станет в разы больше. ![]() ![]() ![]() ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 18 июня 2013 11:25 · Личное сообщение · #30 |
. 1 . 2 . >> |
![]() |
eXeL@B —› Вопросы новичков —› Обсуждение Crackme |