Znalazlem na dzis crackme, dzieki  ktoremu na prawde duzo sie nauczymy.
Podszkolimy sie troche w masmie, nauczymy sie podstaw Idy (dekompiler),
napiszemy pare brtuow i w ogole sie dobrze pobawimy;)

CEL = crakme by Ufcio v 5.0

Na poczatek zobaczmy co autor od nas chce:

(...) znajdz haselko i mail me!(...) 
(...)No to crackme jest
juz jak zwykle antytracowane w calosci...zastosowalem specjalna formule
zeby nie bylo takie proste do usuniencia :)... co do anty debug
to mozna uzywac wszelakich debugerkow ale zastawienie pulapek = 
zawieszeniu programu tak wiec nie zdziw sie jak ci sie BSOD pojawi bo 
to tak ma byc dla tych wszystkich niedobrych crackeruf :))) (...)

Wyglada niezle...co? Ale powoli...;)
Jak nie wierzysz,ze zawiesisz kompa jak sprobujesz zastosowac SI na tym
crackmeku, to sam sprobuj, ale nie mow, ze nie ostrzegalem;)  Sprobujmy
wrzucic je do WDasma...i co?...niezly  syf...wiesz czemu? Moim  zdaniem
autor  po  prostu zastosowal  makro w swoim progu i pefnie walnal je co 
kazda linijke:( Takie makro wyglada mniej wiecej tak:
 
_tu_kod_programu_
 
jmp label
       dupa db "jakies_nie_potrzebne_dane",0
label:  
_tu_dalsza_czesc kodu_        

...chyba kumasz?;)
WDasm jest glupi i nie rozpoznaje makr, po prostu mieli kod programu po
kolei uznajac dane za instrucje assemblera. Na szczescie mamy inny pro-
gram... nazywa sie IDA...chyba  slyszales  cos  o nim? Ja uzywam wersji 
3.8 dla dosa, bo jest w pelnej wersji;) Zaraz  sie przekonasz, ze WDasm
nie dorasta nawet do piet IDY;) Jak cos wiesz o IDA, to dobrze,jak nie,
to jakos tesh sobie poradzisz ( polecam tutaj nasze lekcje - zobacz  na
nasza strone ). Odpal IDE i co tam widzisz...podobne troche do WDasm-a?
Oka, to zaladuj plik, czyli nasze crackme do IDY...wyskoczylo ci pefnie
okienko z opcjami...popatrz sobie co tam masz do ustawienia,ale ostate-
cznie nacisnij OK, zeby kontynuowac prace IDY. Teraz IDA rozklada crac-
kmeka na czynniki pierwsze;) Pobaw sie troche suwakiem i zobacz jak wy-
glada  rozlozony crackme...i co ?... dalej nie wesolo zamiast kodu masz
takie cos:       

                db 0, 0EBh, 4, 90h, 0EAh, 2 dup(2)
		db 6Ah,	0, 0EBh, 4, 90h, 0EAh
		db 2, 91h, 0E8h, 0DEh, 5, 2 dup(0)
		db 0EBh, 4, 90h, 0EAh, 2, 3
		db 0A3h, 0B8h, 31h, 40h, 0
		db 0EBh, 4, 90h, 0EAh, 2, 4
		db 6Ah,	0, 0EBh, 4, 90h, 0EAh
		db 2, 96h, 68h,	71h, 10h, 40h
		db 0, 0EBh, 4, 90h, 0EAh, 2
		db 95h,	6Ah, 0,	0EBh, 4, 90h
		db 0EAh, 2, 94h, 68h, 0, 30h
		db 40h,	0, 0EBh, 4, 90h, 0EAh
		db 2, 93h, 0FFh, 35h, 0B8h
		db 31h,	40h, 0,	0EBh, 4, 90h 
                ....
                
