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