                                                 ..:!!!!!:.
                                           .:!!!!!!!~~~!!!!!!
                                       .!!!~~`            !!!
                                   .<!!~`                :!!
                                 <!~`                   !~
                             .:!~
                           <!!~
                         !!!~             .'` !
                       <!!`              f  :~
                     !!!~              > ~!`:
                   :!!!       .!     .!   .!!
                  !!!~      '!!      !!   !!!           ..
                 !!!>       '!!      !    '!>         .!` `:
               !!!!>       '!.:<    !    '!         <~ :!:.
                !!!!!:.   .!!!~~     !    '!  !!:   !>:!    !
                 `~~!~~` '! '!   .::<!!~~`'!  !!!:  ! !     `
                          `!!!~~`    >    '>  !! ! !>'!
                             !       >    !   !  ~.! '!     ~>
                             !       >    !  <~  '!!  !     !>
                                          !  ~   '!!  `!,,,,f
                                                        `~~'                                     
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=AbouT PrograM=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    What       : Crackme 3.0 by tEo` [CHInc.]
    Target     : Reg code / Patch
    Date       : 16/05/2001
    Cracked by : Creeper^

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
Narzedzia : 
-SoftIce 4.00
-Hiew

Przedwczoraj probowalem zlamac wlasnie to crackme przy wlaczonym TV i jeszcze do tego bylem
cholernie spiacy,ale cos mnie napadlo wiec sie do niego wzialem. Zalaczylem Disassemblera
dlatego,ze myslalem,ze zapewne znowu znajdzie sie jakis antisi. Znalazlem GetDlgItemTextA
no wiec crackmek sie tutaj bedzie na nia lapal... Dalej bylo co nie co kodu,wiec widac
bylo od razu,ze crackmek na poczatku sprawdza jakies durne stringi... Ale opisze to wszystko
od poczatku tak jak dla Newbie. Wlaczylem crackme i ku mojemu zdziwieniu nie bylo tam zadnego ANTI-SI :) Widze,ze trza tam wpisac registration code,no wiec od razu wpisalem jakies bzdety : 987654321. Wszedlem do SI (CTRL+D) i zastawilem pulapke na GetDlgItemTextA : bpx etdlgitemtexta Wyszedlem z SoftIce (F5) i clicknalem na Check it. Jestesmy w SoftIce. Teraz wciskamy F11 aby
znalesc sie w miejscu skad ta funkcja API zostala wywolana (GetDlgItemTextA) i jestesmy w kodzie
crackme. Widzimy :

 Reference To: USER32.GetDlgItemTextA, Ord:0102h
                                  |
:004010F2 E84B030000              Call 00401442
:004010F7 85C0                    test eax, eax    <<< Czy wpisalismy cos ?
:004010F9 0F8400020000            je 004012FF      <<< Jesli nie to wypad.
:004010FF 8B0D18304000            mov ecx, dword ptr [00403018] <<< Do Ecx trafiaja 4 pierwsze chary
:00401105 8B1500304000            mov edx, dword ptr [00403000] <<< Do Edx trafiaja jakies 4 chary.
:0040110B 3BCA                    cmp ecx, edx  <<< Zwykle porownanie,czyli nasze 4 chary z jakimis tam innymi
:0040110D 0F84DE010000            je 004012F1   <<< Jesli sa rowne to skaczemy (tutaj jest haczyk)
:00401113 8B0D1B304000            mov ecx, dword ptr [0040301B]
:00401119 8B1503304000            mov edx, dword ptr [00403003]
:0040111F 3BCA                    cmp ecx, edx
:00401121 0F84CA010000            je 004012F1
:00401127 8B0D1F304000            mov ecx, dword ptr [0040301F]
:0040112D 8B1507304000            mov edx, dword ptr [00403007]
:00401133 3BCA                    cmp ecx, edx
:00401135 0F84B6010000            je 004012F1
:0040113B EB07                    jmp 00401144

Przechodzimy przez kolejne linie F10 a wchodzimy w Calle F8.
Ok,nastepne miejsca az do 00401135 to dokladnie to samo. Jesli teraz zmienimy nasze dane
w crackmeku z tymi co crackmek je porownuje to bedzie wywalony msgbox o tym ze to illegal serial.
Tutaj jest taki haczyk. Jesli jednak nie zmienimy naszych danych to wszystko bedzie ok i jedziemy
dalej. Trafiamy do 0040113B i skaczemy. Skoczylismy teraz do miejsca 00401144 i oto one:

