Readiris 16/32 v 3.95 by GustawKit

Target: Readiris 16/32 v 3.95
Where : CD PCWKomputer 6A/98
What  : Serial
Tools : SoftICE

Ok. dobra zaczynamy.

Instalujesz program i wpisujesz numer trial ten, który podany jest na plycie. Masz zarejestrowany jako trial, przy starcie pyta czy chcesz go zarejestrowac jako pelny. Oczywiscie, ze chcemy. Pojawia sie okienko dialogowe, u góry jest numer identyfikacyjny, u mnie byl 3153004816BF8280E02 ale ogólnie to jest on malo wazny. U dolu wpisujemy numer seryjny. Zakladam, ze SoftICE jest zaladowany, wiec przechodzimy do SoftICE (standardowo Ctrl+d) i zakladamy pulapke na wywolaniu funkcji API - GetDlgItemTextA czyli bpx GetDlgItemTextA. Przechodzimy z powrotem do programu (Ctrl+d) i wpisujemy jakis dowolny charakterystyczny numer. Ja z reguly wpisuje 654321, i naciskamy Ok. SoftICE przejmie nam kontrole nad wywolaniem funkcji GetDlgItemTextA i SoftICE wyswietli nam kod tej funkcji w module USER32. Teraz nalezy nacisnac F11 co da nam powrót do miejsca gdzie wywolana byla ta funkcja i powinien pojawic sie taki oto fragment kodu :

014F:00407FFF  FF1570574800        CALL    [USER32!GetDlgItemTextA]
014F:00408005  68027F0000          PUSH    00007F02-->Jestesmy tutaj kursorem
014F:0040800A  6A00                PUSH    00
014F:0040800C  FF1598574800        CALL    [USER32!LoadCursorA]
014F:00408012  50                  PUSH    EAX
014F:00408013  FF15B0574800        CALL    [USER32!SetCursor]
014F:00408019  8945F8              MOV     [EBP-08],EAX
014F:0040801C  FF1570554800        CALL    [KERNEL32!GetTickCount]
014F:00408022  05B80B0000          ADD     EAX,00000BB8
014F:00408027  8945FC              MOV     [EBP-04],EAX
014F:0040802A  FF1570554800        CALL    [KERNEL32!GetTickCount]
014F:00408030  3B45FC              CMP     EAX,[EBP-04]
014F:00408033  0F8305000000        JAE     0040803E
014F:00408039  E9ECFFFFFF          JMP     0040802A
014F:0040803E  8B45F8              MOV     EAX,[EBP-08]
014F:00408041  50                  PUSH    EAX
014F:00408042  FF15B0574800        CALL    [USER32!SetCursor]
014F:00408048  6828154800          PUSH    00481528    
014F:0040804D  6840154800          PUSH    00481540
014F:00408052  6810324800          PUSH    00483210
014F:00408057  E898010000          CALL    004081F4
014F:0040805C  83C40C              ADD     ESP,0C
014F:0040805F  85C0                TEST    EAX,EAX
014F:00408061  0F841B000000        JZ      00408082
014F:00408067  6A01                PUSH    01

Jestesmy teraz w momencie, kiedy program pobral dane z okienka dialogowego czyli nasz wpisany 654321. Teraz przegladamy kod programu w dól i szukamy ciekawych rzeczy. Funkcja GetTickCount pobiera jakis czas i w petli odczekuje chwile, jest to pierdola i nie ma zadnego znaczenia. Najciekawiej zapowiada sie koncowy fragment kodu :

014F:00408048  6828154800          PUSH    00481528--> tu jest wpisany numer
014F:0040804D  6840154800          PUSH    00481540     --> tu jest nr. ident. programu
014F:00408052  6810324800          PUSH    00483210     --> tu jest numer trial
014F:00408057  E898010000          CALL    004081F4     --> funkcja sprawdzajaca kod
014F:0040805C  83C40C              ADD     ESP,0C
014F:0040805F  85C0                TEST    EAX,EAX--> jezeli EAX = 0
014F:00408061  0F841B000000        JZ      00408082--> to kod poprawny

