Krátký kurs editace pozic 4, díl poslední

Prozatím jsme se zabývali jenom pozicemi, které nejsou nijak zabezpečené před editací. Některé hry se ale tak snadno ošálit nedají a chrání se nejrůznějšími způsoby. Některé z těchto metod se naučíme odhalovat a obcházet. Příkladem hry s velmi zajímavou pozicí je One Must Fall, na které si ukážeme editaci šifrované pozice.
Prozatím jsme se zabývali jenom pozicemi, které nejsou nijak zabezpečené před editací. Některé hry se ale tak snadno ošálit nedají a chrání se nejrůznějšími způsoby. Některé z těchto metod se naučíme odhalovat a obcházet. Příkladem hry s velmi zajímavou pozicí je One Must Fall, na které si ukážeme editaci šifrované pozice.

Když nešikovně experimentujeme se zabezpečenou pozici a uděláme nějakou chybu, přijde dříve nebo později trest. Někdy hra jenom ohlásí, že v pozici je chyba a odmítne ji načíst, někdy ji smaže a někdy hra dokonce zkolabuje. To jsou ty příznivé možnosti. Mnohem zákeřnější je, když hra normálně pokračuje a dříve zmiňované jevy se začnou projevovat až po nějaké době (třeba těsně před koncem hry). Proto si vždy uchovávejte pozici před editací i když se zdá, že je vše v pořádku.

Nejjednodušším způsobem zabezpečení pozice je použití variabilních délek bloků. Často není ani jako zabezpečení zamýšleno, ale vyplývá z charakteru pozice. Blok informací o postavě/jednotce/městě se může prodlužovat a zkracovat vlivem délky jména (Zřídkakdy. Většinou je délka jména fixní a prázdná místa se vyplní „nulami“ tedy bajty s nulovou hodnotou.) získání postavou nových schopností, předmětů postavením nových budov ve městě a podobně. Odhalení takových změn je snadné, pokud sledujeme změny pozice při výše zmiňovaných činnostech. Při editaci si musíme dávat pozor, abychom provedli potřebné modifikace adresy. Adresu je nejvýhodnější zapsat třeba takto:

Adresa síly postavy = adresa počátku bloku + délka jména + (délka_dat_o_jednom_předmětu*počet předmětů)

Někdy jsou jednotlivé bloky v pozici pokaždé v jiném pořadí. Pokud dokážeme identifikovat začátky bloků, pak vše vyřeší relativní adresy.

Další častou metodou na zabezpečení pozice je ukládání kontrolních součtů. Existují čtyři varianty:

  • Jedná se o pouhé sečtení bajtů v pozici a zaznamenání součtu na konci nebo na začátku souboru (ještě jsem se nesetkal, s tím aby byl uprostřed ale i tato možnost přichází v úvahu). Tuto variantu odhalíme tak, že ať přičteme ke kterémukoliv bajtu nějakou hodnotu, zvýší se o stejnou hodnotu i kontrolní součet. Při editaci postupujeme stejně; pokud chceme nějakou hodnotu snížit, snížíme stejně i kontrolní součet.
  • Samostatný kontrolní součet má každý blok. Postupujeme jako v prvním případě, ale musíme identifikovat místo součtu v každém bloku, který hodláme měnit.
  • Sečteny jsou jen některé hodnoty (většinou jako celek nikoliv bajt po bajtu). Toto je velmi nepříjemná varianta, kterou se těžce identifikuje. Pokud už ale zjistíme že se jedná o tuto variantu a zjistíme, které hodnoty součet ovlivňují, máme vyhráno.
  • Jedná se o součet hodnot, které jsou funkcí hodnoty, adresy v pozici, datumu, času a kdo ví čeho ještě. V takovém případě nemáme téměř šanci závislosti odhalit. Museli bychom krokovat program a pozorovat jak součet počítá, což by vyžadovalo dobrou znalost Assembleru.
Některé hry zabezpečují pozice tak, že některé hodnoty jsou zaznamenány vícekrát. Při editaci musíme zajistit, aby měly všechny stejnou hodnotu. Někdy jsou nadbytečné hodnoty nějak pozměněny (třeba je k nim přičtena nějaká hodnota). K objevení takových závislostí je třeba projevit notnou dávku trpělivosti.

