Hákování

úmyslná úprava procedury programovacího jazyka
Tento článek je o pojmu z informatiky. O zakázaném bránění v ledním hokeji pojednává článek Hákování (lední hokej).

Hákování procedur či funkcí (anglicky Function Hooking) je termín popisující úmyslnou úpravu procedury programovacího jazyka. Hákování způsobí, že je pozměněna funkcionalita této procedury.

Takto upravená funkce může být využita pro potřeby debugování systému, sdělování informací o svém průběhu, vstupních a výstupních parametrech třetím stranám, či k pozměnění chování cílového počítačového programu.

Hákování však může být použito i škodlivým kódem. Například takzvaný bot, což je program automatizující určitou činnost, která by měla být vykonávána člověkem, využívá k volání procedur napadeného programu právě hákování.

Podobným případem je Rootkit, neboli počítačový virus, který díky hákování procedur API operačního systému dokáže skrýt svou aktivitu.

Metody hákování editovat

Modifikace zdrojového kódu editovat

Hákování je možno provést změnou kódu u spustitelného souboru ještě před jeho spuštěním. Nejobvykleji se jedná o soubor s koncovkou exe pro platformu Windows. Takový soubor obsahuje kód v jazyku Assembler, od kterého je možno přidat Hook.

Další možností je využít tabulku importů takového programu, ve které jsou uloženy záznamy externích procedur, které bude muset program při svém spuštění importovat z dynamické knihovny, což je na platformě Windows soubor s koncovkou .dll. Tato knihovna obsahuje definice funkcí, které jsou používány v rámci více programů běžících na operačním systému. Pomocí změny záznamu v tabulce importů programu je tak možno při jeho spuštění načíst a používat funkce obsahující Hook.

Alternativním postupem je vytvoření vlastní upravené dynamické knihovny se stejným názvem knihovny původní, a tuto novou knihovnu lze poté umístit přímo do složky se spouštěným programem, která bude při spuštění preferována, či nahradit knihovnu původní.[1]

Modifikace kódu za chodu editovat

Operační systémy mohou poskytovat funkcionalitu k dosažení hákování určitých funkcí přímo za chodu cílového programu. Obvykle je hákování v tomto smyslu využíváno pro monitorování procesů, úpravu různých prvků GUI, jako jsou dialogová okna, menu a další objekty. Hákování také umožňuje odchytit akce provedené na klávesnici či jiném periferním zařízení ještě předtím, než dorazí do aplikace.

Pokud tato funkcionalita není operačním systémem poskytována, je možno umístit Hook přímo do tabulky IVT, což je tabulka obsahující odkazy na procedury, které jsou volány v různých situacích zaznamenaných operačním systémem, například při registraci aktivity na klávesnici.

Hákování tabulky virtuálních funkcí editovat

Vždy, když třída definuje svou metodu jako virtuální, kompilátor v pozadí přidá proměnnou ke třídě, která odkazuje na tabulku virtuálních metod. Většina kompilátorů umístí odkaz k této tabulce do prvních čtyř bajtů každé třídy. Tato tabulka je v podstatě pole odkazů na všechny virtuální metody, které mohou různé instance tříd volat. Tyto odkazy jsou nastaveny až za běhu programu, neboť v čase kompilace ještě není známo, jestli bude volána funkce v základní třídě, či předefinovaná metoda ve třídě z ní dědící. Virtuální funkce mohou být tedy hákovány, pokud dojde k nahrazení odkazu na funkci v tabulce virtuálních metod odkazem na funkci jinou.

Hákování API funkcí editovat

Funkce API jsou hákovány způsobem, kdy je prvních 6 bajtů cílové funkce přepsáno příkaze JMP, následovaného adresou funkce nové. Tento příkaz způsobí skok běhu programu na specifikovanou adresu. Tento kód je poté zkompilován do souboru s koncovkou .dll a je načten do cílového procesu pomocí techniky dll injekce. Pomocí zálohy přepsaných bajtů z původní funkce je možno změněný kód opět vrátit do původního stavu.

Další možností je tyto přepsané instrukce umístit na začátek funkce, na kterou bude kód po přepsání odkazovat. Tímto způsobem nedojde k narušení exekuce kódu, neboť přepsané bajty budou provedeny ihned po spuštění příkazu JMP.

Hákování funkcí v tabulce importů editovat

Hákování funkcí v IAT může být použito na funkce, které patří do jiného procesu. Kód musí být kompilován do souboru .dll a načten do cílového procesu pomocí techniky dll injekce. Výhodami této metody je menší šance odhalení Anticheat či antivirovým programem, neboť se jedná o externí hákovací metodu. Spustitelný soubor pro platformu Windows obsahuje v hlavičce prostor pro tabulku importů. Jedná se o tabulku obsahující odkazy na externí funkce. Ty jsou do této tabulky zapsány při spuštění programu. Tyto ukazatele mohou být podobně jako v případě tabulky virtuálních funkcí přepsány odkazem, který místo funkcí původních bude odkazovat na jiné funkce.

