                     _______                   ______
                     |   _   |-----.--.--.-----.   _  \
                     |   1___|  -__|  |  |  -__|.  |   |
                     |____   |_____|\___/|_____|.  |   |
                     |:  1   |                 |:  |   |
                     |::.. . | POLISH CRACKERS |::.|   |
                     `---===='__             __`-==_---'
                        |       |-----.---.-.   Y   |
                        |.|   | |  -__|  _  |.      |
                        `-|.  |-'_____|___._|. \_/  |
                          |:  |             |:  |   |
                          |::.|             |::.|:. |
                          `---'             `--- ---'

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=i n f o r m a t i o n s-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

   prog name   : Crackme 1.0 by JW /SIGMA - skill ???
   Date        : 09.06.2000
   Writen by   : plastek
   What        : tut ;)

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-t u t o r i al-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
.386p
.model tlusty
include crackme3.zip
includelib skrakuj.t0

Slowo_wstepu 	proc
Dzisiaj zajmiemy sie kolejnym crackme, tym razem nie bedzie to crackme Jube (bo cos nie chce mu sie pisac ;)), ale crackme groopki SIGMA, ktore uprawnia do wstapienia w jej szeregi.
Pewnie chcecie wiedziec dlaczego pisze txt tylko do crackme'siow.
Po I-e nie lamie w ten sposob prawa ;) tylko crackme :).
Po II-e wiekszosc programow chowa sie za nimi daleko w tyle w dziedzinie zabezpieczen (akurat nie mowie o tym crackme, ale inne sa trudniejsze :)).
Po III-e dolaczam je do tuta i nie ma prabliema ze znalezieniem odpowiedniego progsa.
Chcielybiscie tez wiedziec zapewne, dlaczego tego tuta nie napisal MaxiBogas.
Po prostu to crackme stoi na duzo wyzszym poziomie (choc i tak na niskim :)) niz poprzednie dwa do ktorych napisal tuty Maxi.
Jesli myslisz, ze  po przeczytaniu tego txt i wygenerowaniu wlasnej rejestracji przyjma cie do SIGMY to jmp EXIT, bo oni po wypuszczeniu tego tuta zmienia crackme na nowe (lepsze???). Jesli czytasz po to zeby sie ksztalcic to

ret
Slowo_wstepu 	endp

Dobra koniec pier**** zaczynamy zabawe :).
Na poczatek niezbedniki:

.DATA
1. Crackme 1.0 by JW - jezeli masz starsza wersje to moze byc, ale nie bylo starszej wersji :).
2. SoftICE x.xx - prawdziwi krakersi korzystaja tylko z tego.
3. W32dasm x.xx - taki sobie disasemblerek do skromnych zastosowan.
4. Troche mozgu - moze byc cielecy, ale nie oczekuj po nim zbyt wiele.
5. Duza dobra piwa - najlepiej Lech Premium Sport (ups krypto-reklama).

.CODE
Start:
Mamy juz zapewne odzipowanego crackmisia, jesli nie radze przeczytac poprzednie moje tuty.
Przeczytales tez juz txt dolaczony do crackme. TAK???. Jesli tak to jestes lama bo tam zadnego txt nie bylo.
Odpalamy crackme i juz na wstepie widzimy, ze sie pojawia msgbox z title "Crackme nieskrakowane" i info, ze mamy wygenerowac seriala dla naszego nika itd. Szkoda tylko, ze nie ma gdzie wpisac tego seriala :(. Zastanowmy sie jak moze byc pobrany kod.... (w tym momencie kraker mysli pijac piwo - przypis autora). Wiem, ze i tak nic nie wymyslisz, wiec odpalamy w32dasm i deasemblujemy, jesli nie wiesz jak zdeasemblowac plik odsylam do poprzednich tutow. Po zdeasemblowaniu otwieramy String Data... i szukamy czegos zwiazanego z rejestracja :). Oczywiscie widzimy ten string "Crackme nieskrakowane". Klikamy na nim dwukrotnie i ladujemy tutaj:

:00401141 8A9028404000            mov dl, byte ptr [eax+00404028]
:00401147 32D1                    xor dl, cl
:00401149 889028404000            mov byte ptr [eax+00404028], dl
:0040114F 48                      dec eax
:00401150 79EF                    jns 00401141
:00401152 E8A9FEFFFF              call 00401000
:00401157 85C0                    test eax, eax
:00401159 7518                    jne 00401173				;good/bad
:0040115B 6A10                    push 00000010

* Possible StringData Ref from Data Obj ->"Crackme nieskrakowane"
                                  |
:0040115D 685C414000              push 0040415C

