MultimediaXplorer 1.40 by GustawKit

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 -:)