Crackme 7 (Delphi) - začátečník
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 |