...czemu tak?...ano przez te makra...I  teraz zobaczysz czemu IDA jest
lepsza od WDasm...Widzisz te wartosci?-nie przypominaja  ci one czegos
...taaak!!!....przeciez to sa heksy roznych instrukcji assemblera!!...
trzeba je zatem poukladac i bedziemy mieli prawidlowy kod zrodlowy cr-
ackmeka.IDA zrobila sobie z naszych instrukcji dane do programu,musimy
to poprawic...przesun kursor tekstowy na pierwsza linijke tych instru-
kcji i nacisnij 'U'-teraz nasze dane sa oznaczone jako NIEZDEFINIOWANE
...ale jeszcze cos nie pasuje, zobacz na poczatek programu:

                nop	

loc_0_401003:				; CODE XREF: .text:00401000j
		jmp	far ptr	4:0E8E80102h

Tu tez  cos  nie  tak?...cos ten skok dziwny...;)..najedz na linijke z
NOP-em  i nacisnij 'U'...no  teraz mozna sobie budowac progra:)...mamy
teraz takie cos:
    
start:
		jmp	short near ptr unk_0_401006
; ---------------------------------------------------------------------------
		db  90h	; 
unk_0_401003	db 0EAh	; 
		db    2	;  
		db    1	;  
unk_0_401006	db 0E8h	; 		; CODE XREF: .text:00401000j
		db 0E8h	; 
		db    4	;  
		db    0	;  
                 .....
                 
Popatrz na  pierwszy  skok...chce skoczyc pod etykiete unk_0_401006...
widzisz  ta  etykiete  troche nizej?...pamietasz  wyglad makra...chyba
wiesz,ze kod programu powienien byc wlasnie tam,czyli najezdzamy kurs-
oerem na linijke:    

unk_0_401006	db 0E8h	; 		; CODE XREF: .text:00401000j

i naciskamy 'C'-Code...czyli nasz fragment jest juz oznaczony jako kod
programu...i wyglada tak:

start:
		jmp	short loc_0_401006
; ---------------------------------------------------------------------------
		db  90h	; 
unk_0_401003	db 0EAh	; 
		db    2	;  
		db    1	;  
; ---------------------------------------------------------------------------

loc_0_401006:				; CODE XREF: .text:00401000j
		call	near ptr byte_0_4014D2+21h
		jmp	short near ptr loc_0_40100E+3
; ---------------------------------------------------------------------------
		nop	

loc_0_40100E:				; CODE XREF: .text:0040100Bj
		jmp	far ptr	4EBh:6A0202h
                 
                 ...
                 
heh,znow ten skok na samym dole...jest nie taki...trzeba do poprawic!!
Czyli oznaczmy go jako niezdefiniowany - litera 'U', to samo  robimy z
NOP-em i mamy takie cos:

start:
		jmp	short loc_0_401006
; ---------------------------------------------------------------------------
		db  90h	; 
unk_0_401003	db 0EAh	; 
		db    2	;  
		db    1	;  
; ---------------------------------------------------------------------------

loc_0_401006:				; CODE XREF: .text:00401000j
		call	near ptr byte_0_4014D2+21h
		jmp	short near ptr unk_0_401011
; ---------------------------------------------------------------------------
		db  90h	; 
		db 0EAh	; 
		db    2	;  
		db    2	;  
unk_0_401011	db  6Ah	; j		; CODE XREF: .text:0040100Bj
		db    0	;  
                          
                          ....
                          
...popatrz na  ostatni  skok...taaakk...wlasnie  tam jest  dalsza czesc
programu...czyli w lini:

unk_0_401011	db  6Ah	; j		; CODE XREF: .text:0040100Bj
                                                      
dajemy 'C' i  mamy  juz  poprawny  kawalek kodu...niezle  zamotane, ale 
proste jak drut;) A  teraz  cie pociesze, musisz  tak przerobie  calego
crackmeka:)...do roboty!!! Pokombinujesz i zrobisz;)))
Noi mamy juz kod zrodlowy crackmeka...mam pomysl, moze zorbimy z  niego
gotowy plik do masma i  przekompilujemy  sobie tego crackmeka, zeby nam
nie pieprzyl SI...co ty na to?...wiem ze chcesz!;))
Na pewno pisales kiedys jakis programik  w masmie, wiec nie bedzie pro-
blemu;))))) Ale popatrz jeszcze do  IDY - trzeba j eszcze by pozmieniac
wszystkie etykiety i nazwy zmiennych zeby zrodelko bylo bardziej czyte-
lne...kak to zrobic??...przeczytaj lekcje 12 z naszego UCS.
W finalnej wersji otrzymasz takie zrodlo programu:

