× Aktuálně z oboru

Vychází Game Ready ovladače pro Far Cry 5 [ clanek/2018040603-vychazi-game-ready-ovladace-pro-far-cry-5/ ]
Celá zprávička [ clanek/2018040603-vychazi-game-ready-ovladace-pro-far-cry-5/ ]

Cracking - 6. část

[ http://programujte.com/profil/3632-michal-blazek/ ]Google [ ?rel=author ]       [ http://programujte.com/profil/20356-jan-metelka/ ]Google [ ?rel=author ]       13. 1. 2007       32 831×

  • 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 [ http://mujweb.cz/www/dosms/3crackmes.zip ].

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 [ http://t4c.ic.cz/ ] Cracking
ironscrew.wz.cz/ [ http://ironscrew.wz.cz/ ] Cracking
picasso.poupe.net/ [ http://picasso.poupe.net/ ] Cracking
picasso.poupe.net/?p=links [ http://picasso.poupe.net/?p=links ] Řada odkazů na stránky zabývající se crackingem
win32asm.cjb.net [ http://win32asm.cjb.net/ ] Win32 Assembler
www.softpedia.com [ http://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.


Článek stažen z webu Programujte.com [ http://programujte.com/clanek/2006123004-cracking-6-cast/ ].