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