;######################################################################

.386	
	.model flat, stdcall
	option casemap : none

include d:\masm32\include\windows.inc
include d:\masm32\include\gdi32.inc
include d:\masm32\include\user32.inc
include d:\masm32\include\kernel32.inc
include d:\masm32\include\comdlg32.inc 
include d:\masm32\include\comctl32.inc
include d:\masm32\include\shell32.inc        ;lubie przesadzac;)
include d:\masm32\include\winmm.inc
include d:\masm32\include\sawka.inc
includelib d:\masm32\lib\user32.lib
includelib d:\masm32\lib\kernel32.lib
includelib d:\masm32\lib\gdi32.lib
includelib d:\masm32\lib\comdlg32.lib
includelib d:\masm32\lib\comctl32.lib
includelib d:\masm32\lib\winmm.lib
includelib d:\masm32\lib\sawka.lib  

      
       WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
 

.data
        Nazwa_dialoga	db "MyDialog",0        
        aAboutCrackme5_	db "About Crackme 5.0 by Ufcio",0 
        aWelcomeToCrack	db "Welcome to Crackme 5.0 by Ufcio.",0Ah 
	                db 0Dh,"Just find the password - no patching!",0Ah
		        db 0Dh,"If you are trying to use debugers or deasems to crack th"
		        db "is - you are on wrong way my friend ;)",0Ah
		        db 0Dh,"mailto:UfcioUfcio@poczta.onet.pl",0
        aYouRGreat	db "You R great!",0     
        aOhManYouRealyD	db "Oh man you realy did that thing :)!",0Ah 
	                db 0Dh,"You must be great - please mail me :)",0
        aYouRLamerP	db "You R lamer :P",0   
        aWhat?YouThinkT	db "What? You think that it could be soooo simple?!",0Ah
                	db 0Dh,'Don',27h,"t make me laugh!",0

        buffer_serial   db 50 dup (0)
.data?
        hInstance       dd ?
        
                 
.code		
start:
		
	
	
		invoke	GetModuleHandle,0
		mov	hInstance, eax 		
		invoke DialogBoxParam,hInstance,offset Nazwa_dialoga,0,offset WndProc,0		
		invoke ExitProcess,hInstance


WndProc	Proc uses ebx esi edi hWnd1:HWND, Msg:UINT, wParam:WPARAM, lParam:LPARAM 
				

		mov eax,Msg					
		cmp	eax, WM_CLOSE
		jz	wmclose
		cmp	eax, WM_COMMAND
		jz	wmcommand

wroc:									
		jmp finish	

wmcommand:	
                mov     eax,wParam			
		cmp	eax, 0BB9h ;ok button
		jz	wmok
		cmp	eax, 0BBAh ;about button
		jz	wmabout
		jmp	wroc
wmok:				
		invoke	GetDlgItemText,hWnd1,0BB8h,offset buffer_serial,25h		
		cmp	eax, 0
		jz	wmclose
		mov	esi, offset buffer_serial
		xor	eax, eax
		xor	ebx, ebx
		xor	edx, edx
		mov	eax, [esi]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 8
		mul	cl
		rol	eax, 0Ch
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 215E6943h
		jnz	zle_haslo
		mov	eax, [esi+2]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 0Ch
		mul	cl
		rol	eax, 9
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 0F8668134h
		jnz	zle_haslo
		mov	eax, [esi+4]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 0Ah
		mul	cl
		rol	eax, 0Eh
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 394B3E7Dh
		jnz	zle_haslo
		mov	eax, [esi+6]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 0Bh
		mul	cl
		rol	eax, 11h
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 6C8DAA83h
		jnz	zle_haslo
		mov	eax, [esi+8]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 0Ch
		mul	cl
		rol	eax, 9
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 817D21B1h
		jnz	zle_haslo
		mov	eax, [esi+0Ah]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 0Dh
		mul	cl
		rol	eax, 0Ah
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 0D17AF8E1h
		jnz	zle_haslo
		mov	eax, [esi+0Ch]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 0Eh
		mul	cl
		rol	eax, 0Dh
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 0B4D0ABE0h
		jnz	zle_haslo
		mov	eax, [esi+0Eh]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 0Fh
		mul	cl
		rol	eax, 0Bh
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 33E46Eh
		jnz	zle_haslo
		xor	edx, 0A6DA162Bh
		jnz	zle_haslo
		jmp	dobre_haslo

