Informacje jak zcrack'owac ACDSee 2.x by GustawKit

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

Sposób generowania seriala jest niezle zamotany. Otóz ACDSee najpierw generuje rzeczywiste UserName na podstawie wprowadzonego kodu i pózniej porównuje z tym wpisanym przez nas. Czyli robi to na odwrót (jak w innych z UserName generowany jest kod i sprawdzany z wpisanym). Zeby bylo smieszniej generowany UserName jest przerobiony (czyt. okrojony).

Ale zacznijmy tak: wiadomo wpisujemy jakies dane w dialogowym np. user : GustawKitCrackPl a numer seryjny: 001222233 a co dalej chyba wiadomo, w SoftICE breakpoint :bpx GetDlgItemTextA, funkcja wywolywana jest dwa razy, czyli za drugim razem F11 i jestesmy w czyms takim:

:u eip l 1f

014F:00407AB6  8D44247C           LEA     EAX,[ESP+7C]    <---tutaj gdzies jestesmy i tutaj 
014F:00407ABA  8D4C243C           LEA     ECX,[ESP+3C]    <---ladowane SA adresy danych
014F:00407ABE  50                 PUSH    EAX             <----  wiadomo, na stos
014F:00407ABF  51                 PUSH    ECX
014F:00407AC0  E82BF8FFFF         CALL    004072F0       <----funkcja sprawdzajaca poprawn.
014F:00407AC5  83C408             ADD     ESP,08         <----uregulowanie stosu
014F:00407AC8  85C0               TEST    EAX,EAX        <----sprawdzenie wart. funkcji
014F:00407ACA  7E6B               JLE     00407B37       <--- jezeli EAX=0 'zle' to skok 
014F:00407ACC  8D54247C           LEA     EDX,[ESP+7C]
014F:00407AD0  8D44243C           LEA     EAX,[ESP+3C]
014F:00407AD4  52                 PUSH    EDX

Spróbujmy poszukac co sie dzieje z danymi. Wchodzimy (F8) w wywolanie CALL 04072F0 i jedziemy krok po kroku obserwujac co sie dzieje, nie bede tutaj dawal zrzutów bo szkoda miejsca. W pewnym momencie znajdziemy petle w której pobierany jest UserName wpisany przez nas i jest przerabiany w zaleznosci od dlugosci i tak

I tak przerobiony UserName uzywa dalej w sprawdzaniu. Jezeli przesledzimy 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 sie procedura
014F:00442F90  8A1E                MOV     BL,[ESI]        ---- porównywania userow.
014F:00442F92  8ACA                MOV     CL,DL
014F:00442F94  3AD3                CMP     DL,BL
014F:00442F96  752F                JNZ     00442FC7

jezeli bedac w linie LEA EAX[ESP+38] damy mu wyswietl 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 przesledzilem procedury generowania usera z kodu poniewaz jest niezle zagmatwana i nudna to robota. Natomiast jak mozna przechytrzyc program ?. Otóz widzimy ze przy numerze 001222233 program generuje usera AEMAGS. Widzimy tez, ze z wpisanego przez nas usera GustawKitCrackPl program wygenerowal GTKCCL czyli opuscil po dwie litery. Cóz zamiast GTKCCL musimy miec AEMAGS aby program wykonal pozytywne porównanie. Wpiszmy mu wiec w okienku dialogowym usera typu AssEssMssAssGssS (on go przerobi na AEMAGS a oto wlasnie chodzi) i ACDsee zostanie zarejestrowane.

Jak natomiast mozemy zcrackowac program. Jest wiele sposobów. Mozna zrobic np. tak po funkcji sprawdzajacej poprawnosc jest skok jezeli EAX=0 (zly serial). Mozemy wic usunac sprawdzenie i skok czyli

014F:00407AC0  E82BF8FFFF         CALL    004072F0       <---- funkcja sprawdzajaca poprawn.
014F:00407AC5  83C408             ADD     ESP,08
014F:00407AC8  85C0               TEST    EAX,EAX        <---- sprawdzenie wart. funkcji
014F:00407ACA  7E6B               JLE     00407B37       <---  jezeli 'zle' to skok

na

014F:00407AC0  E82BF8FFFF         CALL    004072F0       <---- funkcja sprawdzajaca 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 pózniej jeszcze sprawdza poprawnosc dla pewnosci mozemy zmienic

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 porównuje umieszcza zamiast wpisanego przez nas usera ten poprawny i dokonuje porównania wiadomo z jakim skutkiem. Teraz po wpisaniu dowolnego usera i serialu program po restarcie bedzie zarejestrowany.

Innym sposobem zcrack'owania moze byc taka modyfikacja w funkcji sprawdzania poprawnosci (z materialów angielskojezycznych eXact /oRP) znajdziemy cos takiego:

; Sprawdzenie dlugosci 

>00402FC0 56             PUSH ESI
 00402FC1 8B742408       MOV  ESI, [ESP + 08]
 00402FC5 56             PUSH ESI
 00402FC6 E835000000     CALL 00403000             ; sprawdzenie dlugosci
 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 zle
 00402FD4 5E             POP  ESI
 00402FD5 C3             RET                       ; powrót

; 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                       ; powrót

Z wielu mozliwosci modyfikowania tego kodu mozna tak:

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

Teraz w czasie sprawdzania dlugosci nastapi wpisanie w EAX 1 czyli poprawny kod i nastapi powrót do glównego programu bez dalszego sprawdzania.