WebConverter 2.02 by GustawKit

Cel    : LightSpeed WebConverter 2.02
Where  : CHIP CD 1/99
Tools  : SoftICE

Programik WebConver nie jest niczym wyjatkowym ale czasami moze pomoc przy konwersji duzej liczby plików tekstowych na html. Program posiada opcje umozliwiajaca zarejestrowanie go numerem seryjnym. Niektóre opcje programu jednak nawet po zarejestrowaniu nie sa dostepne poniewaz nie zawarte sa w wersji shareware.

P.s. Nie bede zaglebial sie w szczególy szukania i zastawiania pulapek bo to juz opisalem w innych tutorach. Tutaj skoncentrujemy sie na procedurach generowania danych rejestracyjnych.

Spróbujmy przy pomocy SoftIce'a znalezc poprawny numer seryjny. Program umozliwia wpisanie danych do okienka dialogowego. Nas bedzie interesowalo przede wszystkim UserName i Registration number. Wpisujemy swoje ulubione dane (np. GustawKit i 654321 :-)), zakladamy standardowe pulapki na funkcjach API pobierajacych dane z okienek dialogowych. SI elegancko przejmie kontrole i po krótkiej analizie kodu dojdziemy do miejsca decydujacego o zarejestrowaniu programu. Oto one :

014F:00404566    MOV     ECX,ESI
014F:00404568    CALL    004043F0    ; Wywolanie funkcji
014F:0040456D    TEST    EAX,EAX     ; Jezeli EAX rozne od 0
014F:0040456F    JNZ     00404596    ; to jestesmy zarejestrowani
014F:00404571    PUSH    EAX

No wiec oczywiscie interesuje nas wywolanie CALL w którym znajdujemy wiele interesujacych rzeczy :

014F:00404409    MOV     ESI,[ESP+000000A4]  <-- adres naszego nr. 6543210
014F:00404410    LEA     EDX,[ESP+14]
014F:00404414    ADD     ESP,0C
014F:00404417    XOR     ECX,ECX
014F:00404419    MOV     EDI,EAX
014F:0040441B    SUB     EDX,ESI
014F:0040441D    MOV     AL,[ESI]        <-- zaladowanie do AL liter z numeru
014F:0040441F    TEST    AL,AL           <-- sprawdzenie czy nie zero
014F:00404421    JZ      0040442D
014F:00404423    MOV     [EDX+ESI],AL
014F:00404426    INC     ECX
014F:00404427    INC     ESI
014F:00404428    CMP     ECX,07          <-- sprawdzenie czy odczytal  7 liter
014F:0040442B    JL      0040441D
014F:0040442D    MOV     BYTE PTR [ECX+ESP+08],00
014F:00404432    LEA     ECX,[ESP+08]    <-- adres naszego nr. z 7 liter
014F:00404436    PUSH    004332D0        <-- ?!? tekst LSWCVT2 na stos
014F:0040443B    PUSH    ECX             <-- nasze na stos
014F:0040443C    CALL    0040DBD0        <-- sprawdzenie
014F:00404441    ADD     ESP,08
014F:00404444    TEST    EAX,EAX
014F:00404446    JZ      00404455        <-- jezeli EAX=0 to dalsze sprawdz.
014F:00404448    XOR     EAX,EAX
014F:0040444A    POP     EDI
014F:0040444B    POP     ESI
014F:0040444C    ADD     ESP,00000088
014F:00404452    RET     0008

Okazuje sie kilka rzeczy. Program pobiera z wpisanego przez nas numeru pierwszych 7 liter i kladzie na stos do uzytku w wywolaniu CALL, pobiera takze staly tekst LSWCVT2 i tez kladzie na stos. Pasowalo by zobaczyc co robi wywolanie CALL :

014F:0040DBD6    MOV     ESI,[EBP+0C]    <-- LSWCVT2
014F:0040DBD9    MOV     EDI,[EBP+08]    <-- 6543210
014F:0040DBDC    LEA     EAX,[00439B58]
014F:0040DBE2    CMP     DWORD PTR [EAX+08],00
014F:0040DBE6    JNZ     0040DC23
014F:0040DBE8    MOV     AL,FF
014F:0040DBEA    MOV     EAX,EAX
014F:0040DBEC    OR      AL,AL
014F:0040DBEE    JZ      0040DC1E
014F:0040DBF0    MOV     AL,[ESI]
014F:0040DBF2    INC     ESI
014F:0040DBF3    MOV     AH,[EDI]
014F:0040DBF5    INC     EDI
014F:0040DBF6    CMP     AH,AL
014F:0040DBF8    JZ      0040DBEC
014F:0040DBFA    SUB     AL,41               Tutaj pobierane sa do AL i AH litery z obu
014F:0040DBFC    CMP     AL,1A               hasel i odpowiednio przerabiane a nastepnie
014F:0040DBFE    SBB     CL,CL               sprawdzane.
014F:0040DC00    AND     CL,20
014F:0040DC03    ADD     AL,CL
014F:0040DC05    ADD     AL,41
014F:0040DC07    XCHG    AH,AL
014F:0040DC09    SUB     AL,41
014F:0040DC0B    CMP     AL,1A
014F:0040DC0D    SBB     CL,CL
014F:0040DC0F    AND     CL,20
014F:0040DC12    ADD     AL,CL
014F:0040DC14    ADD     AL,41
014F:0040DC16    CMP     AL,AH
014F:0040DC18    JZ      0040DBEC

No cóz polecam przesledzic powyzsza procedure zwracajac baczna uwage na rejestr EAX a szczególnie AH i AL. Okazuje sie, ze program zamienia LSWCVT2 na male litery lswcvt2 i to porównuje z wpisanym przez nas 6543210. A wiec wszystko jasne, wpisujemy numer seryjny jako lswcvt2 i co ? program jednak nadal sie nie zarejestrowal. Chwila zastanowienia i analiza co sie dzieje z naszym numerem. Okazuje sie, ze powyzsza procedura robi wszystko w porzadku i konczy sprawdzanie na 2. Interesujacy jest skok JZ 00404455. Analizujemy fragmencik kodu i nagle znajdujemy :

014F:00404474    CALL    0040A5B0
014F:00404479    ADD     ESP,04
014F:0040447C    XOR     ECX,ECX
014F:0040447E    CMP     EDI,EAX    :-)))))
014F:00404480    SETZ    CL
014F:00404483    POP     EDI
014F:00404484    MOV     EAX,ECX
014F:00404486    POP     ESI
014F:00404487    ADD     ESP,00000088
014F:0040448D    RET     0008

I ciekawe co znajduje sie w EDI i EAX przy porównaniu. Otóz w EAX mamy dane, które odczytuje program z wpisanego numeru seryjnego po 7 literze. (no a 7 pierwszych juz mamy). Natomiast w EDI jest poprawna wartosci. Wystarczy - ? EDI i mamy postac dziesietna tej wartosci np. 3833807390

No i coo ?, no i to wszystko. Nasz program rejestruje sie na lswcvt23833807390.

Zachecam do analizy kodu i znalezienia wlasnego numeru rejestracyjnego. Nie opisywalem dokladnie kodu asm i tego co sie dzieje bo wyszla by z tego wielka kniga. Kod jest raczej nieskomplikowany wiec kazdy bedzie wiedzial o co w nim biega a warto to przeanalizowac zeby wiedziec co program moze wyprawiac z danymi rejestracyjnymi. :-)