?<<<<<<<<<<<<+====================== Crackme 2 by ToMKoL =============================+>>>>>>>>>>>

Co : Crackme 2 by ToMKoL
Skad: www.acg.silesianet.pl 
Czym: Soft ICE 4.xx
Kto : ja :) (slonik)

******************************************** TUT ************************************************
Uruchamiamy Crackme (u mnie sie uruchomilo, bo mam zainstalowanego IcePatcha. U Ciebie moze sie
nie uruchomic !! Nalezy wtedy sciagnac IcePatcha => http://protools.cjb.net lub FrogIce'a tez
z ww. strony. Oczywiscie moznaby sprobowac zlamac AntySI, ale nie trzeba ) i wpisujemu cos do 
okna, ja wpisalem 214365, nastepnie zastawiamy pulapke na hmemcpy:
bpx hmemcpy
W przypadku zalozenia pulapki na getdlgitemtexta pojawi nam sie mily napisik, ze "No BPX allowed"
tak wiec odpuscimy to sobie i zalozmy na hmemcpy. Dobra, teraz klikamy na "OK!!!".
Dusimy F11 oraz kilka razy F12. Na ekranie powinienes zobaczyc cos takiego:

015F:004010EA  685D214000          PUSH      0040215D                ; nasz serial !!!
015F:004010EF  68B90B0000          PUSH      00000BB9                
015F:004010F4  FF7508              PUSH      DWORD PTR [EBP+08]
015F:004010F7  E807020000          CALL      USER32!GetDlgItemTextA
015F:004010FC  83F80F              CMP       EAX,0F                  ; male porownanko :)
015F:004010FF  0F85B4000000        JNZ       004011B9                ; jezeli nie to unreg.


Z tego wynika, ze nasz serial musi miec DOKLADNIE 15 znakow, gdyz w przeciwnym wypadku nastapi
skok i niezarejestrujemy tego crackme !!! Jak sie zapewne domyslacie musimy zmienic dlugosc seriala. Teraz wpisujemy np. 102938475612345 i postepujemy tak, jak na poczatku.	
Teraz powyzszy skok nie nastapil i mozemy przejsc do dalszego analizowania kodu.

015F:00401105  BF5D214000          MOV       EDI,0040215D     ; do EDI idzie nasz serial
015F:0040110A  33C9                XOR       ECX,ECX          ; zerowanie ECX
015F:0040110C  33C0                XOR       EAX,EAX          ; zerowanie EAX   
015F:0040110E  FEC1                INC       CL               ; zwiekszanie CL 
015F:00401110  80C10F              ADD       CL,0F            ; dodawanie do niego 0f
015F:00401113  300F                XOR       [EDI],CL         ; 1-szy znak seriala XOR z CL
015F:00401115  FEC1                INC       CL               ; zwiekszanie CL
015F:00401117  40                  INC       EAX              ; i EAX
015F:00401118  47                  INC       EDI              ; i EDI, aby wskazywalo na nastepny
							      ; znak naszego seriala
015F:00401119  83F80F              CMP       EAX,0F           ; czy EAX ma wartosc 0Fh
015F:0040111C  75F2                JNZ       00401110         ; jak nie to skok do petelki

Czas na mala analize :) Na poczatku do EDI ida znaki z naszego seriala. Nastepnie jest zerowanie dwoch rejestrow ( ECX i EAX ). Skoro ECX zostalo wyzerowane, to INC CL spowoduje dodanie do ECX
1, czyli ECX=1, ale tylko za pierwszym razem !!! Pozniej do CL dodawane jest 0Fh, czyli ECX=10h
ale znowu tylko za pierwszym razem !!! Potem nastepuje XORowanie pierwszego znaku z 10h TYLKO 
ZA PIERWSZYM RAZEM, gdyz w nastepnej linijce CL jest znowu zwiekszane o 1. Potem do EAX jest zwiekszane o 1 i EDI takze, aby wszkazywalo na nastepny znak seriala. Kolejna instrukcja to porownanie EAX z 0F ( skoro po kazdej operacji na kolejnym znaku seriala EAX jest zwiekszane o 1 to gdy EAX osiagnie watrosc 0F bedzie to oznaczalo, ze operacje na wszystkich znakach zostaly wykonane !! ), po niej nastepuje porownaie EAX z 0Fh - jezlei nie jest rowne, to skok, aby wykonywac operacje na kolejnych znakach. 
Zauwaz, ze za pierwszym razem nasz 1 znak jest XORowany z 10h, drugi znak z 20h, 3 znak z 30h... 10 znak z A0h, 11 znak z B0h... 15 znak z F0h !!!

