  ____________________________________________________________________________________                                                          
                    _________\          |            __________  
                   /          \      __-+-  __      |         /\ 
                  /___________/     /'( |_  )`\     |________/  \
                 |   \       /     / . \/^\/ . \            /   /
                  \   \           /  _)_`-'_(_  \          /   / 
                   \   \         /.-~   ).(   ~-.\        /   /  
                    \   \       /'     /\_/\     `\      /   /   
                     \  /     __  ___  " __"  __  _ _  \/   /    
                      \/     / _)(  ,)  (  ) / _)( ) )  \__/_    
                            ( (_  )  \  /()\( (_  )  \           
                             \__)(_)\_)(_)(_)\__)(_)\_)          
                                ___             __               
                               (  ,\o l a n d  (  )              
                                ) _/ cRACKING   )(__             
                               (_)      gROUP  (____)            
                                    ____     /\                  
                                   /  \     /  \                 
                                  /\   \   /   /                 
                                    \   \ /   /                  
                                     \___\___/                   
_______________________________________________________________________________________

                                CrackPl prezentuje 
_______________________________________________________________________________________

Target: ACDSee 2.x
What: Serial & crack
Tools: SoftICE

Sposb generowania seriala jest niele zamotany.
Ot ACDSee najpierw generuje rzeczywiste UserName na podstawie wprowadzonego kodu 
i pniej porwnuje z tym wpisanym przez nas. 
Czyli robi to na odwrt (jak w innych z username generowany jest kod i sprawdzany z wpisanym). 
eby byo mieszniej generowany username jest przerobiony (czyt. okrojony).

Ale zacznijmy tak: wiadomo wpisujemy jakie dane w dialogowym np. 
user : GustawKitCrackPl a numer seryjny: 001222233 a co dalej chyba wiadomo,
w SoftIce breakpoint :bpx GetDlgItemTextA, 
funkcja wywoywana jest dwa razy, czyli za drugim razem F11 i jestemy w czym takim 
:u eip l 1f
014F:00407AB6  8D44247C           LEA     EAX,[ESP+7C]    <---tutaj gdzie jestemy i tutaj 
014F:00407ABA  8D4C243C           LEA     ECX,[ESP+3C]    <---adowane SA adresy danych
014F:00407ABE  50                 PUSH    EAX             <----  wiadomo, na stos
014F:00407ABF  51                 PUSH    ECX
014F:00407AC0  E82BF8FFFF         CALL    004072F0       <----funkcja sprawdzajca poprawn.
014F:00407AC5  83C408             ADD     ESP,08         <----uregulownie stosu
014F:00407AC8  85C0               TEST    EAX,EAX        <----sprawdzenie wart. funkcji
014F:00407ACA  7E6B               JLE     00407B37       <--- jeeli EAX=0 'le' to skok 
014F:00407ACC  8D54247C           LEA     EDX,[ESP+7C]
014F:00407AD0  8D44243C           LEA     EAX,[ESP+3C]
014F:00407AD4  52                 PUSH    EDX

Sprbujmy poszuka co si dzieje z danymi. Wchodzimy (F8) w wywoanie CALL 004072F0 
i jedziemy krok po kroku obserwujc co si dziej, nie bd tutaj dawa zrzutw bo szkoda miejsca.
W pewnym momencie znajdziemy ptle w ktrej pobierany jest username wpisany przez nas 
i jest przerabiany w zalenoci od dugoci i tak 
    -do 5 znakw jest kopiowany cay czyli - Gutek daje Gutek
    -powyej kopiuje co druga LUB trzecia itd liter czyli - GustawKitCrackpl daje GtKCcl
I tak przerobiony username uywa dalej w sprawdzaniu. Jeeli przeledzimy dalej program znajdziemy 
cos takiego :
014F:00442F7B  52                  PUSH    EDX
014F:00442F7C  50                  PUSH    EAX
014F:00442F7D  51                  PUSH    ECX
014F:00442F7E  E85D000000          CALL    00442FE0   <-- tutaj generowany jest user z kodu
014F:00442F83  83C410              ADD     ESP,10
014F:00442F86  8D742464            LEA     ESI,[ESP+64]   <-- tu adres wygenerowany user
014F:00442F8A  8D442438            LEA     EAX,[ESP+38]   <-- tu adres nasz wpisany user
014F:00442F8E  8A10                MOV     DL,[EAX]       <-  tutaj zaczyna si procedura
014F:00442F90  8A1E                MOV     BL,[ESI]        ---- porwnywania userow.
014F:00442F92  8ACA                MOV     CL,DL
014F:00442F94  3AD3                CMP     DL,BL
014F:00442F96  752F                JNZ     00442FC7

jeeli bdc w linie LEA EAX[ESP+38] damy mu wywietl dane pod adresem ESP+38
czyli d EAX dostaniemy cos takiego

:d eax l 1ff
0157:0072F028   GTKCCL.. ....F..   <-- w EAX jest adres teksty GTKCCL czyli przerobiony 
0157:0072F038   (........*..}...       GustawKitCrackpl
0157:0072F048   ......r.2...AEMA   <-- w ESI jest adres tekstu AEMAGS czyli user generowany
0157:0072F058   GS....O...\.w...       z wpisanego przez nas kodu
0157:0072F068   .pr...O...\...O.
0157:0072F078   Fs@.l....s@.P.K.
0157:0072F088   ..r...r......z@.
0157:0072F098   ..r...r...r.....
0157:0072F0A8   d.r. ..,...@....
0157:0072F0B8   ..K....^...^.^..
0157:0072F0C8   ......w ..t..2/.
0157:0072F0D8   ....GustawKitCra   <-- rzeczywisty user wpisany w okienku dialog
0157:0072F0E8   ckPl.,0...B.....
0157:0072F0F8   ...,J..,Z.....V
0157:0072F108   ..........[... .
0157:0072F118   ..O.0012222333..   <-- wpisany kod (serial)
0157:0072F128   ..K....^..O...\.
0157:0072F138   ....V ..C...O...

Nie przeledziem procedury generowania usera z kodu poniewa jest niele zagmatwana 
i nudna to robota. Natomiast jak mona przechytrzy program ?. 
Ot widzimy ze przy numerze 001222233 program generuje usera AEMAGS. 
Widzimy tez, ze z wpisanego przez nas usera GustawKitCrackPl program wygenerowa 
GTKCCL czyli opuci po dwie litery. C zamiast GTKCCL musimy mi AEMAGS 
aby program wykona pozytywne porwnanie. 
Wpiszmy mu wiec w okienku dialogowym usera typu AssEssMssAssGssS 
(on go przerobi na AEMAGS a oto wanie chodzi) i ACDsee zostanie zarejestrowane.
------------------------------------------------------------------------------------------
Jak natomiast moemy zcrackowa program. Jest wiele sposobw. Mona zrobi np. tak
po funkcji sprawdzajacej poprawnc jest skok jezeli EAX=0 (zy serial). 
Moemy wi usun sprawdzenie i skok czyli
014F:00407AC0  E82BF8FFFF         CALL    004072F0       <---- funkcja sprawdzajca poprawn.
014F:00407AC5  83C408             ADD     ESP,08
014F:00407AC8  85C0               TEST    EAX,EAX           <---- sprawdzenie wart. funkcji
014F:00407ACA  7E6B               JLE     00407B37              <---  jeeli 'le' to skok
na
014F:00407AC0  E82BF8FFFF         CALL    004072F0       <---- funkcja sprawdzajca poprawn.
014F:00407AC5  83C408             ADD     ESP,08
014F:00407AC8  90                 NOP
014F:00407AC9  90                 NOP
014F:00407ACA  90                 NOP
014F:00407ACB  90                 NOP

a poniewaz program pniej jeszcze sprawdza poprawno dla pewnoi moemy zmieni
014F:00442F86  8D742464            LEA     ESI,[ESP+64]    <-- tu adres wygenerowany user
014F:00442F8A  8D442438            LEA     EAX,[ESP+38]   <-- tu adres nasz wpisany user
na
014F:00442F86  8D742464            LEA     ESI,[ESP+64]    <-- tu adres wygenerowany user
014F:00442F8A  8D442464            LEA     EAX,[ESP+64] !!!<-- tu adres jak powyzej

wtedy program porwnuje umieszcza zamiast wpisanego przez nas usera ten poprawny i dokonuje
porwnania wiadomo z jakim skutkiem. Teraz po wpisaniu dowolnego usera i serialu program po 
restarcie bdzie zarejestrowany.

------------------------------------------------------------------------------------------
Innym sposobem zcrack'owania moe by taka modyfikacja w funkcji sprawdzania poprawnoci
(z materiaw angielskojezycznych eXact /oRP)
znajdziemy co takiego :

; Sprawdzenie dugoci 
>00402FC0 56             PUSH ESI
 00402FC1 8B742408       MOV  ESI, [ESP + 08]
 00402FC5 56             PUSH ESI
 00402FC6 E835000000     CALL 00403000             ; sprawdzenie dugoci
 00402FCB 83C404         ADD  ESP, 00000004
!00402FCE 85C0           TEST EAX, EAX
!00402FD0 7504           JNE  00402FD6             ; skok jezeli dobrze
!00402FD2 33C0           XOR  EAX, EAX             ; EAX=0 jezeli le
 00402FD4 5E             POP  ESI
 00402FD5 C3             RET                       ; powrt

; Sprawdzenie kodu rejestracyjnego
:00402FD6 8B44240C       MOV EAX, [ESP + 0C]
:00402FDA 50             PUSH EAX
:00402FDB 56             PUSH ESI
:00402FDC 6848F34800     PUSH 0048F348             ; "-294378973"
:00402FE1 E86AE70100     CALL 00421750             ; tutaj sprawdzanie
:00402FE6 83C40C         ADD  ESP, 0000000C
:00402FE9 83F801         CMP  EAX, 00000001
:00402FEC 1BC0           SBB  EAX, EAX
:00402FEE 5E             POP  ESI
:00402FEF 40             INC  EAX
:00402FF0 C3             RET                       ; powrt

Z wielu moliwoci modyfikowania tego kodu mona tak:

0157:00402FCE mov eax,1
0157:00402FD3 nop


Teraz w czasie sprawdzania dugoci nastpi wpisanie w EAX 1 czyli poprawny kod 
i nastpi powrt do gwnego programu bez dalszego sprawdzania.

____________________________________________________________________________
|   Crackpl - http://friko6.onet.pl/ns/gcrkpl/                             |
|   GustawKit.......[cracker,writer]                                       |
|   ToMaS...........[cracker,ascii art]                                    |
|   Zomo/BBU........[cracker,admin Crackpl Maillist]                       |
|__________________________________________________________________________|