====================================================================
$								   $
$		      TuToriaL by Tymon				   $
$		            What:				   $
$		     Crackme 2 by #EmEs@			   $
$								   $
====================================================================

.AboUt

Dochodzimy wiec do ostatniego (jak narazie) crackme by #EmEs@ // AAOCG.
To crackme jest najlepsze, poniewaz jest troche niestandardowe.
Tego typu zabezpieczenia widzialem tylko w 2 progach. To nie zmienia
faktu, ze crackMe jest bardzo proste, wiec na poczatku sprobuj oczywiscie
sam. Jak sie nie uda to czytaj dalej.

Tools: SoftIce, W32Dasm or IDA, Hex editor, Resource Builder

.StarT

Otwieramy crackme. Hmm ... Gdzies widzielismy podobne okienko gloszace:

 "Unload SoftIce Debugger and Try Again!!!"

Otwieramy wiec proga w W32Dasm'ie i ogladamy tabele importow.

KERNEL32.ExitProcess
KERNEL32.GetModuleHandleA
KERNEL32.SetUnhandledExceptionFilter   <-- hmm... ANTY-SI ???
USER32.DialogBoxParamA
USER32.GetDesktopWindow
USER32.GetWindowRect
USER32.IsDlgButtonChecked
USER32.LoadIconA
USER32.MessageBoxA
USER32.MoveWindow
USER32.SendMessageA
USER32.SetFocus

Widzimy api SetUnhandledExceptionFilter. kliknijmy na niego 2 razy by
zobaczyc co robi:

* Referenced by a CALL at Address:
|:00401000   						<-- wywolane z Entry Point
|
:00401248 892500304000            mov dword ptr [00403000], esp
:0040124E 6877124000              push 00401277

* Reference To: KERNEL32.SetUnhandledExceptionFilter, Ord:026Ah
                                  |
:00401253 E884000000              Call 004012DC
:00401258 A304304000              mov dword ptr [00403004], eax
:0040125D B443                    mov ah, 43			(0)
:0040125F CD68                    int 68			(1) <-- hmm...
:00401261 50                      push eax			(2)
:00401262 FF3504304000            push dword ptr [00403004]

* Reference To: KERNEL32.SetUnhandledExceptionFilter, Ord:026Ah     <-- hmm...
                                  |
:00401268 E86F000000              Call 004012DC
:0040126D 58                      pop eax			(3)
:0040126E 3D86F30000              cmp eax, 0000F386	      	    <-- hmm...
:00401273 7409                    je 0040127E
:00401275 EB22                    jmp 00401299
:00401277 8B2500304000            mov esp, dword ptr [00403000]
:0040127D C3                      ret

Mamy tutaj ANTY-SI. A wiec jezeli po wywolani Api, SetUnhandledExceptionFilter wykonamy
przerwanie 68 (int 68), z ah == 43 (0) to ( jezeli SoftIce jest w pamieci ) przerwanie
zwroci w eax F386.  Jezeli w eax, zostanie zwrocona inna wartosc to program
przejdzie do instrukcji zapisanej pod offsetem podanym w Push'u nad wywolaniem Api.
Oczywiscie chodzi o pierwsze wywolanie, drugie jest dla picu. Zobacz, po lini (1)
w eax mamy F386 ( SI jest w pamieci ), a w nastepnej wartosc ta kladziona jest na stos.
Ta sama wartosc zdejmowana jest dopiero przed sprawdzeniem (3). Co zrobic by to ominac?
Mozemy zmienic sprawdzenie, by porownywalo z inna wartoscia. Zmieniamy wiec w progu
3D86F30000 ( cmp eax, F386 ) na, np. 3D86F40000 ( cmp eax, F486 ). Oki, teraz crackme
ladnie sie uruchamia. Jest ono troche inne niz pozostale crkme. Nie ma tu zadnego
pola edycji, ale sa checkbox'y. Mozna chyba to tak nazwac. Teraz tylko na jakie
API mozna zlapac sprawdzenie? Zobacz jeszcze raz tabele importow i pomysl... tak
masz racje to:

USER32.IsDlgButtonChecked

Zakladamy wiec bpx na to Api, zaznaczamy jakies box'y i wciskamy 'Crack It'.
Widzimy:

0167:00401126  33DB                XOR       EBX,EBX			(0)
0167:00401128  6A67                PUSH      67                         (1)         
0167:0040112A  FF7508              PUSH      DWORD PTR [EBP+08]         (2)        
0167:0040112D  E87A010000          CALL      USER32!IsDlgButtonChecked  (3)        
0167:00401132  6683F801            CMP       AX,01                      (4)        
0167:00401136  0F85AB000000        JNZ       004011E7                   (5)

I tu pojawia sie pierwszy problem. Zobacz postac tego API:

Push	ID_CHECKBOXA
Push	UCHWYT_OKNA
Call    IsDlgButtonChecked

W eax zwracane jest 1 jezeli checkbox jest zaznaczony. I tutaj jest maly problem.
Skad mamy wiedziec do ktorego checkboxa mamy odniesienie? Juz mowie, po ID.
Nasuwa sie nastepne pytanie, skad wiem, jaki checkbox ma jakie ID. Do tego
bedzie wlasnie potrzebny Resource Builder. Pokarze on nam resource pliku,
czyli sam uklad okienek, bez ich obslugi. Po wejsciu do RB wciskamy Plik --> Import
i wybieramy nasze crackme. W otworzonym okienku przenosimy na druga strone
pozycje 5 z menu Dialog. Oki, rozwijamy teraz pozycj Dialog i dla 5 wybieramy
edit z podrecznego menu. Mozemy teraz odczytac z Properties ID dla dowolnego
obiektu. My czytamy ID dla checbox'ow. Mozna to rozrysowac tak:

	-------------------------
	| 103 | 104 | 105 | 106 |
	-------------------------
	| 107 | 108 | 109 | 110 |
	-------------------------

Oczywiscie odpowiednie pola oznaczaja checbox'y, a numery to ID danego checkbox'a.
Zobaczmy jeszcze raz:

0167:00401126  33DB                XOR       EBX,EBX			(0)
0167:00401128  6A67                PUSH      67                         (1) <-- ID Checbox'a 
0167:0040112A  FF7508              PUSH      DWORD PTR [EBP+08]         (2)        
0167:0040112D  E87A010000          CALL      USER32!IsDlgButtonChecked  (3)        
0167:00401132  6683F801            CMP       AX,01                      (4)        
0167:00401136  0F85AB000000        JNZ       004011E7                   (5)

Liczby w SoftIce sa pokazywane w systemie szesnastkowym, wiec 67h = 103d. Wynika
z tego, ze Api dotyczy 1 u gory checkbox'a. Zobaczmy co sie stanie, gdy nie
bedzie on zaznaczony:

0167:004011DF  83C301              ADD       EBX,01                             
0167:004011E2  C1C302              ROL       EBX,02                             
0167:004011E5  86FB                XCHG      BH,BL                              
0167:004011E7  81FB3751D310        CMP       EBX,10D35137                       
0167:004011ED  741D                JZ        0040120C           <-- good girl ;-)                  
0167:004011EF  7502                JNZ       004011F3		<-- bad boy

Mieli on troche ebx i sprawdza czy rowna sie 10D35137. Ebx zostalo zxorowane
przed wywolaniem Api. Po przerobieniu go nie wynosi on jednak 10D35137, dlatego
skaczemy pod adres 004011F3, czyli zobaczymy okienko z napisem 'Incorrect'.
O czym to swiadczy. Oczywiscie - pierszy checbox musi byc zaznaczony. Wtedy zostana
wykonane instrukcje:

0167:0040113C  BB02000000          MOV       EBX,00000002                       
0167:00401141  03D8                ADD       EBX,EAX                            
0167:00401143  81C373456D45        ADD       EBX,456D4573                       
0167:00401149  86FB                XCHG      BH,BL                              

oraz nastepne wykonanie Api'sa:

0167:0040114B  6A6B                PUSH      6B         <-- 107, czyli 5'ty checkbox                        
0167:0040114D  FF7508              PUSH      DWORD PTR [EBP+08]                 
0167:00401150  E857010000          CALL      USER32!IsDlgButtonChecked          
0167:00401155  6683F801            CMP       AX,01                              
0167:00401159  0F8588000000        JNZ       004011E7                           
0167:0040115F  81C310101010        ADD       EBX,10101010                       
0167:00401165  86DF                XCHG      BL,BH                              

Ten checkbox musi byc takze zaznaczony, poniewaz skaczac pod 004011E7 (ax = 0)
ebx po instrukcjach ADD, ROL, XCHG nie da wartosci 10D35137. Dalej:

0167:00401167  6A6D                PUSH      6D         <-- 109, czyli 7 checkbox                      
0167:00401169  FF7508              PUSH      DWORD PTR [EBP+08]                 
0167:0040116C  E83B010000          CALL      USER32!IsDlgButtonChecked          
0167:00401171  6683F801            CMP       AX,01                              
0167:00401175  7570                JNZ       004011E7                           
0167:00401177  83C322              ADD       EBX,22                             
0167:0040117A  83C024              ADD       EAX,24                             
0167:0040117D  33D8                XOR       EBX,EAX                            
                             
Tutaj tez musi byc nacisniety checkbox.

0167:0040117F  6A68                PUSH      68        <-- 104, czyli 2 checkbox                         
0167:00401181  FF7508              PUSH      DWORD PTR [EBP+08]                 
0167:00401184  E823010000          CALL      USER32!IsDlgButtonChecked          
0167:00401189  660BC0              OR        AX,AX               <-- 1 or 1 = 1                 
0167:0040118C  7559                JNZ       004011E7         (6)                  
0167:0040118E  83C306              ADD       EBX,06                             
0167:00401191  86FB                XCHG      BH,BL                              

Tutaj checkbox nie moze byc zaznaczony. Dlaczego? Jezeli 2 checkbox bedzie
zaznaczony to skoczymy do sprawdzania ebx, a nasze ebx nie jest jeszcze gotowe ;-)
Hmm... jak dziala or ?


	| a | b | wynik|
	----------------
	| 0 | 0 |   0  |
	| 1 | 0 |   1  |
	| 0 | 1 |   1  |
	| 1 | 1 |   1  |

Oki. Dalej sprobuj sam, jest to bardzo proste i analogiczne do tego co zrobilismy.
Koncowy wynik to:

	------------------------
	|  x |     |     |     |
	------------------------
	|  x |     |  x  |  x  |
	------------------------

Po zaznaczeniu powyzszych checkbox'ow, mamy zaszczyt zobaczyc messagebox'a

	## Good Cracker - Congratulations ! ##

.EnD

I stalo sie... historia ;-) Zlamalismy kolejne crackme. Bylo ono dosyc orginale.
Dosc rzadko spotyka sie takie zabezpieczenie i choc bylo ono bardzo proste to
fajnie czasem zlamac cos innego niz standardy: s/n, name-s/n, key-file. Takie
drobne urozmaicenie ;-). Oczywiscie jezeli czegos nie zakapowales to
mailto: tymon_crk@wp.pl. Do zobaczenia w nastepnym tutku.

.LinkZ

www.cracking.pl     // texty na karzdy temat
www.zoomek.prv.pl   // strona zoomka, najlepsza jezeli chodzi o asm. Znajdziesz
		    // tu opisy wielu sztuczek ANTY-SI
www.ctrl-d.prv.pl   // strona Barta, crack news
www.crackmes.prv.pl // najlepsza strona dla praktyki. Siagaj crackmes i tutki, a dosc
		    // szybko zrozumiesz o co biega.
www.crackpl.site.pl // stronka upadlej juz grupy CrackPl, szkoda byli dobrzy.
www.witeg.prv.pl    // swietna strona crackme lamacza. Crypto w asm.

.ThAnX tO:

	    ZAKONNA, mNICH, BART, Cybult, GED_, ToMKoL, JuBE, CRACKPL, AAOCG