Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 12 ноября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

Исследование WinQoole 2.50 или О том, как НЕ следует писать защиты

Обсудить статью на форуме

Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник от EXELAB - вот тут.

Автор: office_rat <office_rat@tut.by>

Программа: Qoole v2.50 - Quake II Level Editor, www.qoole.com
Защита: триальная.
Инструменты: SIce, ProcDump, any PEEditor … не понадобятся :). А понадобится Win32Dasm и HIEW (даже можно без оного).

Во время очередной чистки своего веника попалась на глаза программулина. Вышеуказанная. Глянул я на нее… Мда, приговор очевиден: "каждая интересная/полезная защищенная прога должна быть кр…, пардон, изучена".


Приступим. Начнем мы, пожалуй, с поверхностного изучения "подопытной". Инсталлируем и запускаем. Из "ворчащего" nag-экрана узнаем об условиях эксплуатации, мол, после 2-х недель лучше бы Вам зарегиться. А потому, если у Вас есть около 30 лишних “вечно цветущих и зеленых”, то извольте купить сей продукт. А теперь Options > Register Qoole. Вываливается окошко с полями для ввода Name и Key. Вводим тарабарщину и получаем в ответ окошко с надписью ”Invalid registration code”. Первой моей мыслью было напустить на эту прогу W32Dasm, а второй, соответственно, сходить за чем-нибудь съестным, пока идет дизассемблирование :). Ну, и что мы видим? Прога вроде бы ничем не запакована. Ну и хорошо. Попробуем поискать (естественно, на удачу) сообщение ”Invalid registration code” (зацепиться ведь за что-то надо). Символами “>>” я буду обращать Ваше внимание на важные моменты исследования кода этой программы.


* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0040D9A8(C), :0040D9C0(C), :0040D9D6(C)
|
* Possible StringData Ref from Data Obj ->"qoole.reg"
:0040D9EE push 004AE068
:0040D9F3 call 00495AD0
:0040D9F8 add esp, 00000004


>>* Possible StringData Ref from Data Obj ->"Invalid registration code"
|
:0040D9FB push 004AE194
:0040DA00 call 00430749
:0040DA05 add esp, 00000004

* Possible StringData Ref from Data Obj ->"Unregistered"
|
:0040DA08 push 004AE1B0
:0040DA0D push 004C01B0


Как много интересного в этом небольшом участке кода! Видим, что сообщение о неверном коде будет появляться в трех случаях, так как на него есть ссылки:

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
:0040D9A8(C), :0040D9C0(C), :0040D9D6(C).


Галянем на них:

:0040D9A1 idiv esi
:0040D9A3 add edx, 00000042
:0040D9A6 cmp ecx, edx

>>:0040D9A8 jne 0040D9EE // Переход на nag, если ecx не равно edx
:0040D9AA movsx ecx, byte ptr [ebp-59]
:0040D9AE mov eax, dword ptr [004C0284]
:0040D9B3 cdq
:0040D9B4 mov esi, 0000001A
:0040D9B9 idiv esi
:0040D9BB add edx, 00000041
:0040D9BE cmp ecx, edx

>>:0040D9C0 jne 0040D9EE // Переход на nag, если ecx не равно edx
:0040D9C2 6A04 push 00000004
:0040D9C4 lea edx, dword ptr [ebp-30]
:0040D9C7 push edx
:0040D9C8 lea eax, dword ptr [ebp-38]
:0040D9CB push eax
:0040D9CC call 00495B00
:0040D9D1 add esp, 0000000C
:0040D9D4 test eax, eax

>>:0040D9D6 jne 0040D9EE // Переход на nag, если eax<>0
:0040D9D8 push 00000004
:0040D9DA lea ecx, dword ptr [ebp-0C]
:0040D9DD push ecx
:0040D9DE lea edx, dword ptr [ebp-40]
:0040D9E1 push edx
:0040D9E2 call 00495B00
:0040D9E7 add esp, 0000000C
:0040D9EA test eax, eax

>>:0040D9EC je 0040DA55 // А вот это похоже на переход в случае, если регистрация успешна.

* Possible StringData Ref from Data Obj ->"qoole.reg"
|
:0040D9EE push 004AE068
:0040D9F3 call 00495AD0
:0040D9F8 add esp, 00000004

* Possible StringData Ref from Data Obj ->"Invalid registration code"
|
:0040D9FB push 004AE194
:0040DA00 call 00430749
:0040DA05 add esp, 00000004


Хм. Меня сразу заинтересовал последний переход по адресу:

:0040D9EC je 0040DA55

Глянем, что по нему:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D9EC(C)
|
:0040DA55 lea eax, dword ptr [ebp-38]
:0040DA58 push eax
:0040DA59 lea ecx, dword ptr [ebp-30]
:0040DA5C push ecx
:0040DA5D call 0040DCE7
:0040DA62 add esp, 00000008


… Прокрутим вниз до:

:0040DAD6 add esp, 0000000C
* Possible StringData Ref from Data Obj ->"Qoole registered, thanks! (qoole.reg created)"
|
:0040DAD9 push 004AE1D4
:0040DADE call 00430749
:0040DAE3 add esp, 00000004

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040DA50(U)
,|
:0040DAE6 pop esi
:0040DAE7 mov esp, ebp
:0040DAE9 pop ebp
:0040DAEA ret
// Выходим из процедуры регистрации

