_ ______________________ _ \ \\ _\ /_ // / ______ | __ | ______ \_ \_|_ / \ __ ___ __|_\_ \ / /_ \/ \/ \/ \ / _/ / /____/ / /__/\__\ _ /_/ _/____/___ \______________\__/_/__\___/_________/ wPx| /___/ | | TEAM-53.TUTORiALS.14 | !_ _! (____________________) Cracking “Zeta Debugger 1.3” Предисловие: Zeta Debugger – программа для отладки приложений. Вид немного детский, специально делали чтобы крэкеры его не юзали ;). Имеет неплохой ряд функций, но с OllyDbg ему не сравниться! ;) Взять можно здесь - http://www.fyzor.com/debugger Я его не юзаю, но взломать мне стало интересно из-за того что это платный отладчик. Расписывать всего подробно не буду, лишь опишу как делал и почему. Приступим... Tools: PEiD 0.94 OllyDbg 1.10 План: 1.О защите(и ограничениях) 2.Взлом 3.Заключение 1.О защите(и ограничениях) При загрузке программы появляется наг, убирается он при нажатии на кнопку «Run», которая активируется через 5 сек. Активация происходит всё в том же наге, который видно при запуске программы. Имя(User) в поле берётся то, под которым залогонен данный сеанс Windows, сериал вводиться в поле «Key», причём если ключ неверный, то кнопка «Ok» не будет активирована, а будет только при вводе правильного. Если сериал правильный, то он добавиться в реестер и при каждом запуске будет читаться из него. И самое интересное это, если изменить байты регистрации, то программа закрывается при запуске. Защита реализована только от новичка, хотя сразу так и не сломает даже средний уровень cracker,ов. 2.Взлом 2.1 PEiD определил что программа скомпелирована на «Microsoft Visual C++ 6.0». Значит раcпаковки не будет. ;) 2.2 Откроем в OllyDbg наш ZetaDebugger, запустим и будем искать проверку. 2.3 Давайте рассуждать логически, мы вводим символы, принимаются они в Стрингах, значит нужно ставить BreakPoint на ту АПИ, которая их принимает, т.к. нам в общем то и не за что зацепиться, кроме этого. Смотрим: |-----------------------------------------------------------------------------| | function GetWindowText(Wnd: HWnd; Str: PChar; MaxCount: Integer): | | Копирует в Str заголовок окна или текст органа управления.» | |-----------------------------------------------------------------------------| 2.4 То что надо ? Я тоже думаю что то что надо. ;) Но ставить бряк надо на GetWindowTextA , т.к. если посмотреть в Names in ZD, то там будет только GetWindowTextA , значит ставим бряк на неё и вводим любые символы, я вводил «4321», Опа, а бряк сработал раньше чем мы ввели все символы ;) Снимаем бряк и выходим из процедуры, ну что мы видим, идёт ещё одна процедура GetWindowTextA, видимо она обрабатывает ключ, а первая имя , далее идут 2 процедуры, первая нам не нужна, если зайти посмотреть, то ничего интересного, а вот вторая начинается интересней: |------------------------------------------------------------------------------| |00424AE9 |. 83C4 04 ADD ESP,4 | |00424AEC |. 8D85 ECAD0500 LEA EAX,DWORD PTR SS:[EBP+5ADEC] | |00424AF2 |. 50 PUSH EAX | |00424AF3 |. 8D8D FCFEFFFF LEA ECX,[LOCAL.65] | |00424AF9 |. 51 PUSH ECX | |00424AFA |. E8 BC030000 CALL 00424EBB | |------------------------------------------------------------------------------| Выше по адресу 00424AF3, заноситься имя(текущий логин) в регистр ECX, значит тут в процедуре будут происходить математические действия над ним, после которых получиться сериал, и будет сравнение его с нашим. Дальше можно увидеть EnableWindow, которые и активируют кнопку, значит мы на правильном пути... Зайдём в процедуру, глянем.. Процедуру генерации мы разбирать не будем, а вот потрейсировав я нашёл такое место: |------------------------------------------------------------------------------| |00425005 3BC8 CMP ECX,EAX | |------------------------------------------------------------------------------| В регистре ECX я увидел 34 в hex, если перевести в String, то это та самая "4", что я вводил в поле "Key", а в EAX уже лежит правильный символ. ;) можно перевести так каждый символ в String и зарегистрироваться под ним, но это не будет работать при другом логине, значит мы сделаем так: |------------------------------------------------------------------------------| |00425005 3BC8 CMP ECX,EAX | |поменяем на | |00425005 3BC0 CMP EAX,EAX | |------------------------------------------------------------------------------| т.е. правильный символ будет сравниваться с самим собой, сохраняем изменённый файл, с другим именем, например "zd_c.exe". Запускаем и он закрывается :( к сожалению... А вить это говорит о том, что мы изменили проверку регистрации. ;) Опять давайте рассуждать логически :). При запуске нет никаких сообщений что файл изменён, и даже не используется АПИ "ReadFile". Запустим два раза OllyDbg, в одну наш оригинальный файл засунем, а вдругую изменённый и будем трейсировать, опираясь на то, что нам нужно узнать где в оригинальном произойдёт запуск, а в изменённом файле(проверки) произойдёт проскок этого места, т.е. должно быть где-то такое место ,где срабатывает переход и выходит из цикла для закрытия. В оригинальном у меня получилось так: |------------------------------------------------------------------------------| |00444C1B>0040352F>004509EF>00414531 | |------------------------------------------------------------------------------| |00444C1B |. E8 E0E7FBFF CALL 00403400 | |0040352F |. E8 7ED40400 CALL 004509B2 | |004509EF . FF55 08 CALL DWORD PTR SS:[EBP+8] | |00414531 |. E8 36060000 CALL 00414B6C | |------------------------------------------------------------------------------| По адресу 00414B6C начинается цикл и программа запускается и уже не выходит из него. А попробовав потрейсировать в изменённом, я вышел из цикла с помощью перехода |------------------------------------------------------------------------------| |00414B84 /74 3D JE SHORT 00414BC3 | |------------------------------------------------------------------------------| Откроем это место в изменённом файле и мне тут понравились эти две процедуры :) |------------------------------------------------------------------------------| |00414B8E E8 B49A0200 CALL 0043E647 | |00414B9A E8 2F43FFFF CALL 00408ECE | |------------------------------------------------------------------------------| Вторая меня ничем не впечатлила, а вот первая да. ;) Я там нашёл в начале три сравнения, хорошо, потрейсируем в обоих файлах до такого места: |------------------------------------------------------------------------------| |0043E662 3B15 289E4600 CMP EDX,DWORD PTR DS:[469E28] | |далее | |0043E66D 8178 04 11010000 CMP DWORD PTR DS:[EAX+4],111 | |и | |0043E679 8179 08 36040000 CMP DWORD PTR DS:[ECX+8],436 | |------------------------------------------------------------------------------| Встанем на адресе 0043E662 и посмотрим что у нас не так, видно что в EDX значения разные и по адресу 469E28 тоже значения разные (значит что-то тут не так), я сделал значения по адресу 469E28 в изменённом файле, такое же, как и в оригинальном, запустил и всё работает! Ура! ;)) Судя по тому что впереди идёт условный переход, и когда не надо он не срабатывает и программа выскакивает из цикла, то нужно его поменять на безусловный, меняем: |------------------------------------------------------------------------------| |0043E668 /75 46 JNZ SHORT 0043E6B0 | |на | |0043E668 /EB 46 JMP SHORT 0043E6B0 | |------------------------------------------------------------------------------| Всё, теперь сохраняем и радуемся что сломали платный отладчик... ;))) 3.Заключение Защита средненькая, так что пригодился вам этот тутор или нет, решать вам. Ну а я считаю что конечно пригодился, по крайней мере для новичка точно! ;)) Ну и конечно же, всё было только в самообразовательных целях! :) До новых встреч! Greetz to: Bokiv, GHOST, Guru.eXe, M!H@N, SLV, RaBBiT, x0man, YoriCH and all my friends... © ev1l^4 2oo6