Zpět na seznam článků     Číst komentáře (21)     Verze pro tisk

Manipulace s výsledky internetových soutěží (2)

Autor: .cCuMiNn.   
29.7.2011

I tentokrát zůstaneme u flashových her a podíváme se na možnost obejití ochrany v podobě hashe. Ten bývá předáván na stranu serveru společně se získaným skóre, a má zabránit změně výsledků během jejich odesílání na server.


Jak jsme si ukázali v předchozím dílu tohoto seriálu, je možné jednoduše ovlivnit získané skóre ve flashové hře během jeho odesílání na webový server. Uvedené praktiky je ale možné použít pouze v případě, kdy samotná hra nemá implementovánu žádnou ochranu proti nekalému jednání uživatelů.

Tvůrci flashových her jsou si ale vědomi možnosti ovlivnění výsledků tímto způsobem, a proto implementují ochranu, které je založena na odeslání hodnoty hashe společně se získaným výsledkem. Jedná se o nejčastější způsob ochrany flashových her a v internetových soutěžích se s ním tak setkáte poměrně často. Mám-li uvést konkrétní případ, pak byla tímto způsobem zabezpečena například soutěž pořádaná společností Okay u příležitosti mistrovství světa v ledním hokeji.

Vy si můžete vše vyzkoušet na této demonstrační flashové hře.



Výsledková listina


Tato ochrana funguje nejčastěji tak, že je po ukončení hry vygenerován textový řetězec, jehož součástí je také získané skóre. Vytvořen je nejčastěji spojením určité řetězcové konstanty s výsledkem:

  • "NAZEV_HRY" + score
  • "NAZEV_HRY" + score + nick

Takto získaný textový řetězec hra následně zahashuje (nejčastěji algoritmem MD5), čímž získá jedinečný otisk tohoto řetězce. Na stranu webového serveru je pak tento hash odeslán společně s dosaženým výsledkem.

score=100&hash=39c360db1fe072a1994dafb7735fda24

Server převezme z proměnné čitelnou hodnotu skóre a stejným postupem (jako flashová hra) vygeneruje odpovídající hash. Ten pak porovná s hashem obdrženým společně s výsledkem a vyhodnotí, zda uživatel padělal čitelnou hodnotu zaslaného výsledku.

V případě, že by došlo ze strany uživatele k manipulaci s čitelnou hodnotou výsledku během jeho odesílání na webový server, hash vygenerovaný z ovlivněného skóre na straně serveru by nesouhlasil s otiskem, který vytvořila hra ze skutečně dosaženého výsledku.

Mechanismus ochrany se zdá být správný a účinný. Stále ale existují cesty, kterými může být konečný výsledek zmanipulován. Jednou z těchto cest je odhalení algoritmu, pomocí kterého se získává hodnota hashe. Pokud totiž uživatel tento postup zná, může snadno nahradit během odesílání výsledků nejen hodnotu proměnné s dosaženým skóre, ale může přepsat také samotný hash. O této metodě si ovšem povíme více až v příštím dílu.

Dnes se zaměříme na jinou variantu, kterou je ovlivnění získaného výsledku již během samotného hraní flashové hry. Je jasné, že pokud je hra jednou nahrána webovým prohlížem a spuštěna, pak musí některé místo v operační paměti počítače obsahovat právě údaj o získaném počtu bodů. Pokud by se nám podařilo toto místo najít a údaj přepsat ještě před tím, než je použit k vytvoření kontrolního hashe, pak by hra na svém konci vzala hodnotu výsledného (již zmanipulovaného)skóre a včetně správně vytvořeného kontrolního hashe by ji odeslala na webový server.

Otázkou však zůstává, jak místo, kde se v operační paměti ukládá výše dosaženého skóre, identifikovat a přepsat. Mohlo by se zdát, že je možné ho najít jen s pomocí složitých technik reverzního inženýrství při použití debuggeru. Opak je však pravdou. Seznámíme se s aplikacemi, které za nás vykonají všechnu špinavou práci a místo, které uchovává výši získaného skóre, nám naservírují na stříbrném podnosu.

Pro Windows bude touto aplikací open source projekt nesoucí název Cheat Engine a v prostředí Linux se seznámíme s aplikací Scanmem.

