
           ܲ   ߲      ߲ 
          ܲ     ۲      
                  ۲   
              ۲  ۲       
         ۲    ۲ ܲ  
          ߲   ߲       ߲   
                      -bHd-
                        +o cybult^2oo2


                  CrackMe ver 2.0 by Zenek Jajko^UnderPL tutorial


        Cel     : CrackMe ver 2.0 by Zenek Jajko^UnderPL
        Czym    : SoftICE
        Opis    : Crackme jest spakowane UPX-em i zmodyfikowane scramblerem,
                  pisane w masmie. Trzeba znalezc serial-rozwiazanie.

        notice  : ustaw sobie czcionke terminal 12 przy czytaniu tego tuta,
        notice2 : i nie zmieniaj bo to najlepszy font ;)

        Kiedy pisze tego tuta, crackme to ma juz status Cracked na C4U. Zostalo
        szybko zlamane przez Kwaska :), ktory nie leka sie zadnego wyzwania ;),
        tym razem jednak wyprzedzil mnie poniewaz jakos tak sie zlozylo, ze nie
        lookalem do tego crackmesa az do dzis :). Powod? Ano rzucilem okiem na
        importy i za szybko wyciagnalem wnioski, fuckin' text drawing ;). Mowa
        konkretnie o GetPixel i SetPixel. Dodatkowo moja niechec do lamania
        tego crackme spotegowala propaganda w ReadMe.txt, hehe. Autor okresla
        je jako cytuje, "crackme dla ludzi o mocnych nerwach..." :). Rzucilem
        wiec to badziewie o sciane, potem za okno ;). Gdybym tylko sprawdzil na
        poczatku jak wyglada procka weryfikujaca s/n to pewnie zlamalbym toto w
        pare chwil (jak dzis). Cale to zamieszanie w mojej glowie wywolala
        pewna idea sprzed kilku miesiecy, kiedy to chcialem zakodowac crackme z
        drawowaniem bitmapy wyswietlajacej goodboy. Zonk polegal na tym, ze ten
        goodboy (a raczej pixele bitmapy, ktora go tworzyla) zalezal scisle od
        wpisanego seriala, poniewaz ten kodowal jego wszystkie bajty. Algorytm
        byl tak wyjebany w kosmos, ze znalezienie poprawnego passworda bylo nie
        realne. Hehe, uwzgeldnilem tez format bitmapy co uniemozliwilo zlamanie
        algosa przez szukanie bajtow np. naglowka (stalego dla bitmap) :). Caly
        ten projekt ostatecznie znalazl sie w koszu (sciana+za okno) bo uznalem
        ze tak finezyjne podejscie do problemu zabezpieczen lepiej zostawic dla
        Durex'a :). No wiec wracajac do watku... crackme Zenka wywolalo u mnie
        taka wlasnie reminiscencje. Pomyslalem, ze koles zrealizowal ten crazy
        protection (bo jak to inaczej nazwac, MD0?) i zlamanie niemozliwe. Gdy
        zobaczylem solucje Kwaska w postaci seriala, musialem to sprawdzic. UPX
        wywalilem z cracke ProcDumpem, potem obejrzalem listing w IDA. Jeszcze
        za wczesnie bylo na wyciaganie wnioskow (jestem w tym niestety szybki)
        totez wwalilem zenka2 do SoftICE. Pobieranie seriala:

                push    104             ; ID edita
                push    [ebp+hDlg]      ; hWnd
                call    GetDlgItem      ; pobierz uchwyt edita
                mov     hEdit, eax      ; zachowaj

                push    hEdit           ; uchwyt edita
                call    GetDC           ; GetDeviceContext
                mov     hDC, eax        ; zwrocony uchwyt device context wybranego
                                        ; obszaru okna (edita z serialem)

                mov     dword_403000, 0 ; nXPos - wspolrzedna pionowa (horizontal)
                xor     ebx, ebx
        loc_4010F6:
                mov     dword_403004, 0 ; nYPos - wspolrzedna pozioma (vertical)
        loc_401100:
                push    dword_403004    ; nYPos
                push    dword_403000    ; nXPos
                push    hDC
                call    GetPixel        ; pobierz pixel (nXPos, nYPos)

                mov     dword ptr [dword_411639+ebx*4], eax     ; zapisz uchwyt

                inc     ebx             
                inc     dword_403004      ; nYPos+1
                cmp     dword_403004, 21  ; max nYPos == 21
                jnz     loc_401100        ; czy koniec przesuwanie w pionie
                inc     dword_403000      ; nYPos+1
                cmp     dword_403000, 233 ; max nXPos == 233
                jnz     loc_4010F6              

        Jak widac cos nowego, typowe zerwanie z klasycyzmem :). Pobieranie danych
        odbywa sie przez "zeskanownaie" tego co widac w edicie, cybernetycy beda
        tutaj szczegolnie zainteresowani ze wzgledu na analogie dzialanie osrodka
        wzroku czlowieka z tym co mamy powyzej :). Anyway, przeanalizujmy co tez
        ta procka robi. Najsamwpierw (dobre nie? ;) pobierany jest uchwyt edita z
        serialem, potem poprzez petle zostaje utworzona tablica pixeli bedaca wiernym
        obrazem tego co widac w obszarze prostokata o wymiarach 84x932x84x932. Na
        szczescie czworobok, gdyby bylo inaczej to tut by nie powstal raczej. By
        dac lepsze wyobrazenie o wspolrzednych wykorzystywanych przez GetPixel,
        zrobilem taka oto tabliczke, cyfra po lewej to 'x', po prawej 'y'.

        00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
        01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
        02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
        03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
        04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
        05 06 07 08 09 10 11 12 13 14 15 16 17 18 19
        06 07 08 09 10 11 12 13 14 15 16 17 18 19
        07 08 09 10 11 12 13 14 15 16 17 18 19
        08 09 10 11 12 13 14 15 16 17 18 19
        09 10 11 12 13 14 15 16 17 18 19

        Podobnie jak w ukladzie Kartezjusza (hi! ;]) z ta roznica, ze wszystko ma miejsce
        jedynie w czwartej cwiartce ukladu wsp. a wartosci maja znak dodatni,

                                        ^x
                                        |               +o uklad kartezjanski ;>
                                  II    |    I
                                        |
                             <----------+---------->    
                                        | *******  y
                                 III    | ** IV**
                                        | *******
                                        v
        
        W naszym przypadku wartosci przybiora wartosci kolejno od 0-21*4 i 0-233*4.
        Po prostu jest to taka sobie pixeloza, cos jak puzzle (newbies czytaja
        ten tutorial?). Wiesz juz o co chodzi, wyzej widniejaca procka czyta
        wszystkie pixele i wwala do talblicy za pomoca takiego algorytmu:

                x=dword
                y=dword

                mov     x, 0
          _X+1:
                mov     y, 0
          _Y+1:
                Pixel=(x,y)
                y+1
                cmp     y, 21
                jnz     _Y+1

                x+1
                Pixel=(x,y)
                cmp     x, 233
                jnz     _X+1
                
        Ok, (4893 iteracji*4) = 19572pikseli. Mamy wiec calkiem sporo bitmapke, by
        dowiedziec sie czegos wiecej proponuje zrobic krok do przodu i zobaczyc co
        program robi dalej,

                xor     ebx, ebx        ; zerowanie wskaznika (ptr)

        @@:
                mov     eax, dword ptr [dword_411639+ebx*4]     ; tutaj nasza tablica
                mov     edx, dword ptr [dword_40C9C1+ebx*4]     ; tablica z goodboy'em :)
                cmp     eax, edx        ; 
                jnz     loc_4011B5
                inc     ebx             ; ptr+1
                cmp     ebx, 4893       ; czy juz wszystkie piksele porownane?
                jnz     @B              ; jesli nie, to sprawdzaj dalej

                ...                     ; tutaj goodboy w postaci SetPixel party :)

        Skad to wszystko wiem? Bo jestem dobra firma :P. Hehe, mowiac powaznie..
        porownymane zostaja bajty, potem nastepuje odwrotna sytuacja do GetPixel
        bo drawowana zostaje informacja w zaleznosci od tego czy wpisany serial
        jest poprawny czy nie. A wiec istnieja 3 zakodowane bitmapy w crackme:

        - z badboyem
        - z goodboyem
        - z poprawnymi danymi rejestracyjnymi

        W crcme nie ma zadnej funkcji typu SetDlgItemTextA, wszystko co zostaje
        wyswietlane w edicie jest narysowane. Zeby cokolwiek narysowac trzeba
        miec jakies bajty reprezentujace bitmape. Okazuje sie, ze mamy wszystko,
        nawet goodboya. Co wiec stoi na przeszkodzie zeby podmienic tablice z
        danymi rejestracyjnymi w trakcie rysowania np. badboya? Nic, trzeba tylko
        umiec obsluzyc HIEW :). Manuala nie zalaczam, szkoda atramentu, na pewno
        sobie poradzisz, relatywne adresowanie to pestka ;). Aha, zaznaczam, ze
        mamy na to 'papiery' :), autor zewala na patch, cytuje tXt z ReadMe.txt:

        "MOZNA PATCHOWAC KOD, ale tylko poto by znalezc seriala."

        Yo feel the flow get bass of paradox! Ciekawy jestem wiec wyniku ;]

        +-----------------------------------------------------------------------+
        |               3WE4-rtp0-94DMJ-ii2589P-Z4P!3RD0L3-666k                 |
        +-----------------------------------------------------------------------+

        Ok, masz juz?? Ja mam.. lukz priti long :). No nic, przepisz sobie go lecz
        nie kopiuj, bitmape chcesz skopiowac?? :). Teraz wpisz go do edita i 
        zobacz co tam napisali,

        +-----------------------------------------------------------------------+
        |               GOOD CODE !!! NOw seNd thIS keY FoR mE                  |
        +-----------------------------------------------------------------------+

        No i zlamalismy crackme, MD0 rozwaloned, bo crypto nie zniese ;).

        Reasumujac, idea na crackme dosyc zabawna, w sumie kolejne crackme typu
        cmp x,y | jnz _costam, ale na jakiej przstrzeni pamieci! Gdyby dodac do
        tego troche modyfikacji bitmap wszystko nabraloby smaku reversingu, no a
        tak - latwo zrobic=latwo zlamac. Mimo tego crackme podobalo mi sie. Cos
        tez mnie napadlo (chyba milosc do wielkich tablic z dwordami :) i w pare
        minut zrekompilowalem crackme (powinno byc przy tym tucie). Apropos,
        jesli juz mowimy o drawowaniu.. SetPixelV jest o wiele szybszy anizeli
        zastosowany przez Zenka Jajko (Ty sie tak serio nazywasz??) SetPixel :).


        pozdrawiam tomkola, kwaska, witka g, cyberboba, shielda, tnb!, virsa, hintusa.

        16 sierpnia 2002

        cybult
        cybult@poczta.onet.pl
