Target: BusinessCards/32 v4.19 for Windows'9x/NT Where : CD PCWKomputer 11A/98 What : Serial Tools : SoftICE
Przypadkowo zabralem sie za ten programik i postanowilem zrobic malego tutora. Nie jest to zaden wyjatkowy program i znalezienie numeru zajmuje kilkanascie sekund, jednak ma pare ciekawostek a raczej przejawów glupoty. No wiec ladujemy program, znajdujemy mozliwosc wpisania poprawnego numeru seryjnego. Wpisujemy swoje ulubione dane i przechodzimy do SoftICE. Zakladamy standardowe pulapki, w przypadku tego programu zadziala pulapka na funkcji API GetDlgItemTextA. Czyli bpx GetDlgItemTextA i Ctr+d a nastepnie wciskamy Ok. SoftICE przejmie kontrole na pierwszym wywolaniu funkcji GetDlgItemTextA. Funkcja wywolywana jest trzy razy, wiec za kazdym wychodzimy z User32 klawiszem F11 i otrzymujemy taki oto fragment kodu
014F:00412CF2 8D8DF0FEFFFF LEA ECX,[EBP-0110] --> Jestesmy tutaj 014F:00412CF8 8B35F0474300 MOV ESI,[KERNEL32!lstrlen]--> pózniej wywolywane sa 014F:00412CFE 51 PUSH ECX --> funkcje sprawdzajace 014F:00412CFF FFD6 CALL ESI --> dlugosc wpisanych danych 014F:00412D01 85C0 TEST EAX,EAX 014F:00412D03 7528 JNZ 00412D2D 014F:00412D05 8D852CFFFFFF LEA EAX,[EBP-00D4] 014F:00412D0B 50 PUSH EAX 014F:00412D0C FFD6 CALL ESI 014F:00412D0E 85C0 TEST EAX,EAX 014F:00412D10 741B JZ 00412D2D 014F:00412D12 8D852CFFFFFF LEA EAX,[EBP-00D4] 014F:00412D18 8D8DF0FEFFFF LEA ECX,[EBP-0110] 014F:00412D1E 50 PUSH EAX 014F:00412D1F 51 PUSH ECX 014F:00412D20 FF15E8474300 CALL [KERNEL32!lstrcat] 014F:00412D26 C6852CFFFFFF00 MOV BYTE PTR [EBP-00D4],00 014F:00412D2D 8D85F0FEFFFF LEA EAX,[EBP-0110] 014F:00412D33 50 PUSH EAX 014F:00412D34 FFD6 CALL ESI 014F:00412D36 85C0 TEST EAX,EAX 014F:00412D38 0F8454010000 JZ 00412E92
w rejestrach eax, ecx ciagle zmieniaja sie adresy wpisanych przez nas tekstów, pózniej sa one kopiowane w pamieci i tak dalej. Ogólnie to niewazne jest co sie z nimi dzieje. Sledzimy program krok po kroku (F10) az dojdziemy do takiego fragmentu kodu:
014F:00412E12 7413 JZ 00412E27 014F:00412E14 8D45F4 LEA EAX,[EBP-0C] 014F:00412E17 50 PUSH EAX 014F:00412E18 E81D0D0000 CALL 00413B3A 014F:00412E1D 83C404 ADD ESP,04 014F:00412E20 3D41BC1316 CMP EAX,1613BC41 014F:00412E25 756B JNZ 00412E92 014F:00412E27 81EC8C000000 SUB ESP,0000008C 014F:00412E2D 8DB568FFFFFF LEA ESI,[EBP-0098]
To wyglada ciekawie, wreszcie jakies konkretne wywolanie funkcji - CALL 00413B3A i sprawdzenie rejestru EAX a pózniej skok warunkowy. Jezeli w linii skoku JNZ 00412E92 zmienimy flage zerowa na przeciwna (r fl z) i puscimy program dalej to pojawi sie okienko o zarejestrowaniu. Czyli jestesmy w dobrym miejscu. Ponownie wracam do miejsca wywolania CALL. Wypadalo by przygladnac sie temu wywolaniu, teoretycznie cos ono tam robi z naszym numerem ale nie warto sie tym zajmowac. Szybko okazuje sie, ze decydujace znaczenie ma porównanie CMP EAX,1613BC41. Gdy zagladniemy na wartosc rejestru to jest tam wpisany przez nas numer. Czyli sprawa jest prymitywna, poprawny kod to 1613BC41. I to wszystko, wpisujemy ten kod w okienku dialogowym i program zarejestrowany. Nalezy przyznac autorowi glupote jakich malo, caly ten kod mozna bylo zapisac w kilku linijkach kodu bez jakichkolwiek sprawdzan dlugosci itp a efekt bylby ten sam.
Jedyna ciekawa rzecza jest to, ze dane rejestracyjne zapisywane sa w bibliotece bcr32.dll, co jest rzadko spotykane. No cóz pewnie autor nie lubi rejestrów ani plików ini.
Zycze milej zabawy.