
 Witam! :)

 Strasznie mi sie nudzilo (ferie i te sprawy), a nic nie mialem do lamania,
 na #crackpl "Lukian" powiedzial ze zrobil crackme... zajelo mu to 3 dni i
 mysli ze jest poziomu hard. Postanowilem wiec to sprawdzic ;)

 Wlaczylem komputer z SoftIcem i patrze, crackme sie nie uruchamia :) napewno
 zadna nowa sztuczka, odpalilem sobie FrogsIce i uruchomilo sie. Teraz
 zobaczylem tekst "Nag nr 1" (jeszcze jest drugi Nag) no i widac okienko z
 2 editami - name i serial; sa niestety disabled. W about czytam ze nie mozna
 patchowac ;) jak sie dowiedzialem chodzi o keyfile`a aby zlikwioowac naga.

 Sprawdzilem sobie jaki to jest plik - crcme4.key. Zalozylem wiec pulapke w
 SI:

 bpx createfilea do "d esp->4; p ret"

 i F5`ciowalem az widzialem ze dobiera sie do pliku crcme4.key ;) Teraz
 podstawowe czynnosci robi, dalej widac ze bierze rozmiar pliku i porownuje
 z 8 bajtami. Wyszedlem z SI i utworzylem sobie taki plik co mial 8 bajtow.
 Doszedlem do kodu sprawdzania zawartosci pliku i widac tam taka procke:

 W eax mamy 4 pierwsze znaki a w edx 4 ostatnie znaki:

 xor    edx, eax
 rol    eax, 07
 ror    edx, 03
 sub    eax, 0ABh
 add    edx, 0ABh
 xor    eax, edx
 cmp	eax, 30AC560Fh

 Hmm... wyglada znajomo.. jak w kazdym crackme, nic nowego tylko wciaz
 walkujemy te same chwyty. Cosik mi sie wydaje ze trza zrobic brute force ;)
 [...zrobilem brute force i zadzialo, ale na marne bo potem jeszcze raz
     sprawdza poprawnosc z innego dzialania...]

 Zauwazylem cosik takiego:

 mov    ebx, [4 pierwsze znaki]
 mov    ecx, [4 ostatnie znaki]
 add    ebx, ecx
 cmp    ebx, 9EB3B3AAh

 Aby zrobic totalny brute force, obawiam sie ze braklo by mi zycia ;( Bo
 musielibysmy przeanalizowac wszystkie mozliwosci 4 pierwszych z 4 ostatnimi
 znakami. Co nam da 0FFFFFFFFh x 0FFFFFFFFh. Wiec pomyslalem...

 Myslalem jak by tutaj cos skrocic, aby zmniejszyc ilosc mozliwosci... no i
 jasne.. ale duren ze mnie ;) skoro EAX i ECX w sumie musza dawac ta liczbe,
 to poco sprawdzac inne liczby? ;) Ogranicze ilosc liczb w ten sposob

 EAX - 9EB3B3AAh
 EDX - 0h

 teraz:

 dec    eax \ ______ . - No i mamy teraz tylko tyle mozliwosci ile wynosi suma.
 inc    edx /

 Praktycznie pare sekund... Napisalem sobie kojenego brute forca, oto on:

 --- CuT HeRe ---
 .386P
 locals
 jumps
 .model flat,stdcall
 UNICODE=0
 include w32.inc
 .DATA
        licznik_a       dd      9eb3b3aah
        licznik_d       dd      0
 .CODE
 start:
 brute:
        dec     licznik_a
        inc     licznik_d
        mov     eax, dword ptr[licznik_a]
        mov     edx, dword ptr[licznik_d]
        xor     edx, eax
        rol     eax, 07
        ror     edx, 03
        sub     eax, 0abh
        add     edx, 0abh
        xor     eax, edx
        cmp     eax,30ac560fh
        jne     brute
 koniec:
        int     3
        ret
 END    start
 --- CuT HeRe ---

 Wlaczylem detektor w softice na 3 przerwanie: i3here on
 Teraz odpalilem proga i poszedlem napic sie herbatki... nawet nie zdazylem
 zapazyc a tu juz mialem wynik. Dalem wiec w SI:

 d 402000

 402000 <- dlatego tyle bo to jest licznik_a :)

 Zauwazylem napis: cReWGaNG

 Wpisalem wiec w crcme4.key i dupa. Ja mam taka wade ze nigdy nie pamietam
 kolejnosci... pewnie w bruteforce pomieszalem eax z edx albo odwrotnie.
 Biore wiec odwrotnie i wpisuje: GaNGcReW. Nagi zniknely, a pola sa enabled.

 Pierwsza czesc za mna teraz generowanie serialu.
 Szybko napisalem MaxiBogas i przeszedlem do kodu generowania (tak szybko
 lece bo niechce mi sie wdawac w szczegoly - ale tutaj powiem ze serial
 musi miec 16znakow). Widac straszne zagmatfanie, pomyslalem... niechce
 mi sie teraz... ale nie.. zobacze.. ;)
 No i patrze a to tylko jedna procka ktora sie powtarza 4 razy ;) Na tej
 samej zasadzie co keyfile. Oto ona:

 mov    cl, ah
 rol    edx, cl
 mov    cl, al
 ror    edx, cl
 add    dx, ax
 shr    eax, 10h
 mov    cl, ah
 ror    edx, cl
 mov    cl, al
 rol    edx, cl
 add    dx, ax

 Pierwsze cztery znaki zaszyfrowal i teraz wynik jest w edx. Tak samo robi z
 reszta, czyli 4 razy.

 Call sie konczy i w nastepnym widac ze eax+edx ma byc rowne D6C68A9Bh, a
 ecx-ebx ma byc rowne 10505FD0h. Oczywiscie w eax sa zaszyfrowane pierwsze
 4 znaki, w ebx kolejne 4, w ecx, kolejne i w edx ostatnie 4.

 Matematyka:

 eax+edx=D6C68A9Bh
 edx=D6C68A9Bh-eax

 No i wysztko jasne ;) Mozemy napisac wlasny generator (jak ja z poczatku):

 ----------------------------------------------------------------------------
 .DATA
        licznik_a    dd    34333231h ; (1234)
 .CODE
 start:
 brute_eax:
        mov     eax, 1b071b04h	; (dla MaxiBogas)
        mov     ecx, 80004e08h
        mov     edx, licznik_a
        mov     cl, ah
        rol     edx, cl
        mov     cl, al
        ror     edx, cl
        add     dx, ax
        shr     eax, 10h
        mov     cl, ah
        ror     edx, cl
        mov     cl, al
        rol     edx, cl
        add     dx, ax
 koniec:
        int     3
        ret
 END    start
 ----------------------------------------------------------------------------

 albo sledzic kod programu dla poszczegolnych znakow i sprawdzac ile wyniesie
 zaszyfrowany eax ;) czyli pierwsze 4 znaki.

 Jako pierwsze znaki wpisalem sobie "1234" i dla nicka "MaxiBogas" zaszyfro-
 wal to na A349EC90h.

 edx=D6C68A9Bh-A349EC90h
 edx=337C9E0Bh

 Musialem teraz napisac program ktory znajdzie jakie wartosci po zaszyfrowa-
 niu dadza 337C9E0B. Oczywiscie brute force:

 --- CuT HeRe ---
 .386P
 locals
 jumps
 .model flat,stdcall
 UNICODE=0
 include w32.inc
 .DATA
        licznik_a	dd	0
 .CODE
 start:
 brute_eax:
        inc     licznik_a
        mov     eax, 1b071b04h	; (dla MaxiBogas)
        mov     ecx, 80004e08h
        mov     edx, licznik_a
        mov     cl, ah
        rol     edx, cl
        mov     cl, al
        ror     edx, cl
        add     dx, ax
        shr     eax, 10h
        mov     cl, ah
        ror     edx, cl
        mov     cl, al
        rol     edx, cl
        add     dx, ax
        cmp     edx, 337c9e0bh
        jne     brute_eax
 koniec:
        int    3
        ret
 END    start
 --- CuT HeRe ---

 To troche dluzej trwalo i dalo wynik hex: 60 88 39 86
 No i to sa wlasnie 4 ostanie znaki lub pierwsze cztery, jak kto woli.

 To samo robie dla ebx i ecx:

 ecx-ebx=10505FD0h
 ecx=10505FD0h+ebx

 Wzialem sobie znaki od 4 do 8 jako "5678". Program mi to zaszyfrowal tak:
 C3690CB0h - ebx

 Teraz
 ecx=D3B96C80h+C3690CB0h
 ecx=D3B96C80

 I szukam jakie wartosci po zaszyfrowaniu dadza taki wynik. Ten sam brute
 force co wczesniej tylko zamiast 337C9E0Bh wpisalem D3B96C80h.

 Dostalem wynik.. o w ASCII mozna zapisac: /"A:

 Teraz poprzedni wynik co byl w hex zapisalem sobie w HEX edytorze:
 60 88 39 86 i zapisalem do pliku. Wczesniej w pliku zapisalem
 12345678/"A: + to co juz bylo w pliku ;) Bo normalnie z klawiatury nie
 pozwoli wpisac 88h ani 86h.

 Wyszlo mi: 12345678/"A:`9

 Teraz wystarczy wyciac i wkleic w Serial. Zgadza sie of course ;) To bylo
 by na tyle... Wydaje mi sie ze crackme nie zasluguje na Level HaRD, choc
 widzialem o wiele wiele wiele latwiejsze z napisem Extra Hard :) ale to pew-
 nie w celach reklamy :) albo dla pokazania swoich max. umiejestnosci :)

 pozdrawiam wszystkich
 MaxiBogas
 home@alpha.net.pl