Works best under FAR.


                   ͻ ͻ    ͻ ͻ
                    Ȼ    
                   ͻ͹ Ȼ   ͻ͹
                              ɻȻ       
                              ȻȻ      
                  Total  New   Ȼȼ bie   Tutorial
                                Ȼ      
                                 Ȼ      
                              #10 Ȼ      
                        ͼ      ͼ     ͼ      ͼ



                     
                    ۱۰    \/
                   ۱۱   *
                   ۱۱ۻ  \
                    ۱۲ ͼ
                     




Cze!


Juz dziesiaty tekst, hmm...troche duzo. Kiedy w meczarniach tworzylem pierwszy
nie sadzilem, ze dam rade dociagnac do dziesiatki. No ale widac jestem 
zajebiscie pracowity ;) 

A coz dzisiaj pomeczymy? Crack_me #01 for DOS by kaliber777. Pewnie nie bardzo
masz ochote czytac o DOSowych programach, sa powszechnie nie lubiane, ze 
wzgledu na babranine z przerwaniami. Mimo to zachecam do probowania takich
crackmesow, przy odrobinie uporu mozna sie przyzwyczaic. Mam na mysli proste
zabezpieczenia -sam bardzo kiepsko rozeznaje sie w przerwaniach.

Toolsy:

SoftICE		-yep.
Intervue 1.5	-opis przerwan
Hiev		-pomocniczo
kafa		-:)
The Gathering	-Nighttime Birds

1. Crackme jest dosc oszczednie napisane od strony wizualnej, widzimy tylko
nazwe i "password:", a po wpisaniu niepoprawnych danych wyswietla sie "Bad 
Work!". Co nie ma nic wspolnego z jego lamaniem, tak sobie napisalem. Ale
do rzeczy. Nalezaloby chyba jakos wlezc do srodka kodu, nie? Tylko jak to
zrobic, ulubione GetDlgItemTextA nie da rady, a moze przerwanko? Odczyt
klawiatury w najprostszej formie, to AH=0Ah INT 21h, ale nie tym razem.
Podejdziemy do tego od innej strony. Co sie dzieje kiedy wciskamy klawisz?
No bo cos sie musi dziac. Nastepuje jego odczyt of koz, poszukamy w Intervue:


INT 16 - KEYBOARD - GET KEYSTROKE
	AH = 00h

(...)

SeeAlso: AH=01h,AH=05h,AH=10h,AH=20h,INT 18/AH=00h

Kilka mozliwosci namierzylismy, a ktore obstawic? Najlepszy wybor to AH=10h,
a to dlatego:

Notes:	if no keystroke is available, this function waits until one is placed
	  in the keyboard buffer

Czyli dokladnie to, co potrzeba. Wlazimy do crackme, wpisujemy haslo, 
ustawiamy pulapke "bpint 16 if (ah==10)" i dajemy enter. Teraz kilkanascie F12
i zobaczymy gdzie wyladujemy:

16CE:041D  MOV       AH,3F
16CE:041F  INT       21
16CE:0421  JB        0433           <--Y're here!    (NO JUMP)
16CE:0423  MOV       ES:[DI+0A],AX
16CE:0427  XOR       AX,AX
16CE:0429  MOV       WORD PTR ES:[DI+08],0000
16CE:042F  POP       DS
16CE:0430  RETF      0004

Heh, jak widac wystarczylo ustawic pulapke na AH=3fh INT 21h, widac to 
przerwanie po prostu w execu, wykonuje ono "READ FROM FILE OR DEVICE",
nie wiedzialem o tym, ale wlasnie sie dowiedzialem. Rozne drogi jak widac
prowadza do celu. Wystarczy teraz sprawdzic sobie "d dx" i mamy nasze haslo.

2. Czeka nas troche klepania F8, az znajdziemy cos ciekawego, czyli:

16CE:0658  LODSB
16CE:0659  CMP       AL,0D
16CE:065B  JZ        066C
16CE:065D  CMP       AL,1A
16CE:065F  JZ        066C
16CE:0661  STOSB
16CE:0662  CMP       SI,BX
16CE:0664  LOOPNZ    0658
16CE:0666  JCXZ      066D
16CE:0668  MOV       AX,0658
16CE:066B  RET

Gdzie si=adres hasla, bx-adres ostatniej branej pod uwage litery. Po recie
nastepuje sub si,dx i zapamietanie dlugosci hasla:

16CE:04CD  MOV       ES:[BX+08],SI

Dobra, teraz znowu sporo shitu bez znaczenia, az do:

16CE:0B23  CMP       BYTE PTR ES:[DI],2B
16CE:0B27  JZ        0B30
16CE:0B29  CMP       BYTE PTR ES:[DI],2D
16CE:0B2D  JNZ       0B34

Czyli sprawdzenie, czy pierwsza litera to '+' albo '-', potem jest sprawdzenie,
czy druga to '$'. Jak to zobaczylem, to od razu zalozylem sobie poczatek hasla
'+$', wiec nie wiem, co sie dzieje jak jest inaczej. Szukamy dalej odwolan
do hasla:

16CE:0B86  MOV       BL,ES:[DI]
16CE:0B89  CMP       BL,61
16CE:0B8C  JB        0B91
16CE:0B8E  SUB       BL,20
16CE:0B91  SUB       BL,3A
16CE:0B94  ADD       BL,0A
16CE:0B97  JB        0BA4
16CE:0B99  SUB       BL,17
16CE:0B9C  ADD       BL,06
16CE:0B9F  JAE       0B6A
16CE:0BA1  ADD       BL,0A
16CE:0BA4  MOV       BH,04
16CE:0BA6  SHL       AX,1
16CE:0BA8  RCL       DX,1
16CE:0BAA  JB        0B80
16CE:0BAC  DEC       BH
16CE:0BAE  JNZ       0BA6
16CE:0BB0  OR        AL,BL
16CE:0BB2  INC       DI
16CE:0BB3  LOOP      0B86

Wystarczy sobie obejzec to w ruchu i widac, ze nasz serial jest wrzucany do
rejestrow dx, ax, moze miec tylko 8 znakow, wiec spokojnie sie miesci. Np
kiedy wpiszemy "321654", jak ja, to bedziemy mieli dx=0032 i ax=1654,
przy literach wartosci sa odpowiednio inne. Caly ten szajs idzie do pamieci:

16AE:010A  MOV       [01D2],AX

ale dx jest olewany. Co tam dalej sie dzieje:

16AE:0133  MOV       AL,[01D3]
16AE:0136  XOR       AH,AH
16AE:0138  MOV       DX,AX
16AE:013A  MOV       AL,[01D2]
16AE:013D  XOR       AH,AH
16AE:013F  ADD       AX,DX
16AE:0141  XOR       AX,000D
16AE:0144  MOV       [01D4],AX

Jakies drobne operacje na naszych danych, czego efektem jess 1 bajt wynikowy.


3. Niedlugo potem mozna sie natknac na trzykrotne wywolanie tej funkcji:

16CE:0C93  XOR       CX,CX
16CE:0C95  XOR       DX,DX
16CE:0C97  MOV       BX,ES:[DI]
16CE:0C9A  MOV       AX,4201
16CE:0C9D  INT       21

roznica jest tylko w al=01, 02, 00. Co robi to przerwanie?

INT 21 - DOS 2+ - "LSEEK" - SET CURRENT FILE POSITION
	AH = 42h
	AL = origin of move
	    00h start of file
	    01h current file position
	    02h end of file
	BX = file handle
	CX:DX = offset from origin of new file position

Czyli po prostu ustawiamy file ptr na poczatek pliku. Ilestam instrukcji
dalej funkcja ta jest wywolywana jeszcze raz, tyle ze wtedy:
al=00
dx=word ptr [1D4]

Mamy file ptr na pozycji wyliczonej z naszego hasla, czas powrocic do 
przerwania AH=3Fh INT 21h, ale teraz nie czyta ona z klawiatury, ale z pliku.
Czyta jeden bajt i chwile pozniej robi cos mniej wiecej takiego:

mov al, byte ptr [1D4]
add al, 6ah
mov dl, bajt_z_pliku
cmp al, dl
jnz BAD_BOY

I wszycho jasne, nie? Szukamy bajtu, ktorego wartosc wynosi pozycja+6ah,
a do przeszukania mamy bajty od 0 do ff. Na podstawie znalezionej pozycji
w pliku wyliczymy sobie haselko. Ale, ale, co to za plik? Nie trudno chyba
zgadnac, exe samego crackmeka of koz, mozna latwo to sprawdzic. I co, jest
taki bajt?  Na pozycji 7B mamy E5, E5-6A=7B :)

4. Teraz wystarczy wyliczyc haselko, pierwsze dwa znaki znamy, reszte bez 
zadnego trudu mozna policzyc z kawalka kodu powyzej:

7B XOR 0D = 76
7 = 1 + 6
6 = 3 + 3

Przykladowe haslo: "+$1363"

No to tyle na dzisiaj.

Done by Lilith from AtomicCrk


special thanx:

AtomicCrk crew
Ula
Petr0v
kaliber777


lilith_atomiccrk@poczta.onet.pl