zle_haslo:						
		invoke	MessageBox,hInstance,offset aWhat?YouThinkT, offset aYouRLamerP,0
                jmp wroc

dobre_haslo:					
		invoke	MessageBox,hInstance,offset aOhManYouRealyD, offset aYouRGreat,0
		jmp	wroc


wmabout:			
		invoke	MessageBox,hInstance,offset aWelcomeToCrack, offset aAboutCrackme5_,0
		jmp	wroc

wmclose:					
		invoke	ExitProcess,hInstance
finish:
        mov eax,0
        ret
WndProc endp

end start

;#####################################################################

Pefnie zauwazylesz, ze pare rzeczy przeksztalcilem...zrobilem to, zeby
troche sobie ulatwic sprawe. Co zmienilem:

- wywalilem procke z SIDT...nie potrzebna nam;)
- crackme nie wylacza sie juz po wpisaniu zlego kodu!

Teraz juz mozna skopilowac nowe crackme by ufcio v 5.0 w lepszej wersji
:))) 
Widac juz cala procke, ktora miesza nasze haselko, czyli mozna  juz sie
bawic w crackowanie;)) Widzisz,ze procka nie jest trudna, ale trzeba 
napisac do niej bruta...to do roboty!!!;)
Tak wyglada poczatek procki:

                mov	esi, offset buffer_serial
		xor	eax, eax
		xor	ebx, ebx
		xor	edx, edx
		mov	eax, [esi]
		mov	ebx, eax
		add	edx, ebx
		mov	cl, 8
		mul	cl
		rol	eax, 0Ch
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 215E6943h
		jnz	zle_haslo 
		
No to napiszmy do niej bruta...oto moja propozycja:

;----------------------------cut---------------------------------------
.386	
	.model flat, stdcall
	option casemap : none

include d:\masm32\include\windows.inc
include d:\masm32\include\gdi32.inc
include d:\masm32\include\user32.inc
include d:\masm32\include\kernel32.inc
include d:\masm32\include\comdlg32.inc 
include d:\masm32\include\comctl32.inc
include d:\masm32\include\shell32.inc
include d:\masm32\include\winmm.inc
include d:\masm32\include\sawka.inc       ;heh...jush mowilem;)
includelib d:\masm32\lib\user32.lib
includelib d:\masm32\lib\kernel32.lib
includelib d:\masm32\lib\gdi32.lib
includelib d:\masm32\lib\comdlg32.lib
includelib d:\masm32\lib\comctl32.lib
includelib d:\masm32\lib\winmm.lib
includelib d:\masm32\lib\sawka.lib  

 szText MACRO Name, Text:VARARG        ;pefnie znasz to makro;)
                        LOCAL lbl
                        jmp lbl
                        Name db Text,0
                        lbl:
                ENDM

.data
 buffor db 50 dup (0)

.code 
start:   

                mov     esi,0  
tu:    
	        inc     esi   
                mov     eax,0
                mov     ebx,0
                mov     ecx,0
	        mov     edx,0		
		mov 	eax,esi
 		mov	ebx, eax
		add	edx, ebx
		mov	cl, 8
		mul	cl
		rol	eax, 0Ch
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 215E6943h
		jnz	tu

	
 