Aby dojsc do tego fragmentu mozemy sledzic po instrukcji naciskajac (F10) lub lepiej kliknac dwukrotnie myszka na linijce z PUSH 00481528 co zastawi nam pulapke na tej linii i uruchomic dalej program (F5). Program po chwili zatrzyma sie na tej linijce. Instrukcje PUSH klada na stos informacje zawarte pod danymi adresami. Jezeli chcemy cos wyswietlic to uzywamy instrukcji d czyli dajemy np. d 00481528 i w okienku data pojawi sie nam zawartosc pod tym adresem a w naszym wypadku jest to 654321 czyli kod który wpisalismy. Podobnie ogladajac 481540 - mamy tam fragment numeru identyfikacyjnego programu a pod 00483210 mamy numer trial, który byl na plytce i który wpisalismy. Nastepnie widzimy wywolanie CALL a pózniej sprawdzenie rejestru EAX i odpowiednio skok dobry kod/zly kod.

Aby dowiedziec sie z czym porównywany jest kod musimy wejsc do funkcji wywolanej w CALL czyli sledzimy program F10 i w momencie CALL wchodzimy w nia klawiszem F8. Otrzymujemy taki oto fragment kodu :

014F:004081F3  C3                  RET
014F:004081F4  55                  PUSH    EBP
014F:004081F5  8BEC                MOV     EBP,ESP
014F:004081F7  83EC70              SUB     ESP,70
014F:004081FA  53                  PUSH    EBX
014F:004081FB  56                  PUSH    ESI
014F:004081FC  57                  PUSH    EDI
014F:004081FD  8B4508              MOV     EAX,[EBP+08]
014F:00408200  50                  PUSH    EAX
014F:00408201  E8D4000000          CALL    004082DA
014F:00408206  83C404              ADD     ESP,04
014F:00408209  85C0                TEST    EAX,EAX
014F:0040820B  0F8507000000        JNZ     00408218
014F:00408211  33C0                XOR     EAX,EAX
014F:00408213  E9BD000000          JMP     004082D5
014F:00408218  8B4508              MOV     EAX,[EBP+08]
014F:0040821B  0FBE00              MOVSX   EAX,BYTE PTR [EAX]
014F:0040821E  83F834              CMP     EAX,34
014F:00408221  0F851A000000        JNZ     00408241
014F:00408227  8B4508              MOV     EAX,[EBP+08]
014F:0040822A  0FBE4001            MOVSX   EAX,BYTE PTR [EAX+01]
014F:0040822E  83F833              CMP     EAX,33
014F:00408231  0F850A000000        JNZ     00408241
014F:00408237  B801000000          MOV     EAX,00000001
014F:0040823C  E994000000          JMP     004082D5
014F:00408241  837D1000            CMP     DWORD PTR [EBP+10],00
014F:00408245  0F8507000000        JNZ     00408252
014F:0040824B  33C0                XOR     EAX,EAX
014F:0040824D  E983000000          JMP     004082D5
014F:00408252  6834314700          PUSH    00473134             -->Tu jest poprawny numer
014F:00408257  8B4510              MOV     EAX,[EBP+10]
014F:0040825A  50                  PUSH    EAX
014F:0040825B  E880DA0500          CALL    00465CE0  --> sprawdzenie
014F:00408260  83C408              ADD     ESP,08
014F:00408263  85C0                TEST    EAX,EAX
014F:00408265  0F850A000000        JNZ     00408275
014F:0040826B  B801000000          MOV     EAX,00000001
014F:00408270  E960000000          JMP     004082D5

Program tutaj porównuje wpisany przez nas kod czyli 654321 najpierw z numerem trial i cos tam jeszcze. Nie bede analizowal dokladnie bo nie ma potrzeby. Interesuje nas linijka :

014F:00408252  6834314700          PUSH    00473134

gdy dojdziemy do niej (F10) i wyswietlimy zawartosc adresu 00473134 to otrzymamy poprawny kod w okienku data. W moim wypadku bylo to 3873. Teraz uruchamiajac dalej program (CTrl+d), mozemy wczesniej wylaczyc wszystkie pulapki i wpisujemy ten wlasnie numer. Okazuje sie, ze program jest zarejestrowany. Dane zapisane sa w win.ini