Ondřej Brichta 14.11.2005
Kadý tvůrce flashových animací se časem zamyslí nad otázkou, jak by mohl ochránit své jedinečné výtvory před nenechavými zloději kódů a objektů. Dnes si ukáeme, jak alespoň částečně zabránit těmto neádoucím zásahům.
Toto je asi první cesta, kterou se vydáme, pokud chceme ochránit své flashové animace. Napíeme do přísluného políčka heslo a jsme spokojeni. Zatím se nic neděje, ale pak v dlouhé chvíli zadáme do fulltextového vyhledávače heslo swf decompile a máme po klidu. Pokud bychom si ovem pozorně přečetli specifikaci swf formátu, toto zjitění by nás pak nepřekvapilo.
Je to způsobeno otevřeným formátem flashových souborů. Znamená to, e jsou dostupné informace o tom, kde a jakým způsobem jsou uloeny data v swf souborech. To umoňuje vývoj irokého spektra nástrojů, které umí generovat a pracovat se swf soubory.
Heslo, které jsme tak v dobré víře zadali do políčka, ochrání flashový soubor před importem do samotného Flashe. Pokud ale pouijeme některý z dostupných dekompilerů, je nám heslo k ničemu.
Nejnovějí nástroje určené pro extrahování dat ze swf souborů jsou schopné dostat prakticky vekeré potřebné objekty a části naí animace. A ji se jedná o pouité obrázky, zvuky, vektorové objekty, vloená písma a bohuel i zdrojový kód ActionScriptu, nic není bezpečné proti těmto nástrojům.
Ovem hned na začátku musím upozornit, e diskutované dekompilery jsou i velmi uitečnými pomocníky v případech, kdy nedopatřením přijdeme o svůj zdrojový soubor a máme k dispozici pouze zkompilovaný swf soubor. Poslední záchranou pak často bývají nástroje pro extrahování dat a obnovu zdrojových souborů.
Nijak. V této oblasti to máme opravdu těké, zloději mají kompletní návod, jak se vloupat do naeho domu a navíc k tomu mají výkonné nástroje. My tak můeme vyklidit celý dům a nenabízet nic ke zcizení a nebo jim co nejvíce znepříjemnit cestu a odradit je tak od dalích loupeí.
Nejjednoduí je samozřejmě nic nezveřejňovat. Ale to není zrovna dobré řeení, zvlá, kdy chceme provozovat například online hry. V tomto případě se striktně řídíme pravidly, e do swf souboru nevkládáme ádná hesla, citlivé osobní údaje, přístupové kódy. Tyto údaje se snaíme načítat externě, nejlépe z databází a Flash pouíváme pouze jako vizualizační mezičlánek.
Obecně lze říci, e externí načítání proměnných a dalích objektů patří mezi nejčastějí formy obrany před útočníky. Ale kdo někdy pouíval dekompilery zdrojových kódů, jistě ví, e vechny příkazy ActionScriptu zde má jako na dlani a často i s vysvětlujícími popiskami. Jsou zachovány vekeré názvy proměnných, funkcí a objektů a proto není těké se dopátrat i ji zmíněných externích součástí.
Pokud se na to ale podíváme z druhé strany, můeme velikým počtem externě načítaných objektů znepříjemnit útočníkovi práci, který se pak raději vydá snazí cestou a nebude se vaí animací ji dále zabývat.
Asi nás napadne, e bychom mohli zdrojový kód nějak znepřehlednit. Udělat jej hodně dlouhým, nesrozumitelným, zkrátka takovým, abychom případného uchazeče o přečtení ihned odradili jeho sloitostí. Můeme se o to pokusit ručně, ale asi nás to brzy omrzí, protoe se kód pro nás stane hůře čitelným a téměř nepouitelným.
Natěstí zde ale existují účinné nástroje, které v exportovaném swf souboru provedou úpravu zdrojového kódu, který se po otevření v dekompileru buď vůbec nezobrazí a nebo se vekeré funkce a proměnné nahradí náhodnými znaky, které jsou pro člověka naprosto nečitelné, ale flashový přehrávač jim bez problémů rozumí.
Samozřejmě, e i těmto nástrojům lapou ji na paty nové verze dekompilerů, ale momentálně se mi jeví jako nejlepí forma ochrany ve spojení s načítáním externích dat a objektů. Pokud se toti podíváme do ochráněného zdrojového kódu, těko z něj vyčteme případné adresy dalích součástí aplikace.
Práce s kódovacími nástroji je velmi jednoduchá. Ukáeme si na příkladu, jak se postupuje. Dejme tomu, e jsme vytvořili naprosto geniální hru jedění s autíčkem (27.díl seriálu) a nechceme, aby se kdokoliv zmocnil jejího jedinečného zdrojového kódu.
První nástroj, který otestujeme, provádí změnu názvů proměnných a jmenuje se ASO Lite.
Jako testovací nástroj pro extrahování swf souborů pouijeme SWF Decompiler.
Pokud otevřeme nechráněný swf soubor v SWF Decompileru, bez problémů vidíme vechny akce a příkazy:
// Action script...
// [onClipEvent of sprite 3 in frame 1]
onClipEvent (load)
{
rychlost = 0;
zvukMotoru = new Sound();
zvukMotoru.attachSound("motor");
zvukMotoru.setVolume(0);
zvukMotoru.start(0, 9999);
opotrebeni = 0;
}
Pokud ale provedeme zakódování, výsledný skript je ji méně čitelný:
onClipEvent (load)
{
aso#55646 = 0;
aso#18320 = new Sound();
aso#18320.attachSound("aso#57038");
aso#18320.setVolume(0);
aso#18320.start(0, 9999);
aso#86983 = 0;
}
Vidíme, e vekeré proměnné jsou nahrazeny pro nás nesrozumitelnými výrazy. Ovem tento stupeň ochrany nás asi moc neuspokojí, pořád se v kódu dočteme dost důleitých věcí.
Vyzkouíme dalí nástroj SWF Encrypt. Po zakódování a otevření v dekompileru dostaneme u značně nečitelný kód:
onClipEvent (load)
{
var \x1 = 533;
\x1 = \x1 + 120;
if (\x1 == 440)
{
\x1 = \x1 + 268;
} // end if
if (\x1 == 653)
{
\x1 = \x1 - 213;
if (false)
{
}
else
{
\x1 = \x1 + 268;
} // end if
} // end if
if (\x1 == 708)
{
\x1 = \x1 + 211;
} // end if
if (\x1 == 919)
{
\x1 = \x1 - 318;
}
else
{
} // end if
}
Lépe řečeno, čitelný kód je, ale rozumět mu bude asi opravdu málokdo. A do třetice vyzkouíme nástroj SWF Protect.
Po jeho aplikaci dostaneme v SWF Decompileru dost nudný a nezajímavý kód:
// Action script...
// [onClipEvent of sprite 3 in frame 1]
onClipEvent (load)
{
try
{
if (![false])
{
} // end if
try
{
if (![false])
{
} // end if
try
{
if (true)
{
}
else
{
function ?(, , , , ?yî? , , , , , , , , , )
{
} // end if
}
Nástrojů pro ochranu flashových souborů je opravdu velké mnoství, proto pokud víte o některém zajímavém a účinném nástroji, můete se podělit o zkuenosti s jeho pouíváním v diskuzi k naemu seriálu.