Programy pro hákování editovat

Nejjednodušší programy sloužící k úpravě statických souborů umí zobrazit pole bajtů, které tvoří daný soubor. Toto pole je pro přehlednost zobrazeno v šestnáctkové soustavě. Programy obvykle poskytují i textovou ASCII reprezentaci těchto bajtů. Příkladem takového programu ke čtení a editaci paměti je Hex Workshop.

Pokročilejší programy, takzvané debuggery umí měnit kód programu jak staticky, tak i za běhu. Takové programy jsou schopny spustit program v kontrolovaném prostředí, a uživatel je schopen zastavit chod programu na určitém místě podle volaných funkcí, či podle umístěných Breakpointů. Příkladem takového debuggeru je x64 Debugger.

Nejmodernější programy umí v kombinaci s výše zmíněnou funkcionalitou graficky zobrazit přímo jednotlivé funkce programu, a znázornit běh kódu těmito funkcemi. Programy, které dokážou navíc po přečtení kódu čitelného procesorem (Assembly) odhadnout a zobrazit, jak by tento kód mohl vypadat v lidsky čitelném jazyce (obvykle c++) se nazývá Dekompilátor. Všemi těmito funkcemi disponuje například Ida Pro.[2]

Praktické využití hákování editovat

Zkoumání potenciálně škodlivých programů editovat

Hákování procedur je hojně využíváno při výzkumu potenciálně škodlivých počítačových programů. Takové programy je pro komplexní analýzu obvykle nutné zkoumat za běhu, spuštěním takových programů by však mohlo způsobit selhání či subverzi systému. Proto se používá virtuální prostředí, které by v ideálním případě mělo být pro škodlivý program nerozeznatelné od skutečné oběti.

Takové virtuální prostředí tedy nabízí stejné API funkce, jako typický operační systém, tyto funkce mají však v sobě umístěný Hook. Po zavolání API funkce škodlivým programem dojde ke spuštění Hooku, který má obvykle na starost předání vstupních parametrů funkce, spolu s dalšími informacemi užitečnými k forenzní analýze, jako je čas a počet volání funkce.[1]

Využití komerčními aplikacemi editovat

Hákování aplikací je běžně využíváno programy třetích stran k dosažení určité specifické funkcionality. Například program OBS Studio, který slouží k streamování a nahrávání zvuku a obrazu využívá hákování procedur. V rámci této aplikace je možno zvolit jako zdroj obrazu přímo konkrétní aplikaci, přičemž následně je v kódu této aplikace vytvořen Hook, který přesměrovává data z aplikace přímo do OBS Studia. Nejčastěji jsou aplikace přesměrovávány do dynamické knihovny třetí strany. V případě aplikace OBS Studio bývá Hook nejčastěji umístěn do procedur grafické knihovny DirectX, kterou využívá většina grafických aplikací.

Rozšíření základní funkcionality programu editovat

Obdobně využívají hákování například aplikace měřící počet snímků za sekundu u běžícího programu nebo aplikace přidávající grafický překryvný panel přímo do okna programu. Tato vylepšení se poté projeví přímo v programu.

Zneužití hákování editovat

Nejčastější zneužití hákování v této kategorii lze přisoudit takzvaným bottovacím programům, které automatizují interakci uživatele s koncovým programem. Ve velké míře je toto chování proti pravidlům užití daného programu či dokonce protizákonné.

Nejrozšířenější se staly tyto automatizující programy v oblasti online počítačových her. Bottovací programy dokážou asistovat hráčům v určitých aspektech hraní, v krajních případech dokážou kompletně zastoupit hráče, což umožňuje simulovat teoreticky neomezené množství hráčů.

Takový program se nabourá do běžícího kódu hry v paměti počítače a přepíše potřebné oblasti, čímž vytvoří potřebný Hook. V případě menší změny může dojít k vložení kódu přímo do paměti, Jde-li o větší změnu, je možno napadený kód odkázat na externí program, jehož funkce jsou poté volány háky z napadeného programu.

Kvůli rostoucím problémům kvůli bottovacím softwarům vzniklo nové odvětví antivirové ochrany pro herní software. Tato ochrana je označována jako Anticheat.[2]

Reference editovat

  1. a b BLUNDEN, Bill. The Rootkit Arsenal: Escape and Evasion in the Dark Corners of the System. 2. vyd. USA: Jones and Bartlett Publishers, Inc., 2012. 
  2. a b CANO, Nick. Game Hacking: Developing Autonomous Bots for Online Games. 1. vyd. USA: No Starch Press, 2015.