Widzimy wiec ze call pod adresem 401152 ma decydujace znaczenie, czyli wchodzimy w niego:

:00401000 53                      push ebx
:00401001 56                      push esi
:00401002 6A00                    push 00000000
:00401004 6880000000              push 00000080
:00401009 6A03                    push 00000003
:0040100B 6A00                    push 00000000
:0040100D 6A01                    push 00000001
:0040100F 6800000080              push 80000000

* Possible StringData Ref from Data Obj ->"RJS@JTK"
                                  |
:00401014 6828404000              push 00404028		;tu jest ten string "RJS...

* Reference To: KERNEL32.CreateFileA, Ord:0031h
                                  |
:00401019 FF15D4704000            Call dword ptr [004070D4]
:0040101F 83F8FF                  cmp eax, FFFFFFFF
:00401022 A3FC654000              mov dword ptr [004065FC], eax
:00401027 7505                    jne 0040102E
:00401029 33C0                    xor eax, eax
:0040102B 5E                      pop esi
:0040102C 5B                      pop ebx
:0040102D C3                      ret

Hmm (Hmm=w tym momencie kraker mysli pijac piwo - przypis autora).
Otwierany jest plik o jakiejs zboczonej nazwie zapisanej pod adresem 00404028. Ale co to??? po odpaleniu filemona okazuje sie, ze zaden plik nie jest otwierany. Dziwne, Hmm.
Ale wydaje sie, ze ten adres 404028 juz gdzies widzielismy, chyba tutaj:

* Referenced by a CALL at Address:
|:004012DA   
:00401130 8B44240C                mov eax, dword ptr [esp+0C]		;do eax cos ze stosu
:00401134 8A08                    mov cl, byte ptr [eax]		;do cl pierwszy bajt eax
:00401136 B809000000              mov eax, 00000009			
:0040113B 880D20404000            mov byte ptr [00404020], cl	
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00401150(C)
|
:00401141 8A9028404000            mov dl, byte ptr [eax+00404028]	;kolejne znaki nazwy
:00401147 32D1                    xor dl, cl				;xorowane z...
:00401149 889028404000            mov byte ptr [eax+00404028], dl	;i z powrotem zapisywane
:0040114F 48                      dec eax
:00401150 79EF                    jns 00401141
:00401152 E8A9FEFFFF              call 00401000				;a tu i nasz call :)

No tak, czyli nie jest bezposrednio otwierany plik o tej zboczonej nazwie, tylko najpierw jego nazwa (zboczona) jest xorowana z... no wlasnie czym???.
Hmm.
Zastawiamy bpx na getcommandlinea i odpalamy crackme, lapie sie na bpx wiec F12 i wracamy do kodu
* Reference To: KERNEL32.GetCommandLineA, Ord:00AAh
                                  |
:0040121B FF15E8704000            Call dword ptr [004070E8]	;to jest wlasnie getcomman...
:00401221 A3F0694000              mov dword ptr [004069F0], eax	;a tu zwrocona wartosc trafia pod
adres 4069F0, proponuje bpm 4069F0, zlapie nam sie tu:
:00401234 A1F0694000              mov eax, dword ptr [004069F0]
:00401239 85C0                    test eax, eax
:0040123B 750A                    jne 00401247

ale to nas nie interesuje, wiec dajemy F5 aby kontynuowac i ladujemy tu:

:00401256 8B35F0694000            mov esi, dword ptr [004069F0]
:0040125C 89759C                  mov dword ptr [ebp-64], esi
:0040125F 803E22                  cmp byte ptr [esi], 22
:00401262 0F85BE000000            jne 00401326
:00401268 46                      inc esi
:00401269 89759C                  mov dword ptr [ebp-64], esi
:0040126C 8A06                    mov al, byte ptr [esi]
:0040126E 3C22                    cmp al, 22
:00401270 741C                    je 0040128E
:00401272 84C0                    test al, al
:00401274 7418                    je 0040128E
:00401276 25FF000000              and eax, 000000FF
:0040127B 50                      push eax
:0040127C E86F040000              call 004016F0
:00401281 83C404                  add esp, 00000004
:00401284 85C0                    test eax, eax
:00401286 74E0                    je 00401268
:00401288 46                      inc esi
:00401289 89759C                  mov dword ptr [ebp-64], esi
:0040128C EBDA                    jmp 00401268

Ta procka ma na celu wyciagniecie parametru podanego przy uruchamianiu programu
[...] (to jest skrot - przypis autora)
W tym momencie pod ESI mamy adres wskazujacy na parametr z ktorym bylo uruchomione crackme

:004012CD 50                      push eax		;tu jest cos na stos kladzione
:004012CE 56                      push esi		;a tu adres parametru
:004012CF 6A00                    push 00000000		;niewazne
:004012D1 6A00                    push 00000000		;niewazne
* Reference To: KERNEL32.GetModuleHandleA, Ord:00FEh                                  |
:004012D3 FF15E0704000            Call dword ptr [004070E0]
:004012D9 50                      push eax		;i tu jeszcze cos pushowane
:004012DA E851FEFFFF              call 00401130		;a tu nasze xorowanie

wiec wrocimy jeszcze raz pod 401130 (ile jeszcze???):

|:004012DA   
:00401130 8B44240C                mov eax, dword ptr [esp+0C]		;do eax cos ze stosu
:00401134 8A08                    mov cl, byte ptr [eax]		;do cl pierwszy bajt eax
:00401136 B809000000              mov eax, 00000009			
:0040113B 880D20404000            mov byte ptr [00404020], cl		;WAZNE!!!
Teraz juz wiemy ze ze stosu jest pobierany wskaznik na parametry i nasz string jest xorowany z pierwszym znakiem parametru :). Pdoejrzyjmy jeszcze pod Hexeditem nasz plik i poszukajmy tego zboczonego stringu. Okazuje sie, ze plik o tej nazwie nie moze byc utworzony gdyz nasz string oprocz RJS@JTK ma jeszcze znaki o kodach 0F i 11, a tego system nie przelknie.
Hmm, z jakim parametrem odpalic crackme aby dalo sie utworzyc plik o normalnej nazwie???.
Pomyslmy normalny plik ma rozszerzenie trzy- lub dwuznakowe. Czyli trzeci lub czwartu znak od konca po zxorowaniu z czyms ma dac nam . (kropke czyli 2E hex). Poniewaz trzeci znak od konca ma wartosc 0F wiec 
? 0F^2E=21 hex (bo xorowanie jest odwracalne)
teraz zxorujmy cztery ostanie znaki naszego stringu z liczba 21212121 (cztery 21)
? 4B0F5511^21212121='j.t0' -ciekawe ,wiec zxorujmy kolejne cztery znaki
? 53404a54^21212121='raku' i kolejne znaki (ostanie dwa)
? 524A^2121='sk'
I teraz polaczmy to sk+raku+j.t0=skrakuj.t0 i to jest wlasciwa nazwa pliku :), a parametrem do uruchomienia bedzie 21 hex czyli ! (wykrzyknik).
Tworzymy wiec skrot do programu i w lini polecen wpisujemy mu ! po nazwie pliku. Tworzymy tez plik o nazwie skrakuj.t0 (dowolna zawartosc) i odpalamy program.
Dochodzimy az do miejsca gdzie tworzony jest plik (tym razem udanie):

* Reference To: KERNEL32.CreateFileA, Ord:0031h
:00401019 FF15D4704000            Call dword ptr [004070D4]
:0040101F 83F8FF                  cmp eax, FFFFFFFF
:00401022 A3FC654000              mov dword ptr [004065FC], eax
:00401027 7505                    jne 0040102E			;bad/good u nas good :)
[...]
:0040102E 6A00                    push 00000000
:00401030 50                      push eax
* Reference To: KERNEL32.GetFileSize, Ord:00EDh			;pobranie rozmiaru pliku
:00401031 FF15D0704000            Call dword ptr [004070D0]	;i 
:00401037 0FBE0D20404000          movsx ecx, byte ptr [00404020];porownanie z naszym parametrem
:0040103E 3BC1                    cmp eax, ecx			;ktory jest zapisany pod 404020
:00401040 A3F0654000              mov dword ptr [004065F0], eax ;jesli nie rowne to bad
:00401045 7405                    je 0040104C			;tu kolejny bad/good
[...]
nasz plik musi miec rozmiar rowny naszemu parametrowi uruchomieniowemu :), czyli 33 bajty (bo 21hex = 33d). Odpowiednio modyfikujemy nasz plik i znow odpalamy. Przechodzimy teraz tego jmp'a i dochodzimy tu:

* Reference To: KERNEL32.ReadFile, Ord:01D6h			;czyli odczyt pliku
:00401070 FF150C714000            Call dword ptr [0040710C]	
[...]
:00401093 8A1C10                  mov bl, byte ptr [eax+edx]
:00401096 8BF0                    mov esi, eax
:00401098 32CB                    xor cl, bl
:0040109A 48                      dec eax
:0040109B 85F6                    test esi, esi
:0040109D 880D00664000            mov byte ptr [00406600], cl
:004010A3 A3F4654000              mov dword ptr [004065F4], eax
:004010A8 75E9                    jne 00401093
:004010AA 3A0D20404000            cmp cl, byte ptr [00404020]
:004010B0 7405                    je 004010B7			;kolejny bad/good
[...]
Ta procka xoruje wszystkie znaki zawartosci naszego keyfile'a i sprawdza czy wynik tego dzialania jest rowny parametrowi (czyli 21). To na razie zostawimy. Czyli zmieniamy flage (r fl z) i do rejestru cl pakujemy 21 (r cl=21).

:004010B7 80C102                  add cl, 02			;21+2=23
:004010BA B804000000              mov eax, 00000004		
:004010BF FEC1                    inc cl			;23+1=24
:004010C1 880D00664000            mov byte ptr [00406600], cl	;w EDX wskaznik na zawartosc 
:004010C7 8A5A04                  mov bl, byte ptr [edx+04]	;pliku a EDX+4 to wskaznik na
:004010CA 32D9                    xor bl, cl			;piaty znak 
:004010CC 885A04                  mov byte ptr [edx+04], bl
:004010CF 8B0DF8654000            mov ecx, dword ptr [004065F8]
:004010D5 8A5104                  mov dl, byte ptr [ecx+04]
:004010D8 84D2                    test dl, dl
:004010DA 741C                    je 004010F8
Piaty znak naszego seriala jest xorowany z 24, ale jesli jest on rowny 24 (czyli $) to bedzie zle 
:(.

:004010DC 8A1500664000            mov dl, byte ptr [00406600]	;do dl 24
:004010E2 8A5C0801                mov bl, byte ptr [eax+ecx+01]	;do bl kolejne znaki
:004010E6 40                      inc eax
:004010E7 32DA                    xor bl, dl
:004010E9 881C08                  mov byte ptr [eax+ecx], bl    ;po zxorowaniu zapis z powrotem
:004010EC 8B0DF8654000            mov ecx, dword ptr [004065F8]
:004010F2 803C0800                cmp byte ptr [eax+ecx], 00	;jesli po zxorowaniu mamy wynik 0
:004010F6 75E4                    jne 004010DC			;to wyjscie z tej procki
kolejne znaki sa xorowane z 24, przy czym przedostani znak naszego keyfile musi byc rowny 24 (!). Dlaczego??? bo 24 po zxorowaniu z 24 da nam 0 i opuscimy procedurke, w przeciwnym wypadku program, jesli nie znajedzie 24 zxoruje cala pamiec az sie zbiesi :).Dlaczego nie ostatni znak???. A to zaraz sie okaze :).
W kolejnej procedurce sa dokonywane operacje na znaku kolejnym po !, ja opisze obliczenia dla ! zapisanego jako przedostatniego, a X zapisanego jako ostatniego (X=niewiadomy).

:004010F8 8A1520404000            mov dl, byte ptr [00404020]	;do dl 21 
:004010FE 8A5C0801                mov bl, byte ptr [eax+ecx+01] ;do bl kolejny znak seriala
:00401102 40                      inc eax			;jesli byl do ostatni znak to
:00401103 32DA                    xor bl, dl			;eax teraz=20, zxorowanie
:00401105 881C08                  mov byte ptr [eax+ecx], bl	;i zapisanie z powrotem
:00401108 8B0DF8654000            mov ecx, dword ptr [004065F8] ;
:0040110E 83E806                  sub eax, 00000006		;20-6=1a
:00401111 0FBE540806              movsx edx, byte ptr [eax+ecx+06] ;odczytanie tego co zxorowane
:00401116 3BD0                    cmp edx, eax			;i porownanie z eax (1a)
:00401118 7405                    je 0040111F			;good/bad
[...]
czyli ten znak seriala ktory jest po ! (zakladajac ze jest on ostatni) zxorowany z 21 daje nam liczbe ktora ma byc rowna 1A.
? 1A^21=3B=; (srednik)
czyli ostatni znak to srednik, dopisujemy wiec do naszego pliku jako przedostani znak ! a jako ostatni ;.

