- Softwarová výbava crackera
- Disassembler
- HEX editor
- Debugger
- Debugger v praxi
Stejně jako programátor, tak i cracker potřebuje ke své práci software. Programátor potřebuje software na to, aby ze zdrojového kódu vytvořil spustitelný soubor, ale cracker potřebuje opak. Ze spustitelného souboru vytvořit zdrojový kód. Z tohoto důvodu se crackingu někdy říká reverzní (zpětné) inženýrství.
Disassembler
Disassembler dokáže převést kód programu zpět do programovacího jazyka, kterým je obvykle Assembler. Samozřejmě to není pravidlem. Existují i disassemblery, které dokáží převést kód do C nebo Visual Basicu, ale, jak už jsem řekl v minulé lekci, velice často je výsledek nepřesný (zvlášť u freewarových produktů). Disassemblerů je celá řada, nejlepšími jsou Win32Dasm a IDA Pro. Vývoj disassembleru Win32Dasm byl zastaven již před několika lety, ale získal si takovou oblibu, že stále se na něj dají sehnat fungující vylepšení. IDA Pro je v současnosti nejlepším disassemblerem a je určen i pro profesiónální účely. Dokáže překonat dost obraných opatření na ztížení disassemblingu (překazit disassembling je velice těžké, protože program není spuštěn). Například lehce prokoukne tento kód:
; nějaký kód
PUSH OFFSET NAVESTI
RET
NAVESTI:
; nějaký kód
Tento kód dělá to samé jako instrukce JMP NAVESTI. Výhoda tohoto postupu je, že je míň nápadný než instrukce JMP a některé disassemblery může zmást. Největší zbraní proti disassemblinku je aktivní SMC. Aktivní SMC mění kód programu přímo za běhu a s tím má disassembler velké potíže. Zde je ukázka jak může vypadat aktivní SMC:
.586P
.MODEL FLAT, stdcall
;---------------------------------------
; konstanty
MB_OK EQU 0
PAGE_READWRITE EQU 4
;---------------------------------------
; externí funkce, které budou použity
EXTERN MessageBoxA@16:NEAR
EXTERN VirtualProtect@16:NEAR
EXTERN ExitProcess@4:NEAR
;---------------------------------------
; direktivy pro připojení knihoven
INCLUDELIB C:\MASM32\LIB\USER32.LIB
INCLUDELIB C:\MASM32\LIB\KERNEL32.LIB
;---------------------------------------
_DATA SEGMENT
CAP DB "Zpráva", 0
MES1 DB "Kód programu nebyl změněn (neúspěch).", 0
MES2 DB "Kód programu byl modifikován (úspěch).", 0
ADRESA DD 0
LP DD 0
_DATA ENDS
_TEXT SEGMENT
START:
MOV [ADRESA], OFFSET ZMENA
PUSH OFFSET LP
PUSH PAGE_READWRITE
PUSH 10
PUSH Adresa
CALL VirtualProtect@16
MOV EBX, Adresa
MOV BYTE PTR [EBX], 74h ; na adresu danou registrem ebx nahraji
; hodnotu 74h tedy instrukci JZ
MOV EAX, 5
XOR EAX, EAX ; výsledkem této operace bude nastaven ZF
ZMENA:
JNZ USPECH ; ZF je nastaven a tato podmínka nemůže být
; splněna, proto změním instrukci na JZ
PUSH MB_OK
PUSH OFFSET CAP
PUSH OFFSET MES1
PUSH 0
CALL MesssageBoxA@16
JMP KONEC
USPECH:
PUSH MB_OK
PUSH OFFSET CAP
PUSH OFFSET MES2
PUSH 0
CALL MessageBoxA@16
KONEC:
PUSH 0
CALL ExitProcess@4
_TEXT ENDS
END START
Tento kompletní program můžete zkompilovat v MASM32 verze 7 a výš. Myslím, že na této ukázce je vidět, že nemám rád makro nástroje. Podle mě neodhalují pravou krásu programování v Assembleru. Další praktikou, která značně komplikuje disassembling je znepřehlednění kódu. Zde je ukázka:
MOV EAX, 75DA450h
MOV ECX, 852FEDh
XOR EAX, ECX
SHR EAX, 4
MOV EBX, EAX
XOR EDX, EDX
DIV EBX
Řekli byste, že tento sled instrukcí je ekvivalentem MOV EAX, 1
? Všechny praktiky pro ztížení disassemblingu se objevují v PE šifrérech/kompresorech a s těmi se ještě setkáme.
HEX editor
Prohlížet si zdrojový kód je velice užitečné, ale někdy se stane, že potřebujete něco na trvalo změnit, třeba instrukci skoku. Nejlepšími HEX editory jsou HIEW a HEX Workshop. HIEW (Hacker's View) je dle mého názoru nejlepší. Dokáže převést kód zpět do Assembleru a vy ho můžete normálně modifikovat. Nenechte se odradit jeho DOSovským vzhledem, protože ten zde dodává programu jednoduchost ovládání. Proti HEX editorům platí stejná obraná opatření jako proti disassemblerům. Dále můžete svůj program chránit pomocí kontrolního součtu programu. Existuje dost způsobů jak to udělat, ale já vám představím jenom dva. Prvním je použití funkce MapFileAndCheckSum, která se nalézá v knihovně imagehlp.dll. Parametry funkce jsou následující:
PUSH OFFSET CheckSum ; ukazatel na buffer, kam se uloží aktuální stav
PUSH OFFSET HeaderSum ; ukazatel na buffer, kam se uloží správný součet
PUSH OFFSET FileName ; ukazatel na buffer se jménem souboru
CALL MapFileAndCheckSum@12
Nevýhodou tohoto postupu je velice snadná změna správného součtu v hlavičce souboru. Poradí si s tím téměř každý PE editor. Druhou možností je použití dvou návěstí na začátku a na konci programu.
Start:
; nějaký kód
MOV EBX, OFFSET Start
MOV ECX, OFFSET Konec
SUB ECX, EBX ; v ECX se nyní nalézá délka kódu
MOV EAX, SPRAVNA_DELKA
CMP ECX, EAX
JNZ KOD_BYL_MODIFIKOVAN
; nějaký kód
Konec:
Nevýhodou je, že tento postup nepozná ekvivalentí změnu (například změnu instrukce JNZ na JZ).
Debugger
Debugger (čti dybagr) je nejdůležitějším nástrojem crackera. Název debugger vznikl dost kuriózně. Dříve za časů sálových počítačů se jeden porouchal. Nejlepší odborníci tomu nemohli přijít na kloub. Až při rozebrání počítače vědci zjistili, že se v jednom z obvodů usadila broučí rodinka (bug znamená brouk, a od této chvíle i chyba). Takže debugger je v překladu něco jako odchybovač nebo-li odlaďovací program. Původním účelem debuggeru bylo pomáhat programátorům s dolaďováním programu, ale s nástupem crackingu se začal debugger používat i k jiným účelům. Jednou ze základních funkcí debuggeru je krokování kódu instrukce po instrukci a při každé instrukci můžete sledovat změny hodnot v registrech, zásobníku i paměti. Další základní funkcí debuggeru je nastavování breakpointů.
Breakpoint
Breakpoint pozastavuje v určité chvíli běh programu. Existují různé typy breakpointů. Můžete nastavit breakpoint na určitou instrukci a až program k ní dospěje bude pozastaven, na místo v paměti, se kterým když bude pracováno, tak se běh programu pozastaví, na přerušení (instrukce INT) a, pro nás velice užitečný, breakpoint na určitou API funkci.
Debuggerů je velký výběr, ale 100 % nejlepším je produkt společnosti Numega s názvem Soft-Ice. Hodně crackerů tvrdí, že Numega je jejich nejoblíběnější firma. Schopnosti tohoto debuggeru jsou opravdu rozsáhlé a kvalitní. Je určen jak pro crackery, tak i pro programátory programující na vrcholové úrovni. Používá ho drtivá většina crackerů. Zde jste možná postřehli jeho nevýhodu. Poněvadž je nejvíce používaný, tak se na něj nejvíce zaměřují vývojáři při tvorbě ochran. To je dost nepříjemné, protože když chcete s nějakým programem pracovat pomocí Soft-Ice, musíte nejdříve odstranit jeho ochranu, ale i přes tuto nepříjemnost pro Soft-Ice v současnosti neexistuje žádný vážný konkurent, který by mohl jeho postavení ohrozit. Já ho ale nepoužívám. Dříve jsem ho nepoužíval kvůli ceně, a rozhodl jsem se pro jiný debugger, ale naučil jsem se s ním pracovat tak dobře, že už Soft-Ice ani nechci. Je to OllyDbg. Musím přiznat, ač nerad, že nedosahuje kvalit Soft-Ice, ale kompenzací za to je příjemné uživatelské rozhraní, velké množství pluginů a schopnost zastat i disassembler. Já disassembler vůbec nepoužívám, protože místo něj používám právě OllyDbg. Narozdíl od Soft-Ice je OllyDbg freewarový program. Jeho autorem je Oleh Yuschuk. Dalším debuggerem, který by si to se Soft-Ice mohl rozdat je TRW 2000. Dost lidí tvrdí, že je lepší než Soft-Ice, ale bohužel nefunguje na Windows XP, takže postupně upadl v zapomnění. Nedávno se na internetu objevil Kernel Syser Debugger. Kvalit Soft-Ice ani OllyDbg nedosahuje, má ubohé možnosti breakpointů a je velice nestabilní a často mi způsobil při pouhém krokování pád systému (jeho požadavky na běh jsem splňoval trojnásobně). Všechny ukázky zde budu provádět v OllyDbg a v příští lekci vás naučím i se Soft-Ice.
V minulé části jsem vám slíbil, že si schopnosti debuggeru vyzkoušíte na nějakém crackme (program určený pro cracknutí). Speciálně pro naše účely jsem jedno vyrobil. Předem vám chci říct, že jsem nepoužil žádnou ochranu proti crackerům ani nic podobného, ale pro naše účely zatím stačí. Na konci tohoto kurzu udělám nějaký záludný. Nejprve si toto crackme stáhněte ZDE. Stiskem klávesy F3 otevřete soubor crackme.exe (který jste si právě stáhli). Než začneme cokoliv podnikat, tak prozkoumejte paměť. Hodně programátorů tam ukládá správné registrační číslo. V tomto případě jsme neuspěli, ale to jste ani nečekali, že bych vám to takhle zjednodušil. Stiskem klávesy F9 spusťte crackme, napište nějaké nesmysly a stiskněte Registrovat. Jestliže nejste dítětem štěstěny, tak jste neuspěli, ale crackme vás o neúspěchu informuje pomocí API funkce MessageBoxA. Takže si na ní nastavíme breakpoint. Stiskněte kombinaci kláves Ctrl+N a objeví se vám seznam všech použitých API funkcí. Klikněte pravým tlačítkem myši na MessageBoxA a zvolte možnost „Set breakpoint on every reference“ a znovu spusťe program (F9), napište nějaký nesmysl a stiskněte Registrovat.
Měli jsme úspěch a teď můžeme jít po vlastních stopách nahoru. Na instrukci 004011A5 se vám zobrazí šipka, která ukazuje od adresy 00401185. Pokud se tam přesunete, tak naleznete instrukci JNZ. Pokud bychom tuto instrukci předělali na JZ, tak by to bylo hotové, ale my chceme znát správné registrační číslo. Když pojedete nahoru, tak je zde několik početních operací. Nad nimi je API funkce CharUpperA, která převádí malá písmena na velká, takže je jasné, že registračním číslem bude v tomto případě řetězec. Když si pozorně projdete instrukce nad JNZ, zjistíte, že s pamětí zde pracuje pouze instrukce MOV EAX, DWORD PTR DS:[4030D3]
Podíváme se tedy do paměti na adresu 004030D3. Pravým tlačítkem označte tuto instrukci zvolte možnost „Follow in Dump > Memory address“. V panelu dole vlevo se objeví toto paměťové umístění. Je tam zadané registrační číslo, takže musíme zjistit to, co má být v EAX.
XOR EAX, EAX ; EAX = 0
XOR ECX, ECX ; ECX = 0
MOV EAX, DWORD PTR DS:[4030D3] ; EAX = zadané registrační číslo
MOV ECX, 4452415A ; ECX = 4452415Ah jako by se chystala nějaká operace
XOR EAX, ECX ; hodnoty v EAX a ECX jsou navzájem vyxorovány
XOR EDX, EDX ; EDX = 0
MOV EBX, 17777 ; EBX = 17777h
DIV EBX ; EDX:EAX / EBX = EAX a zbytek po dělení v EDX
XOR EAX, 1486 ; EAX se xoruje s hodnotou 1486h
JNZ SHORT crackme, 004011A5 ; pokud není nastaven ZF, tak bylo zadáno špatné
; registrační číslo.
Cílem instrukce XOR EAX, 1486
je, aby v EAX bylo také 1486h, a pokud se xorují dvě stejné hodnoty, tak se nastaví ZF, protože v EAX bude 0. Takže celý fór je v početní operaci, kterou by měl zvládnout žák 8. třídy. Zde je. Možná vám nebude hned jasné, co jsem vlastně provedl, ale pokud se budete chvíli koukat na ten výpočet a na kód, tak vám to určitě za chvíli dojde.
Myslím, že k lineární rovnici není co dodávat, ale možná někoho zaskočila konečná operace s xorem. Xor je logická instrukce jejíž tabulka pravdivostních hodnot vypadá takto:
Takže pokud vyxoruji to, co mi vzniklo po xoru v EAX s ECX, tak získám původní EAX, tedy správné registrační číslo. Výsledkem této operace je hodnota 5A494C42h, ale heslem musí být nějaký řetězec, a proto převedem toto číslo na znaky ASCII tabulky.
Poněvadž počítače x86 jsou little-endian, tak musíme číst text odzadu. Tím řetězcem je slovo „BLIZ“. Teď jděte do nabídky „Debug“ a zvolte volbu „Restart“, nastavte breakpoint na adresu 00401167 a spusťte program (F9). Napište správný klíč a krokujte program klávesou F7 (pokud budete chtít přeskakovat instrukce CALL, tak potom krokujte klávesou F8). Koukejte se přitom na výpočet a kód v debuggeru a uvidíte, že to vše do sebe zapadá a nakonec se vám zobrazí věta „Registrace byla úspěšně dokončena“. Možná vám to připadá těžké, ale věřte mi, že po pár dalších crackme pro vás budou tyhle výpočty a krokování denním chlebem. Chce to jen zkušenosti a nadšení. Zkuste s OllyDbg experimentovat a stáhněte si z internetu nějaké další crackme a zkoušejte je překonat.
Odkazy pro stažení použitých programů
› OllyDbg 1.10› IDA Pro 5.0
› HIEW 7.0
› Win32Dasm 8.93
Tak to je konec druhé části seriálu o crackingu. Příště se naučíme ovládat Soft-Ice, probereme ochrany programů před debuggery a představím vám další programy, se kterými cracker pracuje.