Nejhorší můrou při editaci pozic je komprimovaná pozice (Pozor- komprimovaná pozice může být za jistých okolností delší než nekomprimovaná.). Většinou se sice používá algoritmus Run Length Encoding (RLE) nebo nějaká jeho mutace, ale i ty se můžou lišit výběrem řídicího kódu a dalšími detaily implementace. Opět bychom si mohli pomoct krokováním hry. Pak bychom ještě museli napsat odpovídající komprimační a dekomprimační program. Jsem člověk, který editaci pozic bere jako určitý druh sportu a proto mě bolí, že musím napsat, že v tom případě je lepší, časově úspornější, rozumnější (nehodící se škrtněte) dohrát hru poctivě. Komprimovanou pozici poznáme podle toho, že mění délku aniž bychom k tomu hře dali důvod (postavili nové město, jednotku, přešli na novou mapu a podobně), nevyskytují se v ni opakující se sekvence, chybí charakteristické bloky nul, nenajdeme nikde jména postav atd. Prostě pozice vypadá naprosto chaoticky (Je paradoxní, že čím více je soubor zkomprimovaný a tím pádem nese i více informace, tím více se podobá šumu- sekvenci náhodných bajtů.).

Posledním způsobem zabezpečení pozic, o kterém se zmíníme, je kódování neboli šifrování (budeme uvažovat jenom ty šifry, které nemění délku souboru). Existuje nepřeberné množství různých metod kódování, ale k těm nejčastěji používaným patří tzv. XORování. XOR (eXclusive OR) je logickým operátorem s aritou 2 stejně jako logická suma OR a logický součin AND. Výsledky těchto operátorů naleznete v tabulce (Pozn.: Matematici se teď jistě oprávněně bouří, že používám symbolu 1 pro označení pravdy a 0 pro označení nepravdy ale pro tentokrát mi to snad odpustí.):

A B a AND b a OR b a XOR b
1 1 1 1 0
1 0 0 1 1
0 1 0 1 1
0 0 0 0 0
Pro kódování nemůžeme použit AND ani OR, jelikož bychom ztráceli informaci. Představme si, že „tajným kódem“ šifrované pozice by byla hodnota 10101010 a šifrování provedeme tak, že budeme z každým bajtem pozice provedeme operaci (hodnota) AND 10101010 a výsledek zapíšeme do pozice. Všimněme si, že nultý, druhý, čtvrtý a šestý bit bude mít vždy nulovou hodnotu nezávisle na tom, jaká je hodnota. Tyto bity tedy nikdy nemůžeme použít pro uschování informace. Při použití OR by zase bajty první, třetí… měly vždy hodnotu 1. Zůstává nám XOR, který má navíc ještě jednu příjemnou vlastnost – šifrovací algoritmus je zároveň algoritmem dešifrovacím. Všimněme si totiž, že

((a XOR b) XOR b) = a

Teoreticky by se pro šifrování dal použít operátor s aritou 1 – NOT. Ten vyrobí z pravdy nepravdu a naopak. V praxi se ale nepoužívá jelikož je tato šifra velmi snadno odhalitelná. Někdy se šifruje přičtením konstanty ke každému bajtu (něco jako Cézarův kód nebo známá šifra ROT13). Na první pohled se zdá, že zde opět ztrácíme část informace. Když si ale uvědomíme, že v počítači 255+1=0 vidíme, že je vše v pořádku... Šifru může tvořit libovolná funkce, která ze zobrazí vstupní hodnoty (v rozmezí 0 až 255) a na základě polohy v pozici, času vzniku atd. na výstupní hodnoty, ke které existuje funkce schopna převést výše zmíněné údaje zpět na původní hodnotu (Pokud by mezi čtenáři nebyli matematici, napsal bych prostě „inverzní funkce“, ale tak si to nemůžu dovolit. Škoda ;-).

Na první pohled se nám může zdát, že šifrovaná pozice bude velmi obtížně editovatelná. Opak je pravdou. Stačí použít metodu změn a pak zkoušet význam VŠECH změněných bajtů. Pamatujme, že i zvýšení nějaké hodnoty ve hře může zapříčinit snížení v pozici. Pokud nalezneme místo zodpovědné za námi sledovanou hodnotu, musíme zkoušet tak dlouho dosazovat různé hodnoty, až dosáhneme požadovaného výsledku. Samozřejmě, že ideální by bylo rozluštění šifrovací funkce. To je ale v mnoha případech komplikované a metoda pokusů a omylů se může ukázat jako rychlejší.

Tento postup si ukážeme na příkladu pozice ze hry One Must Fall 2097 (recenze je v sekci muzeum, kde je i shareware verze této hry). Ukázkovou pozici si můžete stáhnout zde. Již na první pohled vidíme, že s touto pozicí je něco v nepořádku. Naštěstí můžeme vyloučit kompresi, protože všechny pozice mají na začátku stejnou délku. Téměř se v ní nevyskytují nuly a je plna divných sekvencí znaků jako třeba „abcdefghijklm“ což byla před šifrováním asi řada nul. O této šifře tedy můžeme prohlásit, že je jako parametr bere i adresu v pozici. My se ale prozatím nebudeme pokoušet o dešifrování, ale pokusíme se zvýšit hodnotu peněz. Koupíme si první stupeň power training, čímž se naše konto sníží o 50 dolarů a budeme sledovat změny v pozici (výsledná pozice je zde). Vidíme, že se změnily bajty na adresách 20, 28 a 9F. Když vyzkoušíme všechny hodnoty, zjistíme, že peníze jsou uloženy na adrese 28. Po několika pokusech zjistíme, že žádná hodnota nezpůsobí značnou změnu finančních prostředků. Z toho můžeme usoudit, že se jedná o vícebajtovou hodnotu. Nebudu vás déle trápit a řeknu rovnou, že pro získání dostatečného množství peněz stačí napsat na adresu 2A hodnotu např. AA. Stejným způsobem můžeme měnit i další hodnoty jako typ robotu jejich vybavení a podobně. Raději se ani neptejte, jak dlouho jsem přicházel na to, že je pozice šifrována funkcí (hodnota) XOR (adresa+AC)…

Tento výčet zabezpečovacích metod není rozhodně úplný, ale snad vystihuje většinu možností. Samozřejmě, že pokud se najde programátor s bujnou fantazii a třeba nejdříve pozici zašifruje pak zkomprimuje a pak znova zašifruje nebo programátor-surovec, který použije nějakou silnou šifru třeba DES nebo RC5 pak nemáme téměř žádnou šanci.

Dospěli jsme ke zdárnému konci této série článků. Doufám, že tento kurs mnohým z vás pomohl vyřešit dříve neřešitelné hry. Snad se mi podařilo i několik z vás přesvědčit, že editace pozic není obtížná a že od teď budu v poradně často vidět odpovědi typu „Na adresu xyz napiš hodnotu abc. To vyřeší tvoje problémy.“. A pokud vás přestane bavit hra samotná – můžete si zahrát bez dalších nákladů hru další- editaci její pozice.

Během vzniku kurzu jsem editoval pozice řady (většinou starších) her, abych získal další poznatky a metody. Byla by škoda aby táto práce přišla nazmar a proto zde uvedu některé výsledky.

Alone in the Dark – 4D90 olej do lampy, 4D9A – náboje do pušky, 4DAA – energie, 4E38 – náboje do pistole.

Alone in the Dark 2 – 68C4-energie, 68C6-náboje do pistole, 6C1E- náboje do pušky.

Syndicate – Na adrese 14 je uloženo množství peněz.

Witchhaven – 155 energie, 25D pancíř, 65 až 8D (čtyřbajtové hodnoty ale odstup mezi nimi je osm bajtů) odolnosti jednotlivých zbraní, 91 až AD počty kouzel, 139 až 141 počty lahviček.

Ravenloft – Pro první postavu. Úroveň: 97,99,9B (může mít tři povolání), od adresy A9 až B3 postupně STR, DEX, NOC, INT, WIS, CHA, na adrese 93/95 je zdraví a maximální hodnota zdraví. Za těmito údaji jsou uloženy předměty. Našel jsem tyto užitečné předměty: 4D 01 – wand of fireballs, 5F 00 Ancient Elven Plate Mail, 5A 00 – Jevelin of Lightning, 53 00 – Gauntlets of Dexterity, 69 00 Ancient Elven Sword…

Privateer – peníze jsou uloženy na adrese 305 a na adrese 41 – typ lodi (3=galaxy, asi nejlepší)

SimCity 2000 – Od adresy 28: 02 FF 20 68 = 65321 dolarů

X-COM Terror From the Deep – V souboru base.dat jsou informace o základnách. Bázovou adresou je první písmeno názvu základny. Data každé základny zabírají 296 (dec) bajtů. Na adrese +10 až +D2 (dvoubajtové hodnoty) počty předmětů na základně. V 36 (dec) bajtech od adresy +DA po +FD jsou informace o budovách (Hodnota FF-žádná stavba 00-Air-Lock, 01-Living Quaters atd.). V bajtech +FE až +121 jsou informace o stavbě (00- stavba už stojí, FF –stavba neexistuje, jiná hodnota – počet dnů, za které bude budova dostavěna).

Railroad Tycoon Deluxe – Od adresy 3D1D: 80 3E = spousta peněz.

Warcraft – Na adresách 61A a 606 zlato a dřevo.

Ishar - Od adresy 2E0 až 2FF jsou základní vlastnosti postav (vepsat 64). Na adrese 1F1 vepsat FF = 255000 peněz.

Heretic – Na adresy 10C, 110, 114, 13C, 140, 144, 148, 14C, 150 vepsat 01 = všechny zbraně a předměty.

Váš názor Další článek: Co rozlišuje muže od chlapců? Motorka!

Témata článku: , , , , , ,