Мы оказались правы! Благодарственные слова и розовые сопли в адрес разработчиков. В добавок прога создаст нам файл qoole.reg с регистрационной информацией (скорее всего). Проще всего (и, наверное, надежнее) мне показалось попробовать заменить 3 jne-а на nop-ы, дабы прога смогла беспрепятственно “дойти” до адреса 0040D9EC, а там заменить je на jmp (чтобы, раз “дошла”, прыгнула на диалог об успешной регистрации). Забэкапились. Затем берем HIEW (не забыв при этом закрыть W32Dasm) и правим (смещения в экзешнике нужных нам байт видим в W32Dasm в строке состояния :0040D9A8 7544 jne 0040D9EE в будет по адресу 0000CDA8 и т.д.):

меняем:

CDA8 7544 >> 9090 // заменили два байта подряд;
CDA8 752С >> 9090 // тоже самое;
CDD6 7516 >> 9090 // тоже самое;
CDEC 7467 >> EB67 // заменили только один байт;

Сохраняем и запускаем. Пытаемся зарегистрироваться, благодарственные слова и … видим окно: “Bad registration key file!” Так, прога, по-видимому, проверяет key file (наверняка qoole.reg) и ругается. Все верно, потому, что у нас получился некорректный key file. Тут можно пойти двумя путями: попытаться расколоть алгоритм генерации или вырубить проверку на корректность этого самого key file. Не мудрствуя лукаво выберем второе (ибо на прогу с такой слабой защитой просто жалко тратить время). Загружаем измененный файл опять в W32Dasm и ищем там строку “Bad registration key file!”. Нет, ну сегодня мне точно везет! :

* Referenced by a CALL at Addresses:
|:0040E303 , :0040E31D , :0040E337 , :0040E3CE , :0040E3E9
|
:0040DAEB push ebp
:0040DAEC mov ebp, esp

* Possible StringData Ref from Data Obj ->"qoole.reg"
|
:0040DAEE push 004AE068
:0040DAF3 call 00495AD0
:0040DAF8 add esp, 00000004

* Possible StringData Ref from Data Obj ->"Bad registration key file!"
|
:0040DAFB push 004AE078
:0040DB00 call 004341CD
:0040DB05 add esp, 00000004
:0040DB08 pop ebp
:0040DB09 ret


Видим, что это сообщение может вызваться из 5 разных мест в программе. Взглянем на них:

:0040E2EE cmp dword ptr [004C0284], 00000001
:0040E2F5 jl 0040E303
:0040E2F7 cmp dword ptr [004C0284], 00002000
:0040E301 jl 0040E308

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E2F5(C)
|

>>:0040E303 call 0040DAEB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E301(C)
|
:0040E308 push 004C01B0
:0040E30D lea edx, dword ptr [ebp-30]
:0040E310 push edx
:0040E311 call 0040DB0A
:0040E316 add esp, 00000008
:0040E319 test eax, eax
:0040E31B jne 0040E322

>>:0040E31D call 0040DAEB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E31B(C)
|
:0040E322 push 004C01B1
:0040E327 lea eax, dword ptr [ebp-10]
:0040E32A push eax


и вот еще один участок кода:

:0040E3CA test eax, eax
:0040E3CC je 0040E3D3

>>:0040E3CE call 0040DAEB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E3CC(C)
|
:0040E3D3 push 00000008
:0040E3D5 lea edx, dword ptr [ebp-10]
:0040E3D8 push edx
:0040E3D9 lea eax, dword ptr [ebp-48]
:0040E3DC push eax
:0040E3DD call 00495B00
:0040E3E2 add esp, 0000000C
:0040E3E5 test eax, eax
:0040E3E7 je 0040E3EE

>>:0040E3E9 call 0040DAEB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040E3E7(C)
|
:0040E3EE mov dword ptr [004AE060], 00000000
:0040E3F8 mov dword ptr [004C0244], 00000001


Присмотревшись и проанализировав эти два участка кода, можно понять, что перед call-ами происходит проверка на “вшивость” qoole.reg и в случае чего - переход call 0040DAEB без разговоров. Потому, наверное, и пришла мысля (ух, варвар я, ух! ух!) то ли вследствие моей (смею надеяться пока) безграмотности взять, да и позабивать nop-ами все эти вызовы! Под одну гребенку!! И чтоб не рождались программисты, пишущие такие бездарные защиты, что даже лень в Sice залезть и подсмотреть, ПРАВИЛЬНЫЕ регистрационные номера!!!
Если Вам не лень, то можете глянуть…
После того, как мы заменим call-ы (впрочем, вместо оных можно изменить предшествующие вызовам je-ы, jl и jne на jmp – получим аналогичный результат) запускаем, и все работает. Если будут какие вопросы, вопросики и др. пожелания пишите...
До скорого!



Обсуждение статьи: Исследование WinQoole 2.50 или О том, как НЕ следует писать защиты >>>


Комментарии к статье: Исследование WinQoole 2.50 или О том, как НЕ следует писать защиты

claus_cRk 09.07.2004 13:33:44
Новичку. Nop\’ы, jmp\’ы - все очень просто, ломается без особого усилия, и писать про то как в какой-то программке менять несколько байтиков кода, на сегодняшний день по-моему извращение, ведь итак такого тутора навалом, хоть бы уж влез да нашел кодик - а так то же самое что TelePort ...(читать скучно)
---
Zer0 10.07.2004 11:23:10
это была последняя статья про \"3 байта\". Более такие поделки пропускаться не будут.
---
Mafia32/[ROCK] 31.07.2004 15:50:34
Я б лучше назвал эту статью так: \"О том как не следует писать статьи на кряклаб.\" Оценка один.
---
ilya 10.08.2004 03:01:38
давно здесь не был
здесь походу идёт гонка кто больше статей накатает
---

Материалы находятся на сайте https://exelab.ru



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS