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

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

   Tut name   : CrackMe2 by massh^CookieCrk (easy)
   Date       : 09 May 2000
   Writed by  : Jube
   What       : How to find correct serial

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-t u t o r i a l-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Na poczatku musze zaznaczyc ze jest to raczej tutorial dla newbies.
Jezeli nie jestes poczatkujacy to mozesz najpierw sam sprobowac rozwalic
to crackme i dopiero w razie problemow skorzystac z tego tutoriala.

No dobra, zaczynamy! :)

Bedzie nam potrzebne kilka rzeczy:
1. Crackme2 by massh - dolaczone do tutoriala na stronie: 
   http://www.cookiecrk.z.pl/ 
2. SoftIce - ja mam wersje 4.00 ale moze byc inna
   http://www.crackpltools.prv.pl/
3. Mozg :) i ochote do czytania 

Ok! Gdy juz mamy wszystkie narzedzia mozemy zabrac sie ostro do pracy :).
SoftIce musi byc zaladowany. Uruchamiamy naszego crackme i widzimy ze trzeba
wpisac User i Serial. Czyli wpisujemy swoje imie i jakis kod. Ja wpisalem

User  : Jube
Serial: 1234567

Dobra, teraz uruchamiamy SI (CTRL-D),zakladamy breakpointa na GetWindowTextA:

:bpx GetWindowTextA

I opuszczamy SI (F5). Naciskamy OK i jestesmy z powrotem. teraz mozemy zbadac
kod programu:

:004011FD 6A1F                    push 0000001F
:004011FF 6804214000              push 00402104
:00401204 FF354C204000            push dword ptr [0040204C]
:0040120A E81C020000              Call GetWindowTextA
:0040120F 85C0                    test eax, eax			<-tu ladujemy
:00401211 744D                    je 00401260
:00401213 A360204000              mov dword ptr [00402060], eax
:00401218 6A1F                    push 0000001F
:0040121A 6824214000              push 00402124
:0040121F FF3550204000            push dword ptr [00402050]
:00401225 E801020000              Call GetWindowTextA
:0040122A 85C0                    test eax, eax
:0040122C 7432                    je 00401260
:0040122E A364204000              mov dword ptr [00402064], eax
:00401233 6844214000              push 00402144
:00401238 6A00                    push 00000000
:0040123A 6A0C                    push 0000000C
:0040123C FF354C204000            push dword ptr [0040204C]
:00401242 E802020000              Call SendMessageA
:00401247 6844214000              push 00402144
:0040124C 6A00                    push 00000000
:0040124E 6A0C                    push 0000000C
:00401250 FF3550204000            push dword ptr [00402050]
:00401256 E8EE010000              Call SendMessageA
:0040125B B801000000              mov eax, 00000001
:00401260 C3                      ret

Po kazdym wywolaniu funkcji GetWindowTextA sprawdzana jest wartosc EAX, ktora
zawiera dlugosc pobranego ciagu znakow. Jezeli EAX=0 to skok do 00401260
czyli powrot z funkcji. Czyli opuszcza funkcje a w EAX mamy 0. Jezeli jednak
dlugosc naszych danych jest > 0 czyli cos wpisalismy, a tak jest w naszym
przypadku to dlugosc User jest wrzucana pod adres 00402060, a dlugosc Serial
pod 00402064. Funckje SendMessgeA sluza do skasowania wpisanych przez nas
danych. Podobnie jak w CrackMe1 (patrz moj poprzedni tutorial). To jest malo
wazne. Po tych funkcjach do EAX wrzucana jest wartosc 1 i nastepuje wyjscie
z funkcji. Czyli podsumowujac : Jezeli jakies pole zostawimy puste to funkcja
zwroci 0 w EAX, jezeli wpiszemy cos do obydwu pol to w EAX bedzie 1.
Teraz przechodzimy (F10) przez poszczegolne instrukcje az do ret. Po ktorej
wyskakujemy z funkcji i widzimy:

:0040116A E880000000              call 004011EF	<-stad wyszlismy
:0040116F 85C0                    test eax, eax	<-
:00401171 742F                    je 004011A2	<-wracamy do CrackMe
:00401173 6824214000              push 00402124	<-offset Sriala
:00401178 6804214000              push 00402104	<-offset User
:0040117D E8DF000000              call 00401261 
:00401182 85C0                    test eax, eax
:00401184 7407                    je 0040118D	<-jezeli eax=0 to zly serial

Jezeli nasza funkcja zwroci 0 (brakuje jakis danych) to program nic nie robi
i znowu mozemy wpisywac dane. My jednak wpisalismy wszystko co trzeba wiec
EAX=1 i przechodzimy dalej. Teraz na stos sa odkladane adresy do wpisanych
przez nas danych, po czym wywolana jest funkcja sprawdzajaca poprawnosc
seriala. Jezeli wynikiem funkcji (EAX) bedzie 0 to znaczy, ze serial jest zly
i skok zostanie wykonany. Wchodzimy wiec do tej funkcji (F8) i ladujemy tu:

:00401261 A160204000              mov eax, dword ptr [00402060]
:00401266 390564204000            cmp dword ptr [00402064], eax
:0040126C 752F                    jne 0040129D
:0040126E 33C0                    xor eax, eax
:00401270 8B7C2404                mov edi, dword ptr [esp+04]
:00401274 8B742408                mov esi, dword ptr [esp+08]
################################################# poczatek petli
:00401278 0FB61F                  movzx ebx, byte ptr [edi]
:0040127B 0FB616                  movzx edx, byte ptr [esi]
:0040127E 80FA30                  cmp dl, 30
:00401281 7C1A                    jl 0040129D
:00401283 80FA39                  cmp dl, 39
:00401286 7F15                    jg 0040129D
:00401288 80EA30                  sub dl, 30
:0040128B 83E30F                  and ebx, 0000000F
:0040128E D0EB                    shr bl, 1
:00401290 2ADA                    sub bl, dl
:00401292 7509                    jne 0040129D
:00401294 47                      inc edi
:00401295 46                      inc esi
:00401296 803F00                  cmp byte ptr [edi], 00
:00401299 75DD                    jne 00401278
################################################# koniec petli
:0040129B EB04                    jmp 004012A1
:0040129D 33C0                    xor eax, eax
:0040129F EB05                    jmp 004012A6
:004012A1 B801000000              mov eax, 00000001
:004012A6 C3                      ret

Najpierw do eax jest wrzucana wartosc z adresu 00402060 czyli dlugosc naszego
imienia. Nastepnie wartosc ta jest porywnywana z ta spod adresu 00402064
czyli z dlugoscia seriala. Jezeli nie sa rowne to nastepuje skok do 0040129D.
Tam wartosc eax jest zerowana. Pozniej nastepuje skok do 004012A6. Tam jest
wyjscie z funkcji. W EAX mamy 0 czyli serial jest zly. Tak wiec dlugosci
User i Serial musza byc identyczne. Kasujemy nasze breakpointy
:bc *
Ustawiamy breakpointa na miejsce porownania
:bpx 0040126C
Wychodzimy z SI (F5) i wpisujemy dane o takiej samej dlugosci. Czyli 'Jube'
i '1234'. Naciskamy OK i jestesmy przy porowaniu. Tym razem wartosci sa
jednakowe wiec skok nie nastepuje.
Do EDI wrzucany jest adres Usera a do ESI adres Seriala. Nastepnie
do BL wrzucana jest pierwsza litera Usera a do DL pierwszy znak Seriala.
Teraz sprawdzane jest czy DL to cyfra i jezeli tak to odejmuje sie od niej
30h w ten sposob w DL mamy wartosc liczbowa pierwszej cyfry. Jezeli znak
nie jest cyfra to zly serial. W naszym przypadku jest dobry. 
Dalej sa modyfikacje BL czyli pierwszy znak User.
	and ebx, 0000000F
	shr bl, 1
And jest operatorem logicznym. Nie bede tu objasnial o co chodzi bo nie to
jest celem tego tutoriala. Nastepnie BL jest "przesuniete" w prawo o 1. Aby
zrozumiec ta operacje nalezy zamienic sobie wartosc BL na system dwojkowy.
Ok, teraz od BL odejmowane jest DL i jezeli wynik jest rozny to zly serial.
Tak wiec jezeli wezmiemy 'J' i wykonamy te dwie instukcje to otrzymamy w BL
liczbe 5 i to jest wlasnie pierwszy znak naszego Seriala. Analogicznie
postepujemy z wszystkimi znakami naszego imienia.

Aby zaoszczedzic sobie czasu jest prosta metoda na sprawdzenie calego seriala
Wiec tak: 

Dochodzimy (przy pomocy F10) do 0040128E jezeli nacisniemy teraz F10 to
mozemy popatrzec u gory (w SI) na wartosc BL - to jest znak naszego seriala.
Spisujemy jako pierwszy znak. Teraz bedac na skoku warunkowym wykonujemy
takie polecenie:
:r fl z
dzieki czemu zmieniamy flage Z i skok nie zostanie wykonany pomimo tego ze
znak jest zly. Przechodzimy przez petle i mamy drugi znak i tak dalej...

Dla usera Jube (czyli dla mnie) serial to 5212.
Mam nadzieje ze po tym tutorialu z latwosca znajdziesz wlasciwy
serial dla siebie. A moze zrobisz nawet keygena co jest w tym przypadku
banalnie proste :)


To juz koniec :) Mam nadzieje ze jeszcze sie spotkamy :)
Jezeli czytasz ten tutorial napisz do mnie zebym wiedzial, ze moja praca
nie idzie na marne. Wszystkie uwagi ------> jube2@poczta.onet.pl

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-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 : mNICH, Plastek, Maxibogas, massh
     groups : CrackPL, AAOCG, CookieCrk

  My e-mail: jube2@poczta.onet.pl
             ~~~~~~~~~~~~~~~~~~~~
  SeveN TeaM - Official WebPage:  http://www.7team.z.pl
                                  ~~~~~~~~~~~~~~~~~~~~~
-=-=-=E-O-F=-=-=-=E-O-F=-=-=-=E-O-F=-=-=-=E-O-F=-=-=-=E-O-F=-=-=-=E-O-F=-=-=-