00401144	CALL 004011D5 <<< Wchodzimy do tego CALL`a (F8) bo wydaje sie podejrzany.

Teraz widzimy nastepujacy kawalek kodu w SI:

:004011D5 83F005                  xor eax, 00000005  (1)
:004011D8 05606F4574              add eax, 74456F60  (2)
:004011DD 3D716F4574              cmp eax, 74456F71  (3)
:004011E2 0F8517010000            jne 004012FF       (4)
:004011E8 EB07                    jmp 004011F1       (5)

Najpierw zobaczymy co jest w eax. U mnie 00000009 czyli dlugosc naszego code.W (1)
ta dlugosc jest xorowana z 05h pozniej dodawane jest 74456F60H i porownywane jest to wszystko
z 74456F41. Jesli sie nie zgadzaja (4) to wypad do zlego seriala,w przeciwnym wypadq lecimy dalej
No dobra,ale jak uzyskac teraz prawidlowa wartosc tzn prawidlowa dlugosc naszego seriala ?
To proste! Odwrocimy to wszystko od konca.

(74456F41h-74456F60) XOR 5 = Nasza poprawna dlugosc Reg code.
Wpisujemy wiec w SoftIce : ?(74456F71-74456F60)^5    -   Mi wyszlo 14H ('^' to xorowanie).
Teraz 14H=20D czyli dlugosc naszego reg code ma byc rowna 20 znakow. Wychodzimy z crackmeka
(f5) i na nowo wpisujemy jakis 20 znakowy code np : "9876543210abcdefghij". Teraz robimy
wszystko to co robilismy przed chwilka i dochodzimy do naszej procki. Przechodzimy (F10)
przez 004011D5 az do 00401E2 i widzimy ze nie robimy skoku bo EAX=74456F71. Super,wiec skaczemy
dalej do 004011F1 i widzimy nastepnego CALL`a : 

004011F1	CALL 004012A1

Wchodzimy do niego znowu (F8) i widzimy :

:004012A1 A118304000              mov eax, dword ptr [00403018]
:004012A6 8B1D1C304000            mov ebx, dword ptr [0040301C]
:004012AC 8B0D20304000            mov ecx, dword ptr [00403020]
:004012B2 33C3                    xor eax, ebx
:004012B4 33D8                    xor ebx, eax
:004012B6 05ADDE0000              add eax, 0000DEAD
:004012BB 81C3FECA0000            add ebx, 0000CAFE
:004012C1 81C1AD0B0000            add ecx, 00000BAD
:004012C7 3DC8510419              cmp eax, 190451C8
:004012CC 7531                    jne 004012FF
:004012CE 81FB340F3652            cmp ebx, 52360F34
:004012D4 7529                    jne 004012FF
:004012D6 81F9E2384333            cmp ecx, 334338E2
:004012DC 7521                    jne 004012FF
:004012DE E969FEFFFF              jmp 0040114C

No i tu sie zaczynaly kredki. Dlaczego? Zaraz dojdziemy. Teraz w linii 1 do eax
trafiaja 4 znaki naszego seriala, do ebx trafiaja kolejne 4 znaki i do ecx znowu 4 nast. znaki.

Teraz jesli wpiszesz : ? eax widzimy : 
36373839	0909588537	"6789"  <<< Tutaj sa nasze 4 pierwsze znaki tyle ze odwrocone.
  HEX		   DEC	         ASCII

