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

Zdroj: SOOM.cz [ISSN 1804-7270]
Autor: .cCuMiNn.
Datum: 3.8.2011
Hodnocení/Hlasovalo: 1.44/18

V minulém dílu seriálu jsme si řekli něco o možnostech ovlivnění výsledků flashových her během jejich hraní tím, že jsme přepsali výši skóre v operační paměti počítače. Naznačil jsem ale také, že je možné odlišit zobrazované skóre od hodnoty uložené v paměti a tím dohledání této hodnoty v paměti znemožnit. Tentokrát si tedy povíme něco o dekompilaci flashových her vedoucí ke zjištění algoritmu, kterým je tvořen kontrolní hash.

V případech, kdy hra odesílá společně s čitelným skóre také kontrolní hash, ale hodnotu skóre není možné dohledat v operační paměti počítače, přichází na řadu postupy, pomocí kterých je možné zjistit způsob vytváření kontrolního hashe. Pokud je totiž tento algoritmus znám, není problém vytvořit například jednoduchý skript, který na požadovanou výši skóre odpoví správným kontrolním hashem. Když potom dochází k odesílání výsledků na webový server, je pomocí technik uvedených v prvním díle, možné požadavek zachytit a kromě čitelné hodnoty skóre v něm přepsat i vygenerovaný kontrolní hash. Pochopitelně je přepisování odesílaných hodnot tímto způsobem poněkud těžkopádným řešením. Samotný skript totiž může odeslat požadovaný výsledek včetně hashe přímo webovému serveru. O tom ovšem zase až v některém z dalších dílů.

Jak tedy zjistit algoritmus, kterým je kontrolní hash vytvářen? Jedním ze způsobů je stažení flashové hry na lokální disk, kde hru otevřeme v programu určeném pro dekompilaci Action Scriptu. Nejprve si ale řekneme, jak vůbec zjistit, kde je hra na serveru uložena a jakým způsobem je možné ji z tohoto umístění stáhnout.

Flashové hry představují soubory s příponou .swf a do HTML stránky jsou nejčastěji vkládány jako objekty. Mohlo by se tedy zdát, že prozkoumáním zdrojového kódu webové stránky s hrou, je možné jejich umístění snadno odhalit vyhledáním řetězce .swf. Bohužel tak ale často získáme pouze umístění různých preloaderů, které teprve samotnou hru dotahují. Nejlepší tedy je, provést během načítání flashové hry průzkum HTTP komunikace pomocí lokálního proxy, viz. první díl tohoto seriálu. Pokud se vyfiltrují pouze ty požadavky, které obsahují právě zmíněný řetězec .swf, je možné získat přehled o umístění všech flashových swf souborů, které browser načetl.

Potom už stačí jen správně odhadnout, který z těchto souborů představuje danou flashovou hru a tento soubor stáhnout na lokální disk. V případě, že to není možné určit podle jeho názvu, stačí tyto soubory postupně otevřít ve webovém prohlížeči a zjistit tak jejich obsah. Doplněk Firefoxu Tamper Data, se kterým jsme se již seznámili, nám může tuto činnost také usnadnit, protože nabízí možnost vyvolat nad každým záznamem zachycené komunikace kontextové menu a volbou Open in browser odeslat tento požadavek do nového okna prohlížeče.

Ve chvíli, kdy je známo umístění souboru s hrou, již nic nebrání jeho stažení pomocí nástrojů jako jsou wget nebo netcat. Stažení souboru umožní ale také jednoduchá HTML stránka s odkazem na tento soubor a vyvolání kontextové nabídky nad tímto odkazem ve webovém prohlížeči, ze které je možné uložit cíl na lokální disk.

OK, swf souhor s flashovou hrou je tedy uložen na lokálním disku (není podmínkou). Co dál? Nyní je možné použít některý z nepřeberného množství programů pro dekompilaci Action Scriptu ze swf souborů. Osobně používám on-line dekompiler, který je dostupný na http://www.showmycode.com. Jeho výhodou je, že je nezávislý na platformě, není nutné swf soubor ukládat na lokální disk a bez problémů zvládá dekopilaci Action Scriptu 2 i 3. Problém mu ale bohužel občas činí některé větší soubory.

Po návštěvě webové stránky zmíněného on-line dekompileru stačí vyhledat swf soubor na disku nebo vložit přímo URI k tomuto souboru. Po opsání jednoduché captchy, která je tvořena jediným znakem, a po odeslání požadavku tlačítkem Show My Code, je během pár vteřin vrácen dekompilovaný kód.

Tento kód stačí prohlédnout a najít místo, které má na svědomí tvorbu kontrolního hashe. Často stačí vyhledat textové řetězce názvů předávaných proménných s výsledkem (score) nebo hashem (hash).


Vše si můžete opět v praxi vyzkoušet na této flashové hře:


Výsledková listina


Pokud jste si výše uvedený postup vyzkoušeli na této flashové hře, pak se vám jistě podařilo bez větších obtíží najít v kódu tento řádek:

sendInfo.hash = MD5("FLASH3"+((_root.score-120)/9));

Na první pohled je z této části Action Scriptu patrné, jakým způsobem je kontrolní hash vytvářen a dokonce i jak je hodnota skóre uložena v paměti, aby nešla dohledat. Pro nás je nyní důležité, že hash je tvořen algoritmem MD5 a skládá se z textového řetězce FLASH3 a z konečné hodnoty dosaženého skóre.

Pokud bysme chtěli zmanipulovat skóre a změnit jej například na hodnotu 2000 bodů, stačí vytvořit MD5 hash z řetězece FLASH32000. K získání hashe můžete použít například zdejší MD5 Crypter, který vám vrátí tento hash: 03c3e00bb1681dcd4855e17f0ad9e2e0.

Následně budeme postupovat stejným způsobem, kterým jsme v prvním dílu tohoto seriálu měnili výši odesílaného skóre. Po dohrání hry odchytíme pomocí lokálního proxy HTTP požadavek a přepíšeme čitelnou hodnotu skóre v POST proměnné score na hodnotu 2000 a hodnotu v proměnné hash nahradíme námi vygenerovaným hashem 03c3e00bb16.... Po odeslání požadavku by se zfalšované skóre mělo objevit ve výsledkové listině.


Pro úplnost přikládám ještě video, znázorňující celý uvedený postup:


Závěrem bych chtěl upozornit, že nelegální není pouze falšování dosažených výsledků, ale v tomto případě už i samotná dekompilace swf souboru. Mějte proto tuto skutečnost na paměti a celý postup zkoušejte jen na zde přiložené flashové hře, k jejíž dekompilaci uděluji svůj souhlas :)