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


Материалы находятся на сайте http://cracklab.narod.ru/doc/






Hosted by uCoz