Tak to sie niestety zapisuje :(( Dobra. Teraz w 004012B2 xorowane sa 4 pierwsze z 4 nastepnymi 
znakami i wynik idzie do eax. Nastepnie ebx jest xorowane z eax i wynik idzie do ebx.
Nastepnie do eax:=eax+0000DEAD,ebx:=ebx+0000CAFE i ECX:=ECX+00000BAD. Nastepnie EAX jest
porownywane z 190451C8 i skok jesli nie rowne do bad boy,ebx jest porownywane z 52360F34 i
ten sam skok i nastepnie ecx jest porownywane z 334338E2 i znowu skok. W ostatniej linii jest
ten prawidlowy skok ktory musimy wykonac aby byl nasz dobry serial. Jak to odwrocic?
Jak juz mowilem mialem wlaczony TV i bylem ospaly i nie zauwazylem ze pod 004012BB jest add EBX
i ja myslalem ze jest tam EAX. i znowy w 004012C1 myslalem ze jest eax zamiast ECX. Probowalem
wymyslac jakies sensowne znaki aby wszystko wyszlo ok i nic mi nie wychodzilo. Po pol godziny
sobie po prostu odpuscilem! W nastepny dzien czyli wczoraj znowu siadlem zaraz po szkole do
crackmeka i zauwazylem roznice! Heh,pomyslalem jakie proste :) Ja sobie cala sytuacje 
przedstawilem tak :

Zeby po dodaniu do eax DEAD musi wyjsc wartosc 190451C8 wiec odwroce to i bede mial poprawna 
wartosc do otrzymania z xorowania,wiec : 190451C8-DEAD=1903731B Taka wartosc bede musial otrzymac
Ale to w sumie nie jest klucz do sukcesu,bo jak bedziesz szukal takich znakow ASCII zeby
po zxorowaniu z nastepnymi znakami dalo te 1903731B to nie wyjda ci pozniej te porownania z
nastepnymi wartosciami. Skaplem sie dopiero po wyszukaniu znakow z pierwszego xorowania...No,bo
mowilem ze caly czas myslalem ze to do eax jest zawsze cos dodawane ;). No wiec ja pierw postaralem
sie wyszukac prawidlowych znakow ktore sa jako ostatnie sprawdzane czyli te porownywane z 
334338E2. Tak wiec widzimy,ze do naszych znakow dodawana jest wartosc BADH no wiec zeby otrzymac
prawidlowa wartosc tzn znaki odwracamy to i wpisujemy w SI : ? 334338E2-bad=3C-5
Czyli zamiast znakow : 10ab wpisujemy juz : nie,nie 3C-5 tylko 5-C3 bo to odwrotna kolejnosc!
Teraz zajmiemy sie tymi 4 pierwszymi charami i 4 nastepnymi. Jak znalesc poprawne znaki?
Przypominam o tym kawalku kodu :

:004012B2 33C3                    xor eax, ebx
:004012B4 33D8                    xor ebx, eax
:004012B6 05ADDE0000              add eax, 0000DEAD
:004012BB 81C3FECA0000            add ebx, 0000CAFE
:004012C1 81C1AD0B0000            add ecx, 00000BAD
:004012C7 3DC8510419              cmp eax, 190451C8
:004012CC 7531                    jne 004012FF
:004012CE 81FB340F3652            cmp ebx, 52360F34
:004012D4 7529                    jne 004012FF

Nie mozemy wyliczac tego co bedzie w eax jako pierwsze dlatego,ze jak bedziemy teraz probowac
to odwrocic : 190451C8-dead=1903731B i co nam to daje? Jakies dziwne znaki... Skad teraz
wezniesz znaki ktore podpasuja ci do 2 porownania czyli wartosci w ebx z 52360F34 jak nigdy
ci nie podpasuja :) Ja sie skaplem i zrobilem tak : Popatrzalem na cmp ebx,52360F34 i pomyslalem,
ze jak odwroce cala procke wyliczajaca ta wartosc w ebx to wyjdzia mi 4 drugie znaki,a pozniej
tylko te 4 znaki przexoruje z 1903731B i wyjda mi te 4 pierwsze poprawne znaki. Wiec odwracamy :

? 52360F34-CAFE='R5D6' czyli 6D5R. To nasze znaki. Teraz te odwrocone R5D6 czyli 6D5R xorujemy 
z 1903731B czyli:

? '6D5R'^1903731B='K67-' i odwracamy : -76K Teraz nasz kod wyglada juz nastepujaca :

6D5R-76K5-C3 <<- Wyglada juz bardziej zgodnie z jakims Reg Code. Teraz spelniamy wszystkie 
warunki i jedzemy dalej tzn wykonujemy nastepny Jump do 0040114C. Widzimy : JMP 00401155
i wykonujemy skok do : 

00401155		CALL	004011FD

