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.