BusinessCards/32 v4.19 for Windows'9x/NT by GustawKit

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.