Wchodzimy do CALL`a i widzimy znowu :

:004011FD A124304000              mov eax, dword ptr [00403024]
:00401202 8B1D28304000            mov ebx, dword ptr [00403028]
:00401208 33C3                    xor eax, ebx
:0040120A 05606F4574              add eax, 74456F60
:0040120F 81EB606F4574            sub ebx, 74456F60
:00401215 3D60E0A874              cmp eax, 74A8E060
:0040121A 0F85DF000000            jne 004012FF
:00401220 81FBE8D908CF            cmp ebx, CF08D9E8
:00401226 0F85D3000000            jne 004012FF
:0040122C E9B2000000              jmp 004012E3

Do eax ida 4 przed ostatnie znaki a do ebx ida 4 ostatnie znaki. Jak widac znowu jest to
xorowanie i do eax dodaje sie 74456F60 a od ebx odejmuje sie 74456F60. Pozniej eax jest 
porownywane z 74A8E060 a ebx jest porownywane z CF08D9E8. Jak myslisz,jak to bedziemy odwracac?
Tak samo jak poprzednio. Najpierw EBX : ?cf08d9e8+74456F60='CNIH' i odwracamy : HINC
Teraz poprzednie 4 chary. Jak juz wiadomo,po zxorowaniu eax z 'HINC' i dodaniu 74456F60 ma wyjsc
74A8E060. Zapiszmy to matematycznie : (x^'HINC')+74456F60=74A8E060. Odwrocmy to wiec :

? 74A8E060-74456F60^'HINC'='C-8H' i odwracamy : H8-C No i teraz 8 ostatnich znakow to :

H8-CHINC i dolaczamy przed tym poprzednie znaki ktore wyliczylismy no i mamy :

				**********************
				*6D5R-76K5-C3H8-CHINC*
				**********************

Wylaczamy wszystkie pulapki : bc * wychodzimy z SI (F5) i wpisujemy dane do crackmeka.
"Thank You for registering :-)"

To by bylo na tyle. Teraz zpatchujemy sobie crackmeka tak,aby dzialal na kazdy reg code.
Zaczniemy od miejsca w ktorym crackmek sprawdzal dlugosc name czyli :

:004011D5 83F005                  xor eax, 00000005  
:004011D8 05606F4574              add eax, 74456F60  
:004011DD 3D716F4574              cmp eax, 74456F71  
:004011E2 0F8517010000            jne 004012FF       (1)
:004011E8 EB07                    jmp 004011F1       

(1) nas najbardziej interesuje. Pamietamy,ze jesli dlugosci sie nie zgadzaja,to wykonujemy skok
JNE a my tego nie chcemy. Musimy przejsc dalej. Wiec zrobmy tak,ze nie bedzie tam zadnego JNE
tylko zeby crackmek przeszedl sobie do nastepnej linii. Mozna to zrobic na najoczywistszy
sposob : wyNOPowac ten skok :) Po prostu nie bedzie zadnego porownania i przejdziemy dalej.
Musisz jeszcze zwrocic uwage na opkody tej instrukcji : 0F8517010000 Wiadomo,ze rozdziela
sie to na bajty a wiec : 0F 85 17 01 00 00 I teraz ladnie widac ze jest tu 6 bbajtow wiec z
tego wniosek ze musimy wstawic tez 6 bajtow. NOP ma opkod 90 wiec wstawimy szesc 90
Wchodzimy do HIEW i znajdujemy "crackm~1" bo to dosowski edytor :) Teraz wciskamy ENTER i widzimy 
wszystko jako ASCII. Teraz jeszcze 2 razy wciskamy ENTER,zeby widziec kod crackmeka w postaci 
zdisassemblowanej i musimy wyszukac adres jumpa ktorego chcemy zpatchowac. W naszym przypadku 
jest to 004011E2. Wiec wciskamy F5 i wpisujemy .004011E2 <- Dlaczego "." na koncu to opisywalem 
to w moim tutku o adresach.Teraz jak mamy to miejsce to wcisamy F3 zeby edytowac i wpisujemy
szesc razy 90. Teraz kod bedzie wygladal nastepujaca :

:004011E2 90            NOP
:004011E3 90            NOP
:004011E4 90            NOP
:004011E5 90            NOP
:004011E6 90            NOP
:004011E7 90            NOP
:004011E8 EB07          jmp 004011F1       
Dobra,teraz mozemy isc dalej. Jak pamietamy pozniej bylo to cholerne xorowanie znakow :

:004012A1 A118304000              mov eax, dword ptr [00403018]
:004012A6 8B1D1C304000            mov ebx, dword ptr [0040301C]
:004012AC 8B0D20304000            mov ecx, dword ptr [00403020]
:004012B2 33C3                    xor eax, ebx
:004012B4 33D8                    xor ebx, eax
:004012B6 05ADDE0000              add eax, 0000DEAD
:004012BB 81C3FECA0000            add ebx, 0000CAFE
:004012C1 81C1AD0B0000            add ecx, 00000BAD
:004012C7 3DC8510419              cmp eax, 190451C8
:004012CC 7531                    jne 004012FF
:004012CE 81FB340F3652            cmp ebx, 52360F34
:004012D4 7529                    jne 004012FF
:004012D6 81F9E2384333            cmp ecx, 334338E2
:004012DC 7521                    jne 004012FF
:004012DE E969FEFFFF              jmp 0040114C

Teraz znowu bedziemy nopowac wszystkie te jumpy spisujac ich adres a wiec :
004012CC,004012D4 i 004012DC - Tu bedziemy patchowac. Uwaga! Ja to zrobilem tak :
W miejsce ADD ecx,bad wcisnalem XOR EAX,EAX czyli eax zawsze sie bedzie rownalo 0.Teraz w 
miejsce CMP EAX,190451c8 wlozylem CMP EAX,0 i wszystko bedzie gralo.Skok sie nigdy nie wykona.
A w 2 miejsce skoku wynopowalem JNE czyli wpisalem 2 NOP`y dlatego ze JNE ma 2 bajty a nastepnie
w miejsce 3 skoq tez wynopowalem JNE i lecimy dalej! :) Nopujac pierwszego JNE u mnie crackmek
sie sypal,wiec zrobilem to odrobinke ladniej,czyli tak,zeby sie nie sypal ;) Pamietamy ostatnie
porownania :

