![]() |
Домой | Статьи | 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 ![]() |
Вы находитесь на EXELAB.rU |
![]() |