Target: Multimedia Xplorer 1.40 What : Serial Tools : SoftICE
Pomijajac wszelkie formalne wprowadzenia, przejdziemy od razu do rzeczy. Program jest bardzo latwy do zlamania. Ponizsze sprawdzenie jest istotne w przypadku jego crack'owania. Postarajmy sie jednak znalezc poprawne dane rejestracyjne. Proces ten wymaga jednak dokladnego przeanalizowania kodu i procedur generujacych te dane.
A wiec do dziela:
/**** Glówne sprawdzenie czy dobry numer ****/ 014F:00472D15 E83EFAFFFF CALL 00472758Funkcja sprawdzajaca dane, AL - wynik 014F:00472D1A 84C0 TEST AL,AL Sprawdzenie czy AL=0 014F:00472D1C 0F84DF010000 JZ 00472F01 Jezeli AL=0 to zle dane rejestracyjne 014F:00472D22 8B45FC MOV EAX,[EBP-04]
Analiza kodu w wywolaniu CALL 00472758 doprowadza nas do momentu ustawienia rejestru AL
/**** Ustawienie rejestru AL *****/ 014F:004728C6 CMP EBX,[EBP-0C]Porównanie, jezeli ok to flaga Z ustawiona 014F:004728C9 SETZ BYTE PTR [EBP-05] Jezeli flaga Z ustawiona to zmien wartosc pod adr. EBP-05 na 1 014F:004728CD XOR EAX,EAX 014F:004728CF POP EDX 014F:004728D0 POP ECX 014F:004728D1 POP ECX 014F:004728D2 MOV FS:[EAX],EDX 014F:004728D5 PUSH 004728ED 014F:004728DA LEA EAX,[EBP-0210] 014F:004728E0 CALL 00403B1C 014F:004728E5 RET do 4728ED --------+ 014F:004728E6 JMP 00403544 | 014F:004728EB JMP 004728DA | 014F:004728ED MOV AL,[EBP-05] <-+ A pózniej pobranie do AL zawartosci spod EBP-05 014F:004728F0 POP EDI 014F:004728F1 POP ESI 014F:004728F2 POP EBX 014F:004728F3 MOV ESP,EBP .......i powrót RET do 4722D1A
A wiec po analizie tego fragmentu kodu okazuje sie, ze zawartosc w rejestrze AL jest rozna od 0 wtedy gdy nastapilo pozytywne porównanie zawartosci pod [EBP-0C] z zawartoscia w rejestrze EBX. Wynika z tego, ze pod tymi adresami sa porównywane wpisane dane rejestr z poprawnymi.
I faktycznie tak jest, ale program robi to w taki sposób, ze generuje z naszego UserName pewna liczbe, generuje takze z numeru seryjnego tez liczbe i porównuje je. Caly proces generowania tych liczb jest troche skomplikowany bo program wykonuje wiele operacji na rejestrach ale dla chcacego nie ma nic trudnego.
Zastawiajac pulapki na dostepie do pamieci w interesujacych nas adresach i analizie zawartosci rejestrów powinno nas doprowadzic do procedur, które generuja te liczby. I tak faktycznie jest.
Tutaj oto jest procedura generujaca numer z UserName i zapisujaca go w rejestrze EBX
/**** Generowanie numeru z UserName ********/ 014F:00472891 LEA EAX,[EBP-010C] ---> Tutaj jest adres np. GustawKit 014F:00472897 MOVZX ESI,BYTE PTR [EAX] ---> Pobranie jednego znaku z GustawKIt 014F:0047289A ADD EBX,ESI ---> EBX = EBX+ESI 014F:0047289C MOV ESI,ECX ---> ESI = ESI*ECX 014F:0047289E IMUL ESI,[EBP-04] ---> W EBP-04 jest stala wartosc 26F ESI=ESI*26F 014F:004728A2 ADD EBX,ESI ---> W EBX jest zapamietywana nasz szukana liczba 014F:004728A4 INC ECX ---> ECX=ECX+1 014F:004728A5 INC EAX ---> EAX=EAX+1 014F:004728A6 DEC EDX ---> EDX=EDX-1 014F:004728A7 JNZ 00472897
Ta procedurka po przeliczeniu GustawKit zapamieta w EBX wartosc 712F i ona bedzie porównywana z liczba obliczona z numeru seryjnego.
Teraz pasowalo by znalezc jak generowana jest liczba z numeru seryjnego. Po krótkiej analizie dochodzimy do takiego fragmentu kodu :
014F:00472874 MOV EAX,[EBP-0210] ---> tu adres numeru seryjnego 014F:0047287A CALL 00407790 ---> generowanie tej liczby (zwracana w EAX) 014F:0047287F MOV [EBP-0C],EAX ---> zapisanie jej pod adres EBP-0C 014F:00472882 XOR EDX,EDX ---> zerowanie EDX
A wiec mamy miejsce gdzie generowana jest liczba z nr.ser. i zapisywana pod adres z którego korzysta porównanie przy ustawianiu rejestru AL czyli poprawnosci danych rejestracyjny. Jak widzimy po adresach kodu procedura ta wykonywana jest troszeczke wczesniej niz procedura generowania z UserName. -:)
Pierwsza uwaga, to rejestr EAX w którym jest adres wpisanego przez nas numeru. Nie ma tam calego numeru a jedynie jego fragment. Np. przy wpisaniu 65432165 program pobiera tylko 3216. Jak to robi i gdzie moze na razie pominiemy i zajmijmy sie jak generowany jest numer.
Po analizie wywolania CALL 00407790 dochodzimy do takiego fragmentu kodu :
014F:00402CAB MOV BL,[ESI] --> pobranie do BL znaku z tekstu zawartego pod adresem ESI 014F:00402CAD INC ESI
........ tutaj porównania czy znaki poprawne itd.
014F:00402CC8 SUB BL,30 014F:00402CCB CMP BL,09 014F:00402CCE JA 00402CFA 014F:00402CD0 CMP EAX,EDI 014F:00402CD2 JA 00402CFA 014F:00402CD4 LEA EAX,[EAX*4+EAX] 014F:00402CD7 ADD EAX,EAX 014F:00402CD9 ADD EAX,EBX 014F:00402CDB MOV BL,[ESI] --> pobranie znaku i sprawdzenie czy juz konie danych 014F:00402CDD INC ESI 014F:00402CDE TEST BL,BL 014F:00402CE0 JNZ 00402CC8
i po tym wszystkim w EAX jest zapamietana ta liczba, która nas interesuje.
No cóz znamy juz jak generowany jest numer. Pozostalo wiec nam odwrócic proces generowania znajac z jak liczba bedzie porównywany. Z GustawKit otrzymalismy - 712F. A wiec nalezy znales taka liczbe, która da nam 712F. Chwilowa analiza kodu prowadzi do sympatycznego wniosku, ze powyzsza procedura po prostu zamienia liczbe z postaci dziesietnej na szesnastkowa. Dla 712F postac dziesietna wynosi 28975.
Teraz tylko pozostaje przeanalizowac procedure, która pobiera nasz wpisany numer i go obcina. To pozostawiam juz tym, którzy maja ochote pobawic sie kodem tego programu. W kazdym razie po analizie okazuje sie, ze w moim przypadku przy UserName GustawKit poprawny kod to np. 552897555.
P.s. Wazne sa te piatki bo od nich zalezy ile bedzie wyciete z wpisanego numeru -:)