:004011FD A124304000              mov eax, dword ptr [00403024]
:00401202 8B1D28304000            mov ebx, dword ptr [00403028]
:00401208 33C3                    xor eax, ebx
:0040120A 05606F4574              add eax, 74456F60
:0040120F 81EB606F4574            sub ebx, 74456F60
:00401215 3D60E0A874              cmp eax, 74A8E060
:0040121A 0F85DF000000            jne 004012FF
:00401220 81FBE8D908CF            cmp ebx, CF08D9E8
:00401226 0F85D3000000            jne 004012FF
:0040122C E9B2000000              jmp 004012E3

Ja pomyslalem tak : Jak zaczne nopowac wszystko to wszystko bedzie ok ;) No i tak zrobilem ;)
Btw posprawdzalem jeszcze inne rozwiazanie tzn z podmienianiem cmp na jmp w miejsce z dobrym 
jumpem itd itd ale crackmek sie sypal wiec jednak nop okazal sie niezawodny ;P
Nopojemy od miejsca : 00401215 az po 00401226. 0040122C juz nie nopujemy bo to nasz dobry skok.
Zachowujemy zmiany.Odpalamy crackmeka i wszystko gra!

Teraz w nagrode idziemy na PIVO ;) 


P.S.
Jesli nie wierzysz ze tak to wszystko zrobilem,to wraz z tutkiem zalaczylem zpatchowanego 
crackmeka o nazwie "PATCHED.EXE"

Creeper^

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-InfO=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

    Greetz: tEo` , Smola^Cp & Coxoc ;)

    My E-mail: creepy@poland.com

    CHInc. web page: www.chinc.prv.pl


=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=MemberS=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

          Ma-rYu-sH..............Founder, Cracker, Coder, Writer, Net
          combain..........Senior Member, Cracker, Coder, Writer, Net
          ner..............Senior Member, Cracker, Coder, Writer, Net
          Exe.....................Member, Cracker, Coder, Writer, Net
          eax_.........................Member, Cracker, Coder, Writer
          _ShAwN_......................Member, Cracker, Coder, Writer
          Creeper^.....................Member, Cracker, Coder, Writer
          PanteraX......................Senior Member, Cracker, Coder
          oles`.........................Honor Member, Cracker , Coder
          iceman`.............................Member, Cracker, Writer
          |_lord_|.............................Member, Coder, Graphic
          MaxiBogas...................................Member, Cracker
          deuter......................................Member, Cracker
          Zielman.......................................Member, Coder
          Pokropek.......................................Member,Coder
          cRG^............................................Trial Coder
          Dj.aRaB 2oo.........................................Graphic
          WesMar................................................Trial
          Zoomek................................................Trial
          ^tEo^.................................................Trial