Tento dokument slouží pouze ke studijním učelům pro vytvoření představ o tom jak může cracker cracknout vaši aplikaci a vytvoření lepší ochrany proti nim.

Je třeba si nejprve ujasnit základní věci a programy které budeme potřebovat. Potřebujeme Disassembler, nejlépe W32Dasm. Pak HIEW, nebo jiný hex editor. A pak debugger, stačí ten co je ve Visual Studiu v C++. Pak si musíme vyjasnit základní assemblerácké instrukce.

JE (JZ) - Jump If Equival - Skoč pokud odpovídá (provede se, pokud hodnoty odpovídají)
JNE - Jump If Not Equival - Skoč pokud neodpovídá (provede se, pokud se hodnoty nerovnají)
JMP - Jump - Skoč (skočí na adresu)
CMP - Compair - Porovnej - Porovná dva registry (důležitá)
PUSH - Uloží hodnotu do registru
LEA - Ukládá do cíle adresu zdroje
MOV - Ukládá isbah zdroje do cíle
NOP - Nic (nahrazením touto instrukcí na adrese se nic dít nebude)

Programy W32Dasm a HIEW si můžete stáhnout tady a tady.

Pracvoat budeme s příklady, které jsem speciálně pro tyto účely napsal. Takže stáhněte si první příklad zde a pokračujeme.

Spusťte si stažený soubor, je tam jedno textové pole a talčítko. Zkuste zadat cokoliv do textového pole a kliknout na tlačítko. Nic (pokud ste heslo neuhodli :)), Sériové číslo neodpovídá. Co stím? Spusťte si W32DASM a disassemblete náš exe soubor. Teď se musíme rozmyslet co vlastně budeme hledat. Víme, že když klikneme na tlačítko, objeví se nám MsgBox. Na MsgBoxe se importuje přímo funkce z knihoven. V menu je tlačítko a na něm popiska Imp Fn (Imports), klikněte a prohlédněte si co všechno tento exe soubor inportuje. Visual Basic importuje funkci MSVBVM60_vbaStrCmp... Tato funkce porovná dva stringy a vyhodnotí. Takže tu už máme v podstatě řešení. Klikněte dvakrát na MSVBVM60_vbaStrCmp, kurzor v disassembleném kódu se umístí na první volání této fce. Toto mi nepotřebujeme, klikněte proto ještě jednou. Pozorně se na kód pod kurzorem podívejte. Nepřijde Vám zajímavé, že přímo nad tím je Possible StringData Ref from Code Obj ->"hesloABCDEF"?? Můžete to zkusit zadat jako číslo (sakra proč jsem tam dal číslo když to číslo není? :o) funguje.. Ale takhle jednoduché všechno není. Budeme pokračovat jako bychom to chtěli normálně cracknout..

Když se podíváte o kousek níž tak narazíte na CMP SI, DI na adrese 00401D79. To jak už víme, srovnává dvě hodnoty, po pár movech tu je JE.. Copak se tady asi bude dít? :o) Skoč pokud odpovídá Si a Di.. to je zajímavé ne? zkustekliknout na JE.. V menu se enabluje Jump To. Tato fce skočí tam kam odkazuje JE. Klikněte na tlačítko Jump to a kde to jsme? V importu MSVBVM6.rtcMsgBox, když si to shrneme tak to vypadá asi takto:

1. Program zřejmě porovná dva stringy, originální a vložený, pokud se rovnají tak udělají neznámou věc a pokud ne, pak vyhodí MsgBox.
2. V disassembleru jsme našli zajímavé místo, kde se porovnají dva registry Si a Di.
3. Hned podtím je skok, pokud se rovnají skoč na funkci MsgBox

Teď už to vypadá jednoznačně, podmíněný skok na adrese 00401D8E vypadá že je rozdělovač, naše hlavní podmínka. Ale nevíme to jistě. Proto spustíme C++ debugger, načteme náš exe soubor a stikneme F10, tím se nám ukáže debug okno s disassembleným kódem. (!!hlavně nepohybujte scrollbarem nebo vám kód zmizí!!). Protože známe kde náš JE leží (adresa začínající na 00) tak stikneme ALT + F9, tím se nám otevře okno pro break pointy. Do okna Break At napište 0x00401D8E (adresa JE z W32Dasm) a dejte OK. Tím nastavíte break point. Spusťte běh programu klávesou F5, napište něco do txt pole a dejte OK.. Program se zastavil, v debug oknu můžete vidět že program se zastavil přímo na JE - Skoč pokud odpovídá. Takže je to ono. Adresu si opište (pozor, ale HEX adresu z W32DASM - v tomto případě je to 7443, ale nejlépe adresu nad ním protože občas (nevím proč) najde dvě totožné JE) - zapište si tedy adresu 8945C4, vytvořte si radši náhradní kopii našeho příkladu a ukončete běh C++ debugeru a W32DASM. Spusťte program HIEW. vyberte náš exe soubor a odentujte. nyní vidíte stroják, stikněte F4 (mode) a vyberte Decode. Teď vidíte disassemblený kód aplikace. Dejte F7 a napište tam hex adresu (8945C4). Hned Vám to ukáže vysledek, přímo pod tím je náš JE. Kurzorem najeďte na něj , stiskněte F3 a hned F2 (pro editaci v ASSM). Kurzorem najeďte až na JE a přepište ho na JNE. Tím zplsobíme že zaměníme Skoč pokud odpovídá na skoč pokud neopdovídá takže všechny možné kombinae uzná jako ok, ale tu dobrou jako špatnou :D. Enter a F9, aplikaci uložíte (zkontrolujte jestli je tam opravdu JNE místo JE). Ukončet HIEW a zkuste spustit aplikaci. zadejte cokoliv do txt boxu a stiskněte talčítko.. Funguje.. Jak jednoduché.

Shrnutí: Je velice jednoduché odhalit podmínky a cracknout je. Vždy se porovnává pomocí vbaStrCmp a msgbox je rtcMsgBox.. Dále si dávejte pozor na to, abyste neudělali stejnou chybu jako já, že přímo serové číslo bylo vidět v disassembleným kódu.

Zdrojový kód příkladu:

Private Sub Command1_Click()
If Text1.Text = "hesloABCDEF" Then 'všiměte si, že právě takto jde vidět v kódu náš originální string :-/
MsgBox "Seriové číslo je OK!!"
Else
MsgBox "Sériové číslo neodpovídá"
End If
End Sub


Cracknutím jsme vlastně udělali toto:
Private Sub Command1_Click()
If Not Text1.Text = "hesloABCDEF" Then 'všiměte si If Not (JNE)
MsgBox "Seriové číslo je OK!!"
Else
MsgBox "Sériové číslo neodpovídá"
End If
End Sub