Crackme 2 (C) - začátečník
UPOZORNĚNÍ: TENTO DOKUMENT SLOUŽÍ POUZE KE STUDIJNÍM ÚČELŮM. AUTOR NENESE ŽÁDNOU ZODPOVĚDNOST ZA JEHO ZNEUŽITÍ
Soubor cruehead_Crackme1.zip
Nyní již známe základy používání programu OllyDbg a základní logiku crackování. Přejdeme tedy k trochu těžšímu crackme. Nejprve si crackme spustíme, otevře se okno, v menu zvolíme Help -> Register. Dostali jsme se do známého okna, program po nás chce jméno a sériové číslo, zadáme tedy libovolné údaje a klikneme na Ok. Zobrazí se zpráva „No luck there, mate!“ – nezadali jsme správné sériové číslo. Náš první úkol je program upravit tak, aby považoval za správné číslo jakékoliv, které zadáme.
Načteme crackme do debuggeru (OllyDbg). Už se nejedná o tak malý program, jaký byl
náš první crackme. Projití kódu by nebylo až tak zdlouhavé, ale spíše zbytečné, navíc u
velkých aplikací procháení celého kódu nepřichází v úvahu.
Musíme tedy přemýšlet, kde do programu vstoupit. První co program musí udělat před tím,
než vůbec začne porovnávat zadaná čísla je to, že získá textové řetězce z textových polí.
To je pro nás ideální místo pro vstup do programu. Stiskneme CTRL + G a do textového pole
přesně opíšeme „GetDlgItemTextA“, OK. Nyní se debugger přesunul nazačátek API
GetDlgItemTextA, kde umístíme breakpoint klávesou F2 (řádek by měl na adrese zčervenat).
Nyní program spusťme, zadáme libovolné registrační údaje a klikneme na Ok. Debugger
zastaví běh programu, protože byla zavolána API GetDlgItemTextA, my však potřebujeme
vědět, odkud byla funkce zavolána, podívame se do výpisu z paměti zásobníku (okno v pravo
dole). Na prvním řádku by mělo být tohle:
0012F9D0 CALL to GetDlgItemTextA from 004012C4
To znamená, že tato funkce byla volána z adresy 004012C4. Odstraníme breakpoint z funkce GetDlgItemTextA a skočíme na 004012C4 (CTRL + F9). Zde vidíme, že se API volá ještě jednou, kvůli zjištění zadaného „serial“. Dále vidíme, že dochází k ukončení dialogu. Kód na porovnání sériového čísla tedy není obsažen v kódu, určeném pro zpracování dialogu. Problém však je, že nevíme, odkud bylo zpracování dialogu zavoláno – budeme muset krokovat program pomocí klávesy F8. Postupným mačkýním klávesy F8 se dostaneme na tento kód:
00401285 |. 5E POP ESI
00401286 |. 5B POP EBX
00401287 |. C9 LEAVE
00401288 |. C2 1000 RETN 10
Kód zpracování dialogu byl totiž zavolán API funkcí, která má na starost „hlídat“, co se
v okně děje a vykonat tak adekvátní operaci – v tomto případě skok na kód, který zpracuje
data, která byla zapsána do dialogu. Musíme tedy pokračovat v mačkání klávesy F8, projdeme
tak kód několika funkcí a knihovne. Klávesu F8 můžete držet do té doby, než se nedostaneme
do kódu programu, který začíná na adrese 00401223 (cmp eax, 0). Pokud jste tuto adresu
„přejeli“, nic se neděje, program spusťte klávesou F9, vyplňte znovu registrační údaje a
odsouhlaste. Pokud se vše povedlo, měli byste nyní být na adrese 00401223, pokud jste někde
zapomněli breakpoint, tak jej odstraňte a pokračujte klávesou F9.
Nyní byste před sebou měli mít následující kód, kteý si detailně popíšeme:
| ;zjištění, jestli byl dialog správně vyplnět, pokud ne, skočí na konec | |
| 00401223 CMP EAX,0 | |
| 00401226 JE SHORT 004011E6 | |
| 00401228 PUSH 0040218E | ;zadané jméno |
| 0040122D CALL0040137E | ;volání první funkce |
| 00401232 PUSH EAX | ;záloha výsledku první funkce |
| 00401233 PUSH 0040217E | ;zadané sériové číslo |
| 00401238 CALL004013D8 | ;volání druhé funkce |
| 0040123D ADD ESP,4 | ;vyčištění zásobníku předchoží funkce |
| 00401240 POP EAX | ;obnovení výsledku první funkce do EAX |
| 00401241 CMP EAX,EBX | ;porovnání výsledku první a druhé funkce |
| 00401243 JE SHORT 0040124C | ;pokud EAX = EBX pak skoč na 0040124C, |
| 00401245 CALL 00401362 | ;skok na „No luck!“ |
| 0040124A JMP SHORT 004011E6 | ;skok na konec procedury |
| 0040124C CALL 0040134D | ;zobrazení „Great work!“ |