:0040111F 83C104                  add ecx, 00000004
:00401122 5E                      pop esi
:00401123 890D24404000            mov dword ptr [00404024], ecx
:00401129 B801000000              mov eax, 00000001
:0040112E 5B                      pop ebx
:0040112F C3                      ret
Po wyjsciu z tej procki eax=1 czyli ominiemy msgbox informujacy o nieskrakowaniu i wyswietli msgbox o udaniu sie :) (BTW wcale nam sie nie udalo tylko zapracowalismy na to).
Ok ale w title msgboxa sa jakies dziwne krzaki - jest to nasz serial poczawszy od piatego znaku.
Chcemy zeby wyswietlal nam cos w stylu 'Zarejestrowane dla plastka ', wiec robimy tak, wpisujemy ten string w nasz keyfile (od piatego znaku zaczynajac) i odpalamy crackme, ktore nam zxoruje wszystko tak jak trzeba (zeby sie nie meczyc), spisujemy wszystkie znaki jakie nam wyjda po zxorowaniu tego stringa z 24 i wpisujemy je do keyfile (od piatego znaku).
Albo xorujemy recznie :) :
? 'Zare'^24242424='AVE~' (ale piszemy na odwrot)->'~EVA'
? 'jest'^24242424='PWAN' -> 'NAWP'
? 'rowa'^24242424='ESKV' -> 'VKSE'
? 'ne d'^24242424='@',04(to kod hex),'AJ' -> 'JA',04,'@'
? 'la p'^24242424='T' 04,'EH' -> 'HE',04,'T'
? 'last'^24242424='PWEH' -> 'HEWP'
? 'ka '^242424=04,'EO' -> 'OE',04 (ta spacja na koncu jest dla odpowiedniej liczby znakow)
i wpisujemy to wszystko do keyfile pamietajac aby zaczac od 5 znaku, jako przedostatni dac ! i ostatni ;.

Ok mamy juz to, wiec pozostaje sprawa tych pierwszych czterech znakow. Wrocmy do tego miejsca:
:00401093 8A1C10                  mov bl, byte ptr [eax+edx]
:00401096 8BF0                    mov esi, eax
:00401098 32CB                    xor cl, bl
:0040109A 48                      dec eax
:0040109B 85F6                    test esi, esi
:0040109D 880D00664000            mov byte ptr [00406600], cl
:004010A3 A3F4654000              mov dword ptr [004065F4], eax
:004010A8 75E9                    jne 00401093
:004010AA 3A0D20404000            cmp cl, byte ptr [00404020]
:004010B0 7405                    je 004010B7			;kolejny bad/good
[...]
Tu, jak stwierdzilem wczesniej, znaki naszego seriala sa xorowane przez siebie i w wyniku tego musimy miec 21. Ja jako pierwsze cztery znaki wpisalem 1111 (pozostale znacie), wiec sprawdzmy ile nam brakuje do 21 (si rulez). Ok u mnie ecx=26. Hmm jak to ustawic zeby bylo 21.
? 26^31=17 (31 to 1 czyli otrzymalem wynik przed xorowaniem z pierwszym znakiem)
teraz
? 17^21=36 (po zxorowaniu z 21 otrzymalem liczbe 36, ktora po zxorowaniu z z 17 da nam 21 i bedzie ok). Wiec zmieniamy pierwszy znak seriala na 36 (czyli 6). Hehe poszlo!!!!
No i to juz koniec roboty, jesli nie wypiles calego piwa (ja juz dwa) to mozesz teraz dopic z czystym sumieniem bo jestes czlonkiem SIGMY (o ile nie zrobili nowego crackme). Pamietaj o tym ze crackme uruchamiamy z parametrem ! (ten wykrzyknik to zarowno paramter, jaki i podkreslenie tego, ze uruchamiamy z parametrem, w ten sposob zaoszczedzilem jeden znak :)).

BTW. Im prostsze crackme tym wiecej txt pisze. Dziwne :(. Ale mysle ze teraz nikt nie bedzie mial problemu ze zlamaniem tego programiku.

EXIT:
jmp to HELL
End Start
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=members of SeveN TeaM-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  Prezident:      MaxiBogas...........................founder/coder/cracker
  VizePrezident:  Plastek.............................founder/coder/cracker
  Seniors:
                  pawlos............................................cracker
                  Mr. Ketchup.......................................cracker 
                  Rusty.............................................cracker
  Division:
                  Jube........................................cracker/coder
                  {ATOM}....................................decoder/cracker
                  jamman............................................cracker
  Trial:
                  Pokropek..........................................cracker
                  lukasw............................................cracker
                  Dumboo............................................cracker
                  zoomek.....................................writer/cracker
  WebPage:
                  LIAR..............................webmaster/graphic/coder
                  _2000_.......................................server_admin

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-o t h e r s-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

  Greets to : Cys, mNICH, smola, Mietor, _r00t_, Liquid^, AraKuS
     groups : CrackPL, AAOCG, CookieCrk

  My e-mail: marbardi@alpha.net.pl
             ~~~~~~~~~~~~~~~~~~~~~
  SeveN TeaM - Official WebPage:  http://www.7team.z.pl
                                  ~~~~~~~~~~~~~~~~~~~~~
-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-=-=-=E-O-T=-