SN, zjištění správného sériového čísla, keygen
Delphi CrackMe 1. UPOZORNĚNÍ: TENTO DOKUMENT SLOUŽÍ POUZE KE STUDIJNÍM ÚČELŮM. AUTOR NENESE ŽÁDNOU ZODPOVĚDNOST ZA JEHO ZNEUŽITÍ

Soubor CrackMe1.zip

První věc, které byste si měli u exe souborů vytvořených v Delphi všimnout je, že jsou poměrně velké, i několika řádkový program má po kompilaci více, jak 300kB (což je způsobeno tím, že do exe souboru jsou vkládány i esenciální funkce jazyka Delphi, aby nebylo potřeba k jejich spuštění žádné doprovodné knihovny tak, jak je tomu např. u Visual Basicu.). Pokud by si cracker chtěl ověřit, zda-li se opravdu jedná o program napsaný v Delphi, použije program Stud PE, který zobrazuje jazyk, ve kterém byl daný exe soubor kompilován. Případně soubor otevře v prohlížeči a jednoduše nechá vyhledat textový řetězec „Delphi“, který je zde několikrát obsažen.
Jako vždy nejprve spustíme crackme, abychom zjistili nějaké záchytné body. Jedná se o klasické crackme založené na jménu a sériovém čísle. Zkusíme zadat nějaké jméno a číslo – „Chybné sériové číslo“. Nebudeme marnit čas s debuggerem a rovnou použijeme specializovaný disassembler pro jazyk Delphi – DeDe (naleznete na přiloženém CD).

Spustíme tedy DeDe, klikneme na na tlačítko s obrázkem složky, vyberme CrackMe1.exe a klikneme na tlačítko Process. Po zobrazení zprávy s dotazem, jestli byl program plně načten klikněte na OK. Nyní vyčkejte než DeDe kód zanalyzuje. U dotazu, zda-li chcete rozšířenou analýzu klikněte na Ne (prozatím není potřeba). Nyní je program připraven k použití. My hledáme proceduru nebo funkci, klikneme tedy na tlačítko Procedures. Dede rozpoznal Unit 1 a vněm formulář Form1. Klikneme na rozpoznaný Unit1, v pravém okně se zobrazí rozpoznaná procedura cmdRegistrujClick což je odezva na kliknutí tlačítka Registruj. Dvakrát poklikáme na cmdRegistrujClick. Zobrazí se disassemblovaný kód procedury. Pokud jej celý projdeme nalezneme reference k textovým řetězcům, voláním API funkce MessageBox a předtím volání funkce LStrCmp.

004502BE lea edx, [ebp-$10];2. param: edx = ukazatel na zásobník
004502C1 mov eax, [edi+$02FC];1. param: identifikátor Editu
004502C7 call GetText
004502CC mov edx, [ebp-$10];EDX = ukazatel na načtený text
004502CF mov eax, [ebp-$08];interní proměnná (pravděpodobně string)
004502D2 call LStrCmp;porovnání dvou textových řetězců
004502D7 jnz 004502EE;pokud se řetězce nerovnají, skok
004502D9 push $00
004502DB push $00450334;‚OK‘
004502E0 push $00450338; 'Správné sériové číslo'
004502E5 push $00
004502E7 call MessageBoxA
004502EC jmp 00450301
004502EE push $00
004502F0 push $00450350;'Chyba'
004502F5 push $00450358;'Chybné sériové číslo'
004502FA push $00
004502FC call MessageBoxA;zobrazení zprávy
00450301 …;konec