Serial / name, opcode patch, zjištění správného SN, vytvoření keygenu
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:

00401284 |> 5F POP EDI
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!“