-+[ jak zlamac Crackme 1.0 by Lord Ghoul ]+-

Crackmesik powstal ladny czas temu, ale nikt nie napisal do niego tuta
(przynajmniej mi nic nie wiadomo), tak wiec postanowilem to zrobic.
Prog nastukany w asm, niespakowany.

-+[ disasembler & debug ]+-

Od adresu 4012B4 zaczyna sie procka, ktora przeglada crackme w poszukiwaniu
bpx, jesli go znajdzie to wyswietla msgbox'a z info i badboy. Nas najbardziej
interesuje ponizszy kawalek kodu:

 loc_4012E7:
     cmp     esi, offset nullsub_1
     jnz     short loc_4012D1
     mov     ds:word_403544, bx
     mov     esi, offset off_401512

W bx znaduje sie stala, obliczana na podstawie kodu crackme, bedzie nam to
potrzebne za chwile.

 loc_401319:
     push    200h
     push    offset _name
     push    ds:hWnd
     call    GetWindowTextA
     push    200h
     push    offset _pass
     push    ds:dword_403130
     call    GetWindowTextA

Pobieranie name i serial, nastepnie hash domowej roboty (dokladniej mowiac sa
dwa), nastepnie str2hex. Pass ma postac: LG????????-????????.
Glowne zabezpieczenie:

     mov     bx, ds:word_403544
     shl     ebx, 10h
     mov     bx, ds:word_403544

Staly word z crackme rozciagniety na dworda - 74587458h

     push    ebx
     mov     eax, ds:dword_403534   ;pierwsza czesc pass
     call    sub_4014EB
     pop     ebx
     push    ebx
     xor     eax, ebx               ;xor ze stala z crackme
     cmp     eax, ds:dword_40353C
     jnz     short loc_401451       ;czy rowne z hash1?
     mov     eax, ds:dword_403538   ;druga czesc pass
     call    sub_4014EB
     pop     ebx
     xor     eax, ebx               ;xor ze stala z crackme
     cmp     eax, ds:dword_403540
     jnz     short loc_401451       ;czy rowne z hash2?
     jmp     short loc_401466

Czyli jak narazie standard, call, nastepnie cmp, teraz proponuje zajrzec do
naszej procki:

 sub_4014EB      proc near
     mov     edx, 0
     mov     ebx, eax
     mul     eax
     call    sub_4014D7
     mul     ebx
     call    sub_4014D7
     mul     eax
     call    sub_4014D7
     mul     ebx
     call    sub_4014D7
 sub_4014EB      endp

Lookamy do call'a i wszystko jasne:

 sub_4014D7      proc near
     push    edx
     push    ebx
     mov     ebx, 0A23F5DA9h
     push    eax
     div     ebx
     mul     ebx
     pop     ebx
     sub     ebx, eax
     mov     eax, ebx
     pop     ebx
     pop     edx
     retn
 sub_4014D7      endp

Jak widac procka oblicza mod, jak mozna sie domyslec jest to RSA, do ebx
weruje n, eax zawiera m. Wzor RSA przedstawia sie nastepujaco: c=m^e mod n,
czyli do szczescia brakuje nam tylko e, jak je znalezc? Jak widzimy m nie
jest podnoszone do potegi e, nie zostal tu uzyty zaden biglib itp. RSA
mozna obliczyc w inny sposob:

e - zapisuje sie w postaci binarnej, dalej posluze sie txtem hintego:
"
     k - liczba bitow w naszej liczbie binarnej (np 6 bitow)
     e(i) - kolejne bity tej liczby poczawszy od najmlodszego
     M - jest textem jawnym a algorytm liczy: X = (M^e mod n)

     d:=1;
     for k=6 downto 0
     begin
         d:= (d*d) mod n;
         if e(i) = 1 then
         begin
         d:= (d*M) mod n;
         end;
     end;
"
W crackme mamy zastosowany taki sam wzor, tylko bez sprawdzania czy bit e
jest rowny 1, czyli e = 0111bin (7hex). Mamy zebrane wszystkie niezbedne
informacje:

n - 0A23F5DA9
e - 7
p - A44D
q - FCCD

Obliczamy d - 73E2F467 i jestesmy gotowi do pisania keygen'a ;) Mozemy posluzyc
sie jakims biglibem (nie polecam), ripnac procke z crackme lub poprostu
uzyc procki shield'a - xamodn.inc z asmpak'a (polecam).

-+[ podsumowanie ]+-

name: jopas
pass: LG7A2B2BD3-27E5F6F4

Przyjemne crackme, wykorzystujace wszystkim znane RSA, ale nie w sposob
stosowany przez wszystkich ;)

jopas/htb+rag          mail: jopas@o2.pl          web: http://www.jopas.prv.pl

-+[ end ]+-