- Markova pravidla ochrany softwaru
- Mexelite Productions CrackMe 4.0
- Cruehead CrackMe v1.0
- tC CrackMe [ID: 5]
- Zdroje o crackingu
- Závěr
Ochrana softwaru by neměla být pro vývojáře pátým kolem u vozu, ale také by neměla být jejich prioritou. Důvody jsou jasné. Existují totiž vývojáři, kteří vytvoří výborný program, ale jeho ochrana je téměř nulová. Naproti tomu existuje menšina fanatiků, kteří vytvoří program a opatří ho takovou hordou ochran, že program běží nesnesitelně pomalu a nestabilně. Je jasné, že je nutné udělat nějaký kompromis. Existuje tedy několik zásad, které je vhodné dodržovat. Výborně je shrnují Markova pravidla.
Markova pravidla
› Nepoužívejte smysluplné názvy souborů, proměnných, funkcí atd., které okamžitě prozradí jejich účel. Praktickým příkladem může být hra Worms 4 Mayhem, ve které je v kořenovém adresáři umístěna knihovna protect.dll
. Abych pravdu řekl, s ochranou jsem ani když jsem věděl kde je, nehnul, ale ti lepší určitě ano a tímto názvem jim byla ušetřena práce.
› Neinformujte uživatele o chybě v ochranném algoritmu aplikace ihned. Cracker si může myslet, že ochranu odstranil, ale když mu to program neohlásí, tak nemá jistotu.
› Před ověřováním správnosti zadaného hesla počkejte několik sekund, než uživateli zvěstujete výsledek. Snížíte tím riziko útoku hrubou silou (brute force), poněvadž vyhlídka crackera na překonání ochrany, při dvaceti heslech za minutu by nebyla moc optimistická. Samozřejmě, že cracker může tuto ochranu odstranit, ale každopádně mu to znepříjemní práci.
› Používejte sebemodifikující kód. Umistěte do svého programu několik chyb a při běhu je opravujte. Odstraní-li cracker rutinu pro modifikaci kódu bude program házet chyby.
› Měňte kód Vašeho programu tak, aby pokaždé byly volány jiné kontrolní rutiny.
› Ukládejte pro ochranu důležitá data na neobvyklá místa a na více míst.
› Nespoléhejte se na datum a čas uváděné systémem.
› Nepoužívejte řetězce pro zprávy o stavu ochrany (Špatné registrační číslo apod.) Tyto řetězce jsou první, co cracker v programu hledá. Generujte je nebo zašifrujte.
› Používejte falešné funkce a data. Hlavně se řiďte pravidlem: „Všeho s mírou“ Nebylo by vhodné, kdyby program s velikostí 1 MB, díky falešným funkcím zabíral 20 MB. Pokud budete do kódu vkládat falešné funkce, není dobré vkládat stejné bloky.
› Nepoužívejte ověřovací funkce Pokaždé, když chcete nějakou hodnotu ověřit, tak ji k něčemu využijte.
› Při používání zašifrovaných dat se snažte, aby vypadaly jako část programového kódu, volání funkce apod.
› Nikomu neprozraďte, jak chráníte svůj software !
Crackmes
Všechna crackmes, která zde budu ukazovat nejdříve zkuste vyřešit sami a až poté si přečtěte řešení! Tyto crackme budu řešit způsobem, že by nejeden cracker občas zakroutil hlavou, ale dle mého názoru, je pro výuku nejlepší začínat způsoby, které budu nyní praktikovat. Doporučuji si tyto tři crackmes stáhnout.
Mexelite Productions CrackMe 4.0
Soubor CrackMe4.exe otevřete ve W32Dasm, zvolte volbu Refs -> String Data References -> Nalezněte v těchto textových řetězcích úspěšné hlášení a dvakrát klikněte ("Good Serial, Thanks For trying"). Od tohoto místa půjdeme zpět „po stopách kódu“ (doporučuji v OllyDbg) a na adrese 0042DCADh
se nachází zajímavý blok:
call 004065A8 ; "nahrávací rutina"
mov dword ptr [0042F760], eax ; zadané sériové číslo
mov eax, dword ptr [0042F758] ; správné sériové číslo
cmp eax, dword ptr [0042F760] ; porovnání hodnot
jne 0042DCDB ; nerovnají-li se hodnoty,
; ohlaš neúspěch
Zde máme (stejně jako v dalších dvou příkladech, který budou následovat) dvě možnosti řešení. První je v HEX editoru změnit instrukci JNE 0042DCDB
na NOP
. My ale chceme zjistit správné sériové číslo, takže se budeme zabývat druhou alternativou, tedy nastavit v OllyDbg breakpoint na adresu 0042DCBC
a správné registrační číslo se nachází v EAX
. Tato hodnota je v HEX, je tedy nutné ji převést do DEC, ale to není žádný problém (stačí kalkulačka ve Windows nebo tužka a papír). Situaci nám zjednodušilo vstupní pole, které přijímá pouze číslice. V tomto crackme příliš neuspějete s breakpointy na API funkce, protože tento program byl naprogramován v Delphi. Konkrétně v Borland Delphi 3.0 (made in PEiD :)). Delphi není k breakpointům moc střídmé, ale OllyDbg si s tím zčásti umí poradit. Dle mého názoru (oficiálně jsem to nikde nečetl) se situace s nastavováním breakpointů s novějšími verzemi zlepšuje. Další příklad je také naprogramován v Delphi, ale v novější verzi (viz PEiD).
Cruehead CRACKME1
Toto CrackMe je opět kombinací jména a sériového čísla, i když v porovnání s předešlým znatelně obtížnější. Soubor CRACKME1.exe otevřete v OllyDbg. Spusťte CRACKME1.exe (F9) -> zvolte možnost Help -> Register -> vložte nějaké uživatelské jméno a registrační číslo. Doporučuji vždy pokusně psát do sériových čísel pouze znaky 1 - 9. Nyní nastavte breakpoint na funkci MessageBoxA. Program bude zastaven na adrese 004013BCh
, kde Vás čeká hlášení o neúspěchu. Vzhledem k velikosti souboru (tedy malinkaté) můžeme jít po vlastních stopách a kód si prostě prohlídnout. Tento postup nelze použít u větších souborů, ale u takového krátkého přehledného kódu je to asi nejlepší řešení. Za chvíli naleznete podezřelý blok kódu, začínající na adrese 00401223h
:
00401223 CMP EAX, 0 ; kontroluje, jestli byla zadána nějaká hodnota
00401226 JE SHORT CRACKME1.004011E6 ; pokud není zahlásí chybu
00401228 PUSH CRACKME1.0040218E
0040122D CALL CRACKME1.0040137E
; zde vypočítává správný kód Vámi zadaného jména.
; Nejedná se ale o sériové číslo, nýbrž o hodnotu,
; která bude použita k porovnání. Nemůžeme-ji tedy
; ihned použít
00401232 PUSH EAX ; ukládá si ji na zásobník (ZAPIŠTE SI TUTO HODNOTU!)
00401233 PUSH CRACKME1.0040217E
*00401238 CALL CRACKME1.004013D8 ; zde přepočítává zadané číslo
0040123D ADD ESP, 4
00401240 POP EAX ; vybírá si ze zásobníku hodnotu k porovnání
00401241 CMP EAX, EBX ; jsou hodnoty stejné?
00401243 JE SHORT CRACKME1.0040124C ; Ano? tak skoč
Za instrukcí call označenou * se nalézá kód:
004013D8 XOR EAX, EAX ; EAX = 0
004013DA XOR EDI, EDI ; EDI = 0
004013DC XOR EBX, EBX ; EBX = 0
004013DE MOV ESI, DWORD PTR SS:[ESP+4]
004013E2 MOV AL, 0A ; AL = 10 - maximální počet znaků, které budou zpracovány
004013E4 MOV BL, BYTE PTR DS:[ESI] ; nahraj znak do BL
004013E6 TEST BL, BL ; Je právě testovaný znak nulovým znakem značícím konec řetězce?
004013E8 JE SHORT CRACKME1.004013F5 ; Ano? Tak přejdi ke xorování
004013EA SUB BL, 30 ; (31h = číslice 1) - viz ASCII tabulka
004013ED IMUL EDI, EAX
004013F0 ADD EDI, EBX
004013F2 INC ESI
004013F3 JMP SHORT CRACKME1.004013E2
**004013F5 XOR EDI, 1234 ; vyxoruj EDI číslem 1234h
004013FB MOV EBX, EDI
004013FD RETN
Zde to začíná být trochu složitější. Pokud si ale uvědomíte, co se děje od instrukce 00401233h
do 00401243h
jistě pochopíte. Nyní použijeme číslo, které jste si zapsali u instrukce PUSH EAX
na adrese 00401232h
(od teď jej budu nazývat EAX2). Z kódu je vidět, že když vyxorujete EDI s hodnotou 1234 získáme číslo shodné s EAX2. Z tabulky pravdivostních hodnot instrukce XOR (2. část seriálu) plyne následující rovnice:
EDI^1234 = EAX2 . Po úpravě vznikne: EDI = EAX^1234. Tento výpočet provedeme třeba na kalkulačce Windows. Nezapomeňte, že počítáte s hexadecimálníma hodnotami! Nyní jste vypočetli číslo, které se má nalézat v EDI, aby byla zachována rovnost k Vašemu jménu a také správné sériové číslo.
tC CrackMe [ID: 5]
Soubor cm_id5.exe otevřete v OllyDbg. Již instinktivně nastavte breakpoint na API funkci MessageBoxA, spusťte CrackMe (F9), zadejte nesmyslné sériové číslo. Ihned se zahlásí o slovo OllyDbg. Zastaví se na adrese 00441B13h
. Podíváte-li se na panel Registers (FPU), který je standardně vpravo, určitě Vás zaujmou registry EAX a EDX. Na adrese na kterou odkazuje EAX je zadané sériové číslo a v EDX je správné. OllyDbg nám situaci opět ulehčil zobrazením hodnoty místa v paměti vedle registru. CrackMe je tedy vyřešeno. Myslím, že to bylo až moc snadné, takže toto byla ta pomyslná třešnička na dortu.
Zdroje
Internet
WWW | Zaměření |
---|---|
t4c.ic.cz | Cracking |
ironscrew.wz.cz/ | Cracking |
picasso.poupe.net/ | Cracking |
picasso.poupe.net/?p=links | Řada odkazů na stránky zabývající se crackingem |
win32asm.cjb.net | Win32 Assembler |
www.softpedia.com | Rozsáhlý výběr nástrojů pro programování i cracking |
Knihy
Autor | Publikace | Zaměření |
---|---|---|
Jakub Zemánek | Cracking bez tajemství | Cracking |
Pavol Červeň | Cracking a jak se proti němu bránit | Ochrana software |
Rudolf Marek | Učíme se programovat v jazyce Assembler pro PC | Základy Assembleru |
Vlad Pirogov | Mistrovství v jazyce Assembler | Assembler |
Závěr
Tímto odstavcem končí šestidílný seriál o crackingu. Seriál Vás měl naučit základy, které cracker musí ovládat a uvést Vás do problematiky, která je velice rozsáhlá. Pokud Vás cracking zaujal, věnujte se mu i nadále, ale pokud Vás cracking nebaví, tak se do něj nenuťte, protože to by potom nemělo cenu.