015F:0040111E  33C9                XOR       ECX,ECX          ; zerowanie ECX
015F:00401120  33DB                XOR       EBX,EBX          ; i EBX
015F:00401122  BF5D214000          MOV       EDI,0040215D     ; wynik powyzszych operacji na
                                                              ; naszym serialu spowrotem do EDI
015F:00401127  8A5F0E              MOV       BL,[EDI+0E]      ; ostatni znak seriala do BL
                                                              ; !!! liczymy od 0 !!!  
015F:0040112A  03CB                ADD       ECX,EBX          ; a stamtad do ECX
015F:0040112C  8A5F0D              MOV       BL,[EDI+0D]      ; 14 znak do BL
015F:0040112F  03CB                ADD       ECX,EBX          ; i znowu do ECX
015F:00401131  8A5F0C              MOV       BL,[EDI+0C]       ; W tych linijkach sa dodawane 
015F:00401134  03CB                ADD       ECX,EBX           ; do ECX kolejne znaki z naszego 
015F:00401136  8A5F0B              MOV       BL,[EDI+0B]       ; seriala. Wiadomo 0C to bedzie
015F:00401139  03CB                ADD       ECX,EBX           ; 13 znak, 0B to 12, a 0A to 11ty
015F:0040113B  8A5F0A              MOV       BL,[EDI+0A]       ; W BL anajduje sie tylko aktualny
015F:0040113E  03CB                ADD       ECX,EBX           ; znak, nie sa one sumowane !!!!!
015F:00401140  C1C102              ROL       ECX,02           ; obrot ECX o 2 w lewo => ECX*4
015F:00401143  81F1780B0000        XOR       ECX,00000B78     ; XORowanie ECX z 00000B78
015F:00401149  83F900              CMP       ECX,00           ; jezeli 0 to idziemy dalej
015F:0040114C  756B                JNZ       004011B9         ; jezeli nie to unregistered :(

Dobra, zajmijmy sie na razie analiza powyzszego fragmentu kodu, reszta pozniej :)
Tu widzimy, ze poszczegolne znaki z naszego seriala ( juz przerobione przez procedurke wyzej )
sa ladowane do BL, a nastepnie kopiowane do ECX. Pozniej nastepuje obrot o 2 na bitach z rejestru
ECX ( ROL ECX, 02 => ECX*4 ) na koncu otwzymana wartosc jest XORowana z 00000B78 jezeli w wyniku 
XORowania w ECX jest 0, to mozemy dalej isc, jezeli nie to... to niedobrze :)
Zastanowmy sie jak to wszystko odwrocic. Myslimy... myslimy... myslimy... i wreszczcie wpadamy na pomysl, jak to wszystko odwrocic :)
Zauwaz, ze ECX bedzie mialo 0, jezeli przed operacja XORowania bedzie wynosilo tyle, ile wartosc z ktora jest XORowany. W tym wypadku musi to byc 00000B78. W czesniej jest jeszcze instrukcja ROL, ktora jest rownoznaczna z mnozeniem przez potege dwojki, np. ROL ECX, 02 jest rownoznaczne 
z mozeniem ECX przez 4 ( 2 do potegi 2 = 4 ). Ale my to chcemy to odwrocic, wiec musimy 00000B78
podzielic przez 4. W SI robimy to tak :
? 00000B78/4
Wynikiem jest 2DEh, czyli 734d. Skoro ECX ma wynosic 2DEh, a do tego rejestru poszczegolne znaki sa dodawane to suma 5 ostatnich znakow ma wynosic wlasnie 2DEh. Tak wiec szukamy znaki ktore po dodaniu dadza 2DEh, aby bylo latwiej, najlepiej poszukac te znaki w decymalu : 2DEh = 734d.
Ja sobie wybralem : 150d, 150d, 150d, 150d, 134d
Czyli :              96h,  96h,  96h,  96h,  86h
Siedzisz teraz przed tym tutorem i myslisz "A po co byla ta procedura na poczatku, ktora costam robila ze wszystkimi znakami z naszego seriala ?" Jezeli tak myslisz, to dobrze :) Jak pamietasz
tamta procka XORowala kazdy znak z odpowiednia wartoscia ( 1 znak XOR 10h, 2 znak XOR 20h, 3 znak
XOR 30h.... 14 znak XOR E0h, 15 znak XOR F0h ). Jezlei teraz chcemy, aby nasze powyzsze 5 znakow
bylo dobre, to musimy odwrocic tamto XORowanie !!! Jak to zrobic ? Bardzo prosto, jezeli wiemy, ze 15 znak jest XORowany z F0h, 14 z D0h... 11 z B0h to wystarczy nasze znaki zXORowac z tymi wartosciami. W SI :
? 96^F0       ; 102d
? 96^E0       ; 118d     
? 96^D0       ; 70d
? 96^C0       ; 86d
? 86^B0       ; 54d

