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

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


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

RSA Keygenning Tutorial

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

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

Автор: 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 Кб): Скачать
 


Обсуждение статьи: RSA Keygenning Tutorial >>>


Комментарии к статье: RSA Keygenning Tutorial

progopis 09.11.2008 22:14:11
Искал имплементацию RSA в гугле 2 часа. Потом на tuts4you... При том, что сам сейчас являюсь триал-мембером TSRh и в итоге узнаю, что готовый исходник уже есть на нашем сайте (tsrh.org.ua)... Тяжелый случай.

Спасибо EGOiST/TSRh за отличную статью!
---

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



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


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