ok:    
        szText nic,"Znalazem"    
        szText kak,"%lX"
        invoke Convert,esi,offset buffor,offset kak ;to moj *.lib 
                                                    ;konvertuje rej.
                                                    ;do ASCII
        invoke MessageBox,0,offset buffor,offset nic,MB_OK
        invoke ExitProcess,0 
end start

;-------------------------------cut------------------------------------    
Puszczmy proga i po chwili mamy wynik...mi wyszly takie liczby:61746F54
Trzeba je teraz odwrocic, czyli mamy:546F7461,a to sa heksy znakow:Tota
...czyli to jest  poczatek hasla:)...to  znajdzmy nastepna czesc do tej
czeci kodu:     
        
                mov	eax, [esi+2]    ;czyli rozpoczynamy od trzeciej
		mov	ebx, eax        ;litery!!!
		add	edx, ebx
		mov	cl, 0Ch
		mul	cl
		rol	eax, 9
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 0F8668134h
		jnz	zle_haslo

ALe my juz znalezlismy trzecia litere i wiemy,ze to na pewno bedzie 't'
...czyli trzeba uwzglednic to w brucie, bo moze znalezc nie te liery co
nam potrzeba - rozwiazan moze byc duzo, ale my musimy znalezc to jedyne
- zobacz na koncowke w naszym crackme:

                xor	edx, 0A6DA162Bh        ;cos jak checksum;)
		jnz	zle_haslo 
		
Czyli powinno byc tak:
;----------------------------cut---------------------------------------
.386	
	.model flat, stdcall
	option casemap : none

include d:\masm32\include\windows.inc
include d:\masm32\include\gdi32.inc
include d:\masm32\include\user32.inc
include d:\masm32\include\kernel32.inc
include d:\masm32\include\comdlg32.inc 
include d:\masm32\include\comctl32.inc
include d:\masm32\include\shell32.inc
include d:\masm32\include\winmm.inc
include d:\masm32\include\sawka.inc       ;heh...jush mowilem;)
includelib d:\masm32\lib\user32.lib
includelib d:\masm32\lib\kernel32.lib
includelib d:\masm32\lib\gdi32.lib
includelib d:\masm32\lib\comdlg32.lib
includelib d:\masm32\lib\comctl32.lib
includelib d:\masm32\lib\winmm.lib
includelib d:\masm32\lib\sawka.lib  

 szText MACRO Name, Text:VARARG        ;pefnie znasz to makro;)
                        LOCAL lbl
                        jmp lbl
                        Name db Text,0
                        lbl:
                ENDM

.data
 buffor db 50 dup (0)

.code 
start:   

                mov     esi,0  
tu:    
	        inc     esi   
                mov     eax,0
                mov     ebx,0
                mov     ecx,0
	        mov     edx,0		
		mov 	eax,esi
 		mov	ebx, eax
		add	edx, ebx
		mov	cl, 0Ch
		mul	cl
		rol	eax, 9
		xor	eax, ebx
		xor	ebx, ebx
		xor	eax, 0F8668134h
		jnz	tu
                mov     ecx,esi
                cmp     cl,'t'      ;trzeba sie upewnic, a jedna litera
                jnz     tu          ;nam wystarczy
	
 
ok:    
        szText nic,"Znalazem"    
        szText kak,"%lX"
        invoke Convert,esi,offset buffor,offset kak ;to moj *.lib 
                                                    ;konvertuje rej.
                                                    ;do ASCII
        invoke MessageBox,0,offset buffor,offset nic,MB_OK
        invoke ExitProcess,0 
end start

;-------------------------------cut------------------------------------

To nam  daje wynik (po odwroceniu):74616C20, czyli litery:tal_
                                                            ^
                                                        to spacja
Z tamtej czeci bylo:

Tota
z z tej:
  tal_
Czyli mamy: Total_

...Tobie zostawiam reszte... to wcale nie jest trudne!!!

Sawka^UnderPL (ssawek@poczta.onet.pl)
4.10.2001
                                                                                                                                                                                                                                                     