Wyniki pisalem w dziesietnym systemie, poniewaz, by je wprowadzic bedziesz potrzebowal ALTA i klawiszy numerycznych ( no w tym przypadku, to akurat nie, ale moze pozniej... )
Teraz juz wiemy, ze 5 ostatnich znakow to : 54d, 86d, 70d, 118d, 102d  KONIECZNIE w tej kolejnosci, poniewaz jeseli je wpiszesz w innej, to beda XORowane z "nieswoimi" wartosciami, co
nie da po pozniejszym dodaniu 2DEh !!!!!

015F:0040114E  33C9                XOR       ECX,ECX
015F:00401150  33DB                XOR       EBX,EBX
015F:00401152  8A5F09              MOV       BL,[EDI+09]
015F:00401155  03CB                ADD       ECX,EBX
015F:00401157  8A5F08              MOV       BL,[EDI+08]
015F:0040115A  03CB                ADD       ECX,EBX
015F:0040115C  8A5F07              MOV       BL,[EDI+07]
015F:0040115F  03CB                ADD       ECX,EBX
015F:00401161  8A5F06              MOV       BL,[EDI+06]
015F:00401164  03CB                ADD       ECX,EBX
015F:00401166  8A5F05              MOV       BL,[EDI+05]
015F:00401169  03CB                ADD       ECX,EBX
015F:0040116B  C1C102              ROL       ECX,02
015F:0040116E  81F1180C0000        XOR       ECX,00000C18
015F:00401174  83F900              CMP       ECX,00
015F:00401177  7540                JNZ       004011B9
015F:00401179  33C9                XOR       ECX,ECX
015F:0040117B  33DB                XOR       EBX,EBX
015F:0040117D  8A5F04              MOV       BL,[EDI+04]
015F:00401180  03CB                ADD       ECX,EBX
015F:00401182  8A5F03              MOV       BL,[EDI+03]
015F:00401185  03CB                ADD       ECX,EBX
015F:00401187  8A5F02              MOV       BL,[EDI+02]
015F:0040118A  03CB                ADD       ECX,EBX
015F:0040118C  8A5F01              MOV       BL,[EDI+01]
015F:0040118F  03CB                ADD       ECX,EBX
015F:00401191  8A1F                MOV       BL,[EDI]
015F:00401193  03CB                ADD       ECX,EBX
015F:00401195  C1C102              ROL       ECX,02
015F:00401198  81F198050000        XOR       ECX,00000598
015F:0040119E  83F900              CMP       ECX,00
015F:004011A1  7516                JNZ       004011B9
015F:004011A3  6A00                PUSH      00
015F:004011A5  680B204000          PUSH      0040200B    ; registered
015F:004011AA  6823204000          PUSH      00402023
015F:004011AF  FF7508              PUSH      DWORD PTR [EBP+08]
015F:004011B2  E85E010000          CALL      USER32!MessageBoxA
015F:004011B7  EB54                JMP       0040120D

Napisalem, ze analiza reszty fragmentu pozniej, zle juz mi sie nie chce :). Wszystko juz zostalo wyjasnione wyzej, nic sie wlasciwie nie zmienia oprocz tego, ze w nastepnych przypadkach rejestr
ECX jest XORowany z innymi wartosciami. Nie opisywalem rowniez fragmentu kodu powyzej, ale tu znowu wszystko sie powtarza. Mam nadzieje, ze sobie poradzisz...


Jeden z poprawnych kodow ( gdzyz kodow speniajacych zalozenia w tym Crackme jest baaaaaaaardzo duzo ) : 43d,96d,80d,32d,123d,40d,93d,105d,114d,102d,54d,86d,70d,118d,102d

UWAGA !! Wszystki powyzsze liczby sa w systemie dziesietnym. Aby je wpisac wystarczy wcisnac lewy ALT i na klawiaturze numerycznej wystukac odpowiednia kombinacje !!!
  



~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Greetzy i takie tam:
 
WIELKIE THX dla smoli => dzieki jego odpowiedziom na moje liiiiiczneeee pytania nauczylem sie
czegos i ten tutor powstal :)

Reszta THX goes to:
CrackPL, Cookiecrk, AAOCG, 7team, ACG...

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Wszelkie uwagi i spostrzezenia jezeli musicie to piszcie na adres :

slonik1@go2.pl