Princip

Princip nalezení konkrétního místa v operační paměti spočívá v tom, že načteme oblast paměti, kterou zabírá náš webový browser a budeme vyhledávat nám známé hodnoty (výši skóre). To znamená, že ve chvíli, kdy získáme například skóre 123, hru stopneme a pomocí uvedených nástrojů tuto hodnotu vyhledáme v paměti. Aplikace nám s největší pravděpodobností najde takových míst hned desítky, ne-li stovky či tisíce. Pokračujeme tedy dále v hře, dokud se nám skóre nezmění například na hodnotu 156. Spustíme opětovně vyhledávání této nové hodnoty v paměti. Tentokrát však již nad dříve vyfiltrovanými daty. Nyní dostaneme už pouze jedno jediné místo v paměti, které s největší pravděpodobností obsahuje právě naše skóre. Případně může být nalezených míst stále několik a nezbývá tak, než postup dále opakovat a seznam nalezených míst postupně zužovat. Tímto způsobem zacílíme na to pravé místo v paměti a není už nic jednoduššího, než hodnotu uloženou na tomto místě přepsat.

Užiteční pomocníci

Cheat Engine

Vzhledem k tomu, že Cheat Engine je GUI aplikací, neměla by práce s ní činit problém žádnému z uživatelů Windows. Na internetu je navíc k dispozici množství různě detailních návodů a videoprezentací, které práci s touto aplikací demonstrují.

Aby však byl tento článek kompletní, uvedu zde ještě step-by-step návod, jak zmanipulovat skóre ve výše umístěné demonstrační hře.

  • Ve chvíli, kdy máme hru načtenou do operační paměti počítače (což v tuto chvíli máme, protože je součástí tohoto článku, který právě čtete), spustíme aplikaci Cheat Engine
  • V Cheat Engine stiskneme zvýrazněné tlačítko s ikonou počítače a vybereme běžící proces odpovídající spuštěnému webovému prohlížeči. V přpadě použití Firefoxu se mohou uložené proměnné nacházet jak v samotném procesu Firefox, tak v procesu plugin-container. Je tedy potřeba vyzkoušet obě varianty.
  • Spustíme hru tlačítkem "New game" a nahrajeme skóre ve výši 3 bodů.
  • Hru pozastavíme stiskem klávesy "ESC".
  • Přepneme se do aplikace Cheat Engine a do pole "Value" zadáme hodnotu našeho skóre vynásobenou osmi (viz. odstavec Hodnotu není možné vyhledat). To znamená, že budeme vyhledávat hodnotu 3x8 = 24
  • Stiskneme tlačítko "First Scan".
  • Přepneme se zpět do hry a pokračujeme v získávání dalších bodů
  • Ve chvíli kdy dosáhneme skóre 5-ti bodů, hru opět stopneme
  • Přepneme se do aplikace Cheat Engine a do pole "Value" zadáme hodnotu našeho nového skóre, opět vynásobenou osmi 5x8 = 40
  • Tentokrát stiskneme tlačítko "Next Scan" pro hledání v již vyfiltrovaných hodnotách
  • Pokud se nám v levém sloupci zobrazuje stále více nalezených hodnot, opakujeme předchozí 4 body (získáme a vyhledáme například skóre 7(56) a 9(72) bodů)
  • Ve chvíli, kdy nám Cheat Engine vyhledá už jen jedno jediné místo v paměti, které obsahuje hledanou hodnotu, označíme jej
  • Kliknutím na tlačítko s červenou šipkou přeneseme nalezenou adresu do níže umístěné tabulky
  • Klikneme pravým myšítkem na záznam umístěný ve spodní tabulce, čímž vyvoláme kontextové menu
  • Z kontextového menu vybereme volbu "Change / Value" a do zobrazeného okna vyplníme výši našeho nového skóre, které ale opět nejprve vynásobíme osmi
  • Po ukončení hry vložíme svůj nick a získané skóre odešleme
  • Zkontrolujeme výsledkovou listinu, na které se třpytí náš neuvěřitelný výsledek

Pro lepší představu přikládám demonstrační video, na kterém můžete uvedený postup shlédnout:



Scanmem

Práce s aplikací Scanmem, která je určena pro příkazový řádek a Unix-like systémy, je také velice jednoduchá. Stačí tento nástroj spustit s parametrem pidof, kterým zvolíme proces, jehož obsazenou paměť chceme zkoumat. Následně již jen vkládáme hledané hodnoty a po vyhledání konkrétního místa v paměti provedeme náhradu uložené hodnoty příkazem set.

Nejlepší bude, když si práci s nástrojem Scanmem opět ukážeme na videu:



Co nemusí vyjít

Pausnutí hry

V případě jiných her, než je zde uvedená, může být problém například s pozastavením hry, pokud tato možnost není ve hře k dispozici. V takovém případě je možné vyzkoušet vyhledat změnu přímo během samotného hraní. Cheat Engine nabízí mimojiné funkci pro ovlivnění rychlosti běžícího procesu a dokáže tak velice snadno zpomalit průběh hry, aby vyhledání hodnot během hraní nečinilo problémy. U některých her se zase naopak může hodit zrychlení, pro uspíšení herního času. Tuto manipulaci s rychlostí nazýváme Speedhack a v Cheat Enginu jí docílíme jednoduchým zatržením této volby v nabídce na pravé straně

Další možností je vyhledání koncového skóre vždy po dohrání hry. To znamená, že si hru zahrajeme několikrát po sobě a vždy na konci hry vyhledáme v Cheat Enginu konečné skóre. Ve chvíli, kdy máme zaměřenu hledanou pozici v operační paměti, můžeme tuto hodnotu přepsat a zmrazit. Když si pak spustíme hru znovu, mělo by být zafixováno námi vložené skóre. Fixaci hodnoty provedeme jednoduše tak, že vyhledané místo přetáhneme kliknutím na ikonku červené šipky do spodní tabulky a tam u této hodnoty zatrhneme volbu Frozen.

Celý postup se zmražením hodnoty ukazuje následující video:



Hodnota se sama vrací na původní

Zde uvedené praktiky fungují celkem spolehlivě u flashových her, které jednorázově odesílají výsledek po ukončení hry. U různých on-linovek, kde dochází k častější komunikaci mezi klientem a serverem, se nám sice může podařit určité hodnoty v operační paměti přepsat, ale po synchronizaci se serverem dojde často k jejich vrácení na původní hodnotu. V těchto případech nám uvedené techniky bohužel nebudou moc platné.

Hodnotu není možné vyhledat

Hned z několika důvodů není občas možné konkrétní hodnotu v operační paměti vyhledat. Často to závisí na tom, jakého datového typu je proměnná, která výši skóre uchovává. V Cheat Enginu máme k dispozici možnost zvolit si z různých datových typů. U flashových her je také velmi často nutné hledanou (a přepisovanou) hodnotu nejprve vynásobit osmi, aby mohla být nalezena. Proč je hodnota uložená v paměti posunutá o čtyři bity, bohužel nevím. Pokud se mezi vámi najde někdo, kdo zná odpověď, budu rád, když mě doplní v komentářích.

V neposlední řadě může být také implementována nějaká ta ochrana, která podobným technikám vyhledání skóre v operační paměti zabraňuje. To znamená, že je v paměti uložena jiná hodnota, než která je uživateli zobrazována. Hodnota proměnné může být například vždy násobena třemi a teprve při výstupu zobrazována a odesílána hodnota třemi vydělená. Podobně může být k hodnotě proměnné přičtena nějaká konstanta a podobně.

Přestože Cheat Engine nabízí některé funkce, které usnadňují dohledávání hodnot i v těchto případech (například dokáže vyhledat inkrementující se hodnoty, nebo je možné použít zabudovaný debugger), je jednodušší se v těchto případech uchýlit k reverzním inženýrství swf souboru, který představuje flashovou hru. Z něj totiž často nebývá problém vyextrahovat algoritmus pro tvorbu kontrolního hashe. O tom ovšem až v příštím dílu.


Líbil se Vám článek?
Budeme potěšeni, pokud vás zaujme také reklamní nabídka

Social Bookmarking

     





Hodnocení/Hlasovalo: 1.74/23

1  2  3  4  5    
(známkování jako ve škole)