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

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


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

Применение криптографии в защите двадцатидолларовой программы.

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

Хорошая подборка видеоуроков, инструментов крэкера, книг и статей - здесь.

Автор: Demode <R091003@km.ru>


Введение

Цель данной статьи изучение случая применения криптографии в защите USD$20-вой программы.

Цель - Thursday_Night_Poker

Программу можно найти:

http://www.freedownloadscenter.com/Games/Card_Games/Thursday_Night_Poker_Download.html

Инструментарий:

Wdsm10K - no comment

WinDBG и OLLYdbg - Debugger`ы

HEX-calculator - калькулятор

Глава Первая.

Причина, побудившая к этому исследованию, банальна: регистрационные данные к программе есть,

но когда-то давно американы, что регистрировали программу, использовали столь неблагозвучные

рег.имена (с точки зрения русского языка), что терпение истощилось и захотелось

исправить это недоразумение.

Итак, приступим. . .

PEid нас успокаивает - упаковки нет, обычная программа на Borland Delphi 3.0.

Грузим Wdsm10K и пробуем найти Name, Key, S/N. Без проблем получаем:

:00453C8D E87EFEFAFF call 00403B10
:00453C92 83F805 cmp eax, 00000005
:00453C95 7D0F jge 00453CA6

* Possible StringData Ref from Code Obj ->\"Name must be at least 5 characters. \"
->\" If your registration codes are \"
->\"not working then blank out the \"
->\"codes, click the Continue button \"
->\"and send a feedback message for \"
->\"assistance.\"
|
:00453C97 B8543E4500 mov eax, 00453E54
:00453C9C E837810100 call 0046BDD8
:00453CA1 E97D010000 jmp 00453E23

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453C95(C)
|
:00453CA6 8D55F0 lea edx, dword ptr [ebp-10]
:00453CA9 8B45FC mov eax, dword ptr [ebp-04]
:00453CAC 8B8024020000 mov eax, dword ptr [eax+00000224]
:00453CB2 E8EDA0FCFF call 0041DDA4
:00453CB7 8B45F0 mov eax, dword ptr [ebp-10]
:00453CBA 8D55F4 lea edx, dword ptr [ebp-0C]
:00453CBD E8FE33FBFF call 004070C0
:00453CC2 8B45F4 mov eax, dword ptr [ebp-0C]
:00453CC5 E846FEFAFF call 00403B10
:00453CCA 83F808 cmp eax, 00000008
:00453CCD 7D0F jge 00453CDE

* Possible StringData Ref from Code Obj ->\"The key must be at least 8 characters. \"
->\" If your registration codes are \"
->\"not working then blank out the \"
->\"codes, click the Continue button \"
->\"and send a feedback message for \"
->\"assistance.\"
|
:00453CCF B8103F4500 mov eax, 00453F10
:00453CD4 E8FF800100 call 0046BDD8
:00453CD9 E945010000 jmp 00453E23

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453CCD(C)
|
:00453CDE 8D55F0 lea edx, dword ptr [ebp-10]
:00453CE1 8B45FC mov eax, dword ptr [ebp-04]
:00453CE4 8B8010020000 mov eax, dword ptr [eax+00000210]
:00453CEA E8B5A0FCFF call 0041DDA4
:00453CEF 8B45F0 mov eax, dword ptr [ebp-10]
:00453CF2 8D55F4 lea edx, dword ptr [ebp-0C]
:00453CF5 E8C633FBFF call 004070C0
:00453CFA 8B45F4 mov eax, dword ptr [ebp-0C]
:00453CFD E80EFEFAFF call 00403B10
:00453D02 83F805 cmp eax, 00000005
:00453D05 7D0F jge 00453D16

* Possible StringData Ref from Code Obj ->\"The S/N must be at least 5 characters. \"
->\" If your registration codes are \"
->\"not working then blank out the \"
->\"codes, click the Continue button \"
->\"and send a feedback message for \"
->\"assistance.\"
|
:00453D07 B8CC3F4500 mov eax, 00453FCC
:00453D0C E8C7800100 call 0046BDD8
:00453D11 E90D010000 jmp 00453E23

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453D05(C)
|
:00453D16 8D55F0 lea edx, dword ptr [ebp-10]
:00453D19 8B45FC mov eax, dword ptr [ebp-04]
:00453D1C 8B8008020000 mov eax, dword ptr [eax+00000208]
:00453D22 E87DA0FCFF call 0041DDA4
:00453D27 8B45F0 mov eax, dword ptr [ebp-10]
:00453D2A 8D55F4 lea edx, dword ptr [ebp-0C]
:00453D2D E88E33FBFF call 004070C0
:00453D32 8B45F4 mov eax, dword ptr [ebp-0C]
:00453D35 50 push eax
:00453D36 A1ACAE4800 mov eax, dword ptr [0048AEAC]
:00453D3B 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->\"Name\"
|
:00453D3D B988404500 mov ecx, 00454088

* Possible StringData Ref from Code Obj ->\"Registration\"
|
:00453D42 BA98404500 mov edx, 00454098
:00453D47 E86087FEFF call 0043C4AC
:00453D4C 8D55F0 lea edx, dword ptr [ebp-10]
:00453D4F 8B45FC mov eax, dword ptr [ebp-04]
:00453D52 8B8024020000 mov eax, dword ptr [eax+00000224]
:00453D58 E847A0FCFF call 0041DDA4
:00453D5D 8B45F0 mov eax, dword ptr [ebp-10]
:00453D60 8D55F4 lea edx, dword ptr [ebp-0C]
:00453D63 E85833FBFF call 004070C0
:00453D68 8B45F4 mov eax, dword ptr [ebp-0C]
:00453D6B 50 push eax
:00453D6C A1ACAE4800 mov eax, dword ptr [0048AEAC]
:00453D71 8B00 mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->\"Key\"
|
:00453D73 B9B0404500 mov ecx, 004540B0

* Possible StringData Ref from Code Obj ->\"Registration\"
|
:00453D78 BA98404500 mov edx, 00454098
:00453D7D E82A87FEFF call 0043C4AC
:00453D82 8D55F0 lea edx, dword ptr [ebp-10]
:00453D85 8B45FC mov eax, dword ptr [ebp-04]
:00453D88 8B8010020000 mov eax, dword ptr [eax+00000210]
:00453D8E E811A0FCFF call 0041DDA4
:00453D93 8B45F0 mov eax, dword ptr [ebp-10]
:00453D96 8D55F4 lea edx, dword ptr [ebp-0C]
:00453D99 E82233FBFF call 004070C0
:00453D9E 8B45F4 mov eax, dword ptr [ebp-0C]
:00453DA1 50 push eax
:00453DA2 A1ACAE4800 mov eax, dword ptr [0048AEAC]
:00453DA7 8B00 mov eax, dword ptr [eax]
:00453DA9 B9BC404500 mov ecx, 004540BC

* Possible StringData Ref from Code Obj ->\"Registration\"
|
:00453DAE BA98404500 mov edx, 00454098
:00453DB3 E8F486FEFF call 0043C4AC
:00453DB8 E81FE7FFFF call 004524DC
:00453DBD A178AE4800 mov eax, dword ptr [0048AE78]
:00453DC2 803800 cmp byte ptr [eax], 00
:00453DC5 7420 je 00453DE7

* Possible StringData Ref from Code Obj ->\"Registration Authenticated!\"
|
:00453DC7 B8C8404500 mov eax, 004540C8
:00453DCC E807800100 call 0046BDD8
:00453DD1 33C0 xor eax, eax
:00453DD3 E830EEFFFF call 00452C08
:00453DD8 8B45FC mov eax, dword ptr [ebp-04]
:00453DDB C7805001000001000000 mov dword ptr [ebx+00000150], 00000001
:00453DE5 EB3C jmp 00453E23

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453DC5(C)
|
:00453DE7 A188AF4800 mov eax, dword ptr [0048AF88]
:00453DEC 803800 cmp byte ptr [eax], 00
:00453DEF 7419 je 00453E0A

* Possible StringData Ref from Code Obj ->\"Extended time code accepted!\"
|
:00453DF1 B8EC404500 mov eax, 004540EC
:00453DF6 E8DD7F0100 call 0046BDD8
:00453DFB 8B45FC mov eax, dword ptr [ebp-04]
:00453DFE C7805001000001000000 mov dword ptr [ebx+00000150], 00000001
:00453E08 EB19 jmp 00453E23

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00453DEF(C)
|
* Possible StringData Ref from Code Obj ->\"Invalid registration codes. If \"
->\"your registration codes are not \"
->\"working then blank out the codes, \"
->\"click the Continue button and \"
->\"send a feedback message for assistance.\"
|
:00453E0A B814414500 mov eax, 00454114
:00453E0F E8C47F0100 call 0046BDD8
:00453E14 EB0D jmp 00453E23

Я намеренно привел этот блок кода без сокращений, дабы показать видимую обманчивость видимой

простоты. Казалось бы, быстеренько правим джамп \":00453DC5 7420 je 00453DE7\" и наслаждаемся

своими способностями. НО. . .



Лирическое отступление.

Здесь хочу припомнить выдающегося спортивного комментатора Вл.Синявского, который как-то раз комментировал футбольный матч и в азарте голевого момента опередил даже удар по воротам радостным воплем в микрофон на всю страну \"Гоооллллл! ! ! \" и через секунду сокрушенно добавил \"Хуй-то. . .\" . За что и был отлучен от микрофона и профессии . . .



Так вот, именно такой результат и будет! При последующем запуске программа считает

рег.информацию из файла poker.ini не корректной и все ограничения сохраняются.

У нас два пути: искать и править оставшиеся проверки или разбираться в подробностях.

Будем разбираться!

Воспользуемся OLLYdbg (в этом отладчике есть очень удобное окно с обображением и адресов и их

содержимого в ASCII) и на выполнении :00453DB8 E81FE7FFFF call 004524DC обратим внимание, что

вся рег.информация \"растеклась\" в несколько мест, поэтому ставим бряк на чтение памяти,

содержащей S/N, и всплывем в :004510E1 E8BE16FBFF call 004027A4. Давайте понаблюдаем за

содержимым памяти, куда пишется S/N:

:00453DB3 E8F486FEFF call 0043C4AC --> 00
:00453DB8 E81FE7FFFF call 004524DC --> XXXXX ! ! ! наше рег.имя ! ! !

К слову, S/N представлен в памяти совершенно так же как вводиться! Не программеры, а юмористы!

Переведем дух после такого потрясения и задумаемся: Значит, программа из S/N получила рег.имя,

т.е применен прием обратного декодирования.

Трассируем:

(это не значит жмем сколько-то раз F5 или другую клавишу - это значит, разбираемся в происходящем: где собственно происходит декодирование S/N ! )

:00453DB8 E81FE7FFFF call 004524DC

:00452651 E812E5FFFF call 00450B68

:00450BB4 FF5238 call [edx+38] (00450BF4)

:00450C14 E867040000 call 00451080

:004510E1 E8BE16FBFF call 004027A4 (уже встречалось)

:004510EB FF522C call [edx+2C] (00451EF4)

:00451F26 E891FBFFFF call 00451ABC

Процедура Proc_451ABC - пример совершенно замечательный! Предварительная операция

содержимого S/N с константой плюс шестнадцать итераций плюс еще одна операция с константой и в

результате получаем рег.имя!

Часть процедуры Proc_451AABC, пример одной итерации:

CODE:00451B6E push 10h
CODE:00451B70 mov eax, [ebp+var_4]
CODE:00451B73 mov ecx, [eax+1098h]
CODE:00451B79 mov eax, [ebp+var_4]
CODE:00451B7C mov edx, [eax+109Ch]
CODE:00451B82 mov eax, [ebp+var_4]
CODE:00451B85 call sub_4515FC


Не могу не привести Proc_4515FC полностью:

* Referenced by a CALL at Addresses:
|:004518C6 , :004518E2 , :004518FE , :0045191A , :00451936
|:00451952 , :0045196E , :0045198A , :004519A6 , :004519C2
|:004519DE , :004519FA , :00451A16 , :00451A32 , :00451A4E
|:00451A6A , :00451B85 , :00451BA1 , :00451BBD , :00451BD9
|:00451BF5 , :00451C11 , :00451C2D , :00451C49 , :00451C65
|:00451C81 , :00451C9D , :00451CB9 , :00451CD5 , :00451CF1
|:00451D0D , :00451D29
|
CODE:004515FC
CODE:004515FC push ebp
CODE:004515FD mov ebp, esp
CODE:004515FF add esp, 0FFFFFFF0h
CODE:00451602 mov [ebp+var_C], ecx
CODE:00451605 mov [ebp+var_8], edx
CODE:00451608 mov [ebp+var_4], eax
CODE:0045160B mov eax, [ebp+var_C]
CODE:0045160E movzx eax, byte ptr [eax+3]
CODE:00451612 mov edx, [ebp+var_4]
CODE:00451615 mov edx, [edx+1094h]
CODE:0045161B mov eax, [edx+eax*4]
CODE:0045161E mov edx, [ebp+var_C]
CODE:00451621 movzx edx, byte ptr [edx+2]
CODE:00451625 mov ecx, [ebp+var_4]
CODE:00451628 mov ecx, [ecx+1094h]
CODE:0045162E add eax, [ecx+edx*4+400h]
CODE:00451635 mov edx, [ebp+var_C]
CODE:00451638 movzx edx, byte ptr [edx+1]
CODE:0045163C mov ecx, [ebp+var_4]
CODE:0045163F mov ecx, [ecx+1094h]
CODE:00451645 xor eax, [ecx+edx*4+800h]
CODE:0045164C mov edx, [ebp+var_C]
CODE:0045164F movzx edx, byte ptr [edx]
CODE:00451652 mov ecx, [ebp+var_4]
CODE:00451655 mov ecx, [ecx+1094h]
CODE:0045165B add eax, [ecx+edx*4+0C00h]
CODE:00451662 mov [ebp+var_10], eax
CODE:00451665 xor eax, eax
CODE:00451667 mov al, [ebp+arg_0]
CODE:0045166A mov edx, [ebp+var_4]
CODE:0045166D mov edx, [edx+1090h]
CODE:00451673 mov eax, [edx+eax*4]
CODE:00451676 xor eax, [ebp+var_10]
CODE:00451679 mov edx, [ebp+var_8]
CODE:0045167C xor [edx], eax
CODE:0045167E mov esp, ebp
CODE:00451680 pop ebp
CODE:00451681 retn 4


Узнали? Нет?! Это есть то, что в дюдюктивах, в остросюжетных фильмах о рыцарях плаща и кинжала

времен 40-60-х годов и криптогрофами называется классическим использованием классической

кодовой таблицы или ШИФРОБЛОКНОТ ! Промакнем испарину на лбу. . .

[ebp-04+00001090] - и есть адрес начала кодовой таблицы.

:00451673 8B0482 mov eax, dword ptr [edx+4*eax] - загрузка еще одной из 16-ти констант (по

одной на каждую итерацию).

Математические функции над константами, который зависят от содержимого одной части S/N, для

получение новой константы, которая в свою очередь используется в операции с другой частью S/N -

это классика жанра !


Еще одно лирическое отступление.

А.Македонский, когда планировал поход в Индию и ему привели проводника, спросил старика: Не боится ли он смерти за неверно указанный путь? И получил такой ответ: Ошибка в один шаг в начале пути будет заметна спустя годы и будет стоить пути через пол-мира!



Вывод: с точки зрения надежности и трудозатрат на ручное декодирование примененный прием

заслуживает уважение и наивысшие оценки.

Случайное декодирование совершенно исключено ! ! !



Фактически, Proc_451ABC и есть кейген, только \"повернуть\" алгоритм для организации \"шаг в шаг

назад\" и чуть-чуть подправить Proc_4515FC.

Мы рассмотрели только часть из возможный вызовов Proc_4515FC:

* Referenced by a CALL at Addresses:
|:004518C6 , :004518E2 , :004518FE , :0045191A , :00451936
|:00451952 , :0045196E , :0045198A , :004519A6 , :004519C2
|:004519DE , :004519FA , :00451A16 , :00451A32 , :00451A4E
|:00451A6A ,
:00451B85 , :00451BA1 , :00451BBD , :00451BD9
|:00451BF5 , :00451C11 , :00451C2D , :00451C49 , :00451C65
|:00451C81 , :00451C9D , :00451CB9 , :00451CD5 , :00451CF1
|:00451D0D , :00451D29

и этого вполне достаточно.

И последнее, как все вы понимаете, вероятность появления в S/N символа 0 (нуль), не нулевая.

(простите за тавтологию). Так вот, если в S/N должен быть \"0\", он \"прячется\" за символ \"К\", те.

если в S/N должен быть, к примеру, \"0F\", то вводить следует \"KF\". Этот прием, те. его не

применение , будет \"портить нервы\" в

:00452560 E893FDFFFF call 004522F8 . . .

Мне такой прием еще не встречался.

Глава Вторая.

Давайте немного по-фантазируем ...

В этом примере мы столкнулись, скажем так, с уже давно и плодотворно разработанным

направлением в криптографии.

Отметим плюсы и минусы:

в плюсах - надежность кодирования/декодирования и небольшой объем кода при
реализации,
доступность математического аппарата, в среде профи считается уже вчерашним
днем (в открытой печати проблематика описана) и прочее.
в минусах - небольшой объем кода оставляет возможность все-таки разобраться в защите.

Вывод: для построения защиты чуть выше среднего уровня метод вполне можно пользовать.

Разумеется, при использовании в защите подобного метода стоит серъезно задуматься о програмной

реализации идеи. Требуются дополнения и некоторые новшества.


Я сознательно не буду описывать рекомендации для повышения надежности защиты при использовании

этого метода - как-то не хочется в будующем столкнуться с такой \"усиленной\" защитой!

Вы меня понимаете.

Если хотите обсудить эти аспекты - давайте обсудим - пишите, адрес указан.

Успехов!

Demode
R091003@km.ru

ps. KEY -> FOURFLUSH


Обсуждение статьи: Применение криптографии в защите двадцатидолларовой программы. >>>


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



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


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