Автор: EGOiST <egoist_tsrh@rbcmail.ru>
target : Burn CD Now 1.70 http://www.tianshaosoft.com/ tools : SoftIce (само собой) IDA RSA-Tool 2 by tE! (v1.7) MASM32 для кейгена.. 2 литра мозгов для осмысления алгоритма :) (еще их можно использовать для вычесления Private Exponent (D) не прибегая к помощи RSA-Tool - прим. ред.) Приступим.. Запускаем...жмем register вылетает наглое окно и агитирует нас зарегистрироваться.. но мы ведь не какиенить буржуи у нас есть мозги(см. выше - прим. ред.). Такчо будем все ето дело убирать нафиг. Вводим имя например "[EGOiST]" (здесь и дальше будет использо- ваться именно оно :).. вводим какие-нибудь циферки в поле рег. кода, жмем естессно на ОКей. Прога не хочет принимать нашь код (глупая какая - прим. ред.) и выдает "The registration info is not correct, Please register later." Нафига лэйтер если мона щас? Так..загружаем ето дело в IDA и идем пить кофэ;) хотя нет прога-то не на дельфях а на си.. такчо 10 минут и готово. Теперь "Names window" и вводим там "aTheRegistratio" пока кур- сор не поставит нас на нужное место(какой умный курсор! - прим ред.) жмем два раза на етой строке.. попадаем по адресу, далее Ctrl+X(xrefs) и видим что енто вызывается 3 раза. Сделаю подс- казку: нужен нам только второй вызов остальные нафиг не надо. Итак переходим на второй вызов и попадаем сюды: :::::::::::[CUT HERE]::::::::::::::::::::::::::::::::::::::::: 004119DD mov ecx, [eax+4] 004119E0 call sub_40F850 ;тобишь проверка 004119E5 test eax, eax ;если не прошло 004119E7 jz short loc_4119F7 ;то плохая мессага 004119E9 push 40h 004119EB push offset aRegistrationIn 004119F0 push offset aYouHaveRegiste ;хорошая мессага 004119F5 jmp short loc_411A03 004119F7 ; --------------------------------------------------- 004119F7 004119F7 loc_4119F7: 004119F7 push 30h 004119F9 push offset aRegistrationIn 004119FE push offset aTheRegistratio ; наша плохая мессага :::::::::::[CUT HERE]::::::::::::::::::::::::::::::::::::::::: Как видно из листинга проверка идет по адресу 004119E0. Будем глядеть внутрь: :::::::::::[CUT HERE]::::::::::::::::::::::::::::::::::::::::: 0040F987 mov eax, dword ptr aE0efee57804e7a ; "E0EFEE57804E7A89" 0040F98C mov ecx, dword ptr aE0efee57804e7a+4 0040F992 mov edx, dword ptr aE0efee57804e7a+8 0040F998 mov [esp+224h+var_200], eax 0040F99C mov eax, dword ptr aE0efee57804e7a+0Ch 0040F9A1 mov [esp+224h+var_1FC], ecx 0040F9A5 mov cl, byte ptr aE0efee57804e7a+10h 0040F9AB push edi 0040F9AC mov [esp+228h+var_1F4], eax 0040F9B0 mov [esp+228h+var_1F0], cl 0040F9B4 mov ecx, 14h 0040F9B9 xor eax, eax 0040F9BB lea edi, [esp+228h+var_1EF] 0040F9BF mov [esp+228h+var_1F8], edx 0040F9C3 repe stosd 0040F9C5 mov edx, dword ptr a101b445 ; "101B445" 0040F9CB mov ecx, 17h 0040F9D0 stosw 0040F9D2 stosb 0040F9D3 mov eax, dword ptr a101b445+4 :::::::::::[CUT HERE]::::::::::::::::::::::::::::::::::::::::: Не кажутся ли странными вам циферки с буковками в комментариях? А мне показались..:) Смотрим дальше вроде ниче интересного но ето только пока мы находимся в IDA. Запускаем таргет(уже запус- кали см. выше - прим. ред.). Ставим бряк на 40FA5B там как-то странно много нересолвеных функций вызывает.. для тех кто в танке бряк надо ставить так: при запущенной проге открываем сайс, вводим там "addr BurnCDNow" без кавычек, потом "bpx 40FA5B" и все. Заходим в register вводим имя и циферки для рег.кода жмем ОК, тут из-за угла выглядывает сайс.. смотрим на листинг.......... трейсим до 40FB29 попутно заглядывая в переменные............. дальше идет сравнение имени с какимито данными если вы успели заметить ети байты появились после вызова некой ф-ии по адресу 40FAE4. Выходим из сайса. Вообщето здесь можно было бы остано- виться и дать исходники кейгена, но для тех кто в танке.. про- должим. По етому листинку, кто когда либо сталкивался с алго- ритмом RSA, можно сразу узнать библиотеку MIRACL которая соб- свенно используется для RSA в прогах написаных на Си. Но мы ее использовать не будем(у него ее наверно небыло на момент напи- сания тутора - прим. ред.). Мы будем использовать BigLib напи- санную на АСМе. Поэтому привожу етот листинг с переименованны- ми ф-ми под BigLib: :::::::::::[CUT HERE]::::::::::::::::::::::::::::::::::::::::: 0040FA5B mov esi, dword_430CF4 0040FA61 call BigCreate 0040FA66 mov [esp+22Ch+var_20C], eax 0040FA6A push 0 ; Init 0040FA6C call BigCreate 0040FA71 mov [esp+230h+BigMsg], eax 0040FA75 push 0 ; Init 0040FA77 call BigCreate 0040FA7C mov [esp+234h+BigN], eax 0040FA80 push 0 ; Init 0040FA82 call BigCreate 0040FA87 mov [esp+238h+BigE], eax 0040FA8B mov dword ptr [esi+220h], 10h 0040FA95 mov edx, [esp+238h+BigMsg] 0040FA99 lea ecx, [esp+238h+NumHexStr] 0040FAA0 mov byte ptr [esp+238h+var_4], 6 0040FAA8 push ecx ; NumHexStr 0040FAA9 push edx ; BigNum 0040FAAA call BigIn 0040FAAF mov ecx, [esp+240h+BigN] 0040FAB3 lea eax, [esp+240h+var_19C] 0040FABA push eax ; NumHexStr 0040FABB push ecx ; BigNum 0040FABC call BigIn 0040FAC1 mov eax, [esp+248h+BigE] 0040FAC5 lea edx, [esp+248h+var_200] 0040FAC9 push edx ; NumHexStr 0040FACA push eax ; BigNum 0040FACB call BigIn 0040FAD0 lea ecx, [esp+250h+BigE] 0040FAD4 lea edx, [esp+250h+BigN] 0040FAD8 push ecx ; BigE 0040FAD9 lea eax, [esp+254h+BigMsg] 0040FADD push edx ; BigN 0040FADE lea ecx, [esp+258h+BigBuff] 0040FAE2 push eax ; BigMsg 0040FAE3 push ecx ; BigBuff 0040FAE4 call BigPowMod ; RSA.Encrypt 0040FAE9 mov edx, [esp+260h+var_20C] 0040FAED mov eax, [eax] 0040FAEF push edx 0040FAF0 push eax 0040FAF1 call sub_41C690 0040FAF6 mov ecx, [esp+268h+BigBuff] 0040FAFA add esp, 40h 0040FAFD push ecx 0040FAFE call sub_41C310 0040FB03 lea edx, [esp+22Ch+var_20C] 0040FB07 lea eax, [esp+22Ch+var_D4] 0040FB0E push edx 0040FB0F push eax 0040FB10 mov dword ptr [esi+220h], 100h 0040FB1A call sub_4076D0 0040FB1F add esp, 0Ch 0040FB22 lea esi, [esp+228h+var_D4] 0040FB29 lea eax, [esp+228h+var_70] :::::::::::[CUT HERE]::::::::::::::::::::::::::::::::::::::::: Чтобы узнать что ето encrypt а не decrypt мне понадобилось где то пол часа кручения-верчения в RSA-Tool. Немного истории: RSA был создан в 1977 году Рональдом Ривет, Ади Шамиром и Лео- нардом Адлеман. С 09-20-2000 патент на использование этого ал- горитма ИСТЕК!. Вследствии этого сейчас алгоритм может исполь- зовать любой человек даже в комерческих целях. Немного теории: P - первое большое простое число Q - второе большое простое число E - Public Exponent N - Publuc Modulus (N = P*Q) D - Private Exponent (D = E^(-1) mod ((P-1)*(Q-1)) E и N это публичные экспоненты они свободно распростроняются, но D распростронять нельзя, она используется для дешифрации. Чтобы получить собственно зашифрованный текст надо всего лишь перевести его в BigNum(большое число): Сipher=текст^E mod N ну и получится зашифрованный текст. А вот чтоб расшифровать еще на- до знать число D: текст=Cipher^D mod N. Вот и вся теория. Теперь посмотрим что мы имеем...вызывается RSA.Encrypt посмот- рите что именно шифруется... а шифруется именно введенные нами циферки рег.кода..(применяем наши 2 литра мозгов отборного ка- чества). Чтобы получить правильный код надо преобразовать имя в BigNum, потом получившийся шифр, собственно, расшифровать, и преобразовать в текст. Вот и весь алгоритм..но для него надо еще узнать E и N и D числа. Посмотрим во 2 листинг, мы видели там две строки...глянем "E0EFEE57804E7A89" и "101B445". Так вот обычно то что короче является E а то что длиннее - N.. нам еще надо узнать D. Для этого запускаем RSA-Tool.. вводим в поле "Modulus (N)" первое число... предварительно выбрав "Num- ber base" равным 16. Жмем "Exact size" и узнаем что ключ у нас длинной в 64 бита.. не так уж и много. Жмем "Factor N" и ждем когда вычеслятся P и Q. Еслиб ключ был хотябы 160 битов этобы заняло очень много времени. Но добрые разработчики позаботили- сь за нас об этой проблеме. Кстати размер в 64 бита значит что зашифрованный текст может быть только 8 байт, из этого следует что длинна имени для генерации может быть максимум 8 символов. Жмем "Calc. D" и получаем нашу заветную приватную экспоненту. Теперь нам все известно и мы можем написать кейген: ;::::::::::::::::::::::::::::::KEYGEN PROC:::::::::::::::::::: .386 .model flat,stdcall include \masm32\include\masm32.inc include biglib.inc includelib \masm32\lib\masm32.lib includelib biglib.lib .data _n db "E0EFEE57804E7A89",0 ;64 bit Modulus (N) _d db "C7EA95046438FA8D",0 ;64 bit Private Exponent (D) .code keygen proc hwnd:DWORD local usrname: dword local serial: dword local big_n: dword local big_d: dword local big_c: dword local big_m: dword local _len: dword push edi push esi push ebp invoke Alloc, 100 ;allocating memory for vars mov usrname, eax invoke Alloc, 100 mov serial, eax invoke GetDlgItemTextA, hwnd, IDC_EDIT1, usrname, 050h mov _len, eax .if eax < _min_name_len invoke SetDlgItemTextA, hwnd, IDC_EDIT2, addr _lenght_err jmp _exit .elseif eax > 8 ;if length of name > 8 then error... invoke SetDlgItemTextA, hwnd, IDC_EDIT2, addr _maxlen jmp _exit .endif invoke _BigCreate,0 ;create big numbers mov big_n, eax invoke _BigCreate,0 mov big_d, eax invoke _BigCreate,0 mov big_c, eax invoke _BigCreate,0 mov big_m, eax invoke _BigIn,addr _n, 16, big_n ;big_n = _n invoke _BigIn,addr _d, 16, big_d ;big_d = _d invoke _BigInBytes, usrname, _len, 256, big_c ;convert name ;into big number (cipher to decrypt) invoke _BigPowMod, big_c, big_d, big_n, big_m ;bim_m = big_c^big_d mod big_n ;RSA.Decrypt: Msg = CIPHER^D mod N invoke _BigOutB16, big_m, serial ;convert decrypted msg ;into string(serial) invoke _BigDestroy, big_n ;destroying(free memory) big numbers invoke _BigDestroy, big_d invoke _BigDestroy, big_c invoke _BigDestroy, big_m invoke SetDlgItemTextA, hwnd, IDC_EDIT2, serial _exit: invoke Free, serial ;free memory after allocation invoke Free, usrname pop ebp pop esi pop edi xor eax,eax ret keygen endp END ;::::::::::::::::::::::::::::::KEYGEN PROC:::::::::::::::::::: Читаем комментарии и наслаждаемся.. а для тех кому лень писать полностью(или для тех кто в бронетранспартерах - прим. ред.), есть полная версия кейгена :) Disclamer: All this for educational purpose ONLY! Here nothing do not crack. Here just examining a protection system based on RSA Publick key Algorithms. Дискламер: Все это только в образовательных целях! Здесь ничего не ло- мается. Здесь просто изучается система защиты основанная на RSA Publick key алгоритмах. Все вопросы, пожелания, критику в мыло или на форум. Извеняйте за допущенные ошибки всетаки целая ночь...:) Greetz: TSRh, SnD, FHCF, UG, DAMN, HorNet, Skitz0, Gr3yWolf, zwei, Hex, MozgC, Majest1c[UG], CoaX^CPH, Bad_guy. Writed by, edited by, published by EGOiST/TSRh e.mail : egoist_tsrh@rbcmail.ru forum : zor.org/tsrhclub e.web : ego1st.cjb.net date : 05.09.2003 10:01.35 after long reversing night :) Исходники прилагаются (20 Кб): Скачать
Материалы находятся на сайте http://cracklab.narod.ru/doc/