Ako som dešifroval hru

Niekedy ma zaujmu banálnosti, napríklad, prečo sa pravidelne opakujú určité znaky v súboroch. Tak som si povedal, že vyskúšam túto šifru rozlúštiť. A rozlúštil som. (+ zdrojové kódy)

Rok 2000 …

Pri hraní demo verzie hry Mutation of J.B., prvej slovenskej adventúry, ktorá sa predávala aj na západe, som si všimol, že sa v dátových súboroch opakujú stále tie isté znaky. Zaujalo ma to, lebo to vypovedalo o tom, že sú to textové súbory zašifrované pomocou funkcie XOR. Preto som sa rozhodol ich rozšifrovať.

Záber z hry Mutatuon of J.B.

Prvý pokus o dešifrovanie som robil ešte v roku 2000 pod MS-DOS v programovacom prostredí Borland C++ 3.1 a išlo o demo verziu hry, ktorá bola pribalená na diskete k časopisu Riki číslo 23. Zobral som si jeden súbor z hry, ktorý vyzeral “podozrivo” a pomocou pomocného programu som na neho aplikoval funkciu XOR.

XOR je funkcia exkluzívny OR a je základna funkcia pri kryptografii. Ja ju do detailov nebudem rozpisovať. Ak vás zaujíma, prečitajte si článok na Wikipédii.

Program pracuje tak, že prečíta 70 znakov zo súboru a postupne v 255 cykloch aplikuje funkciuXOR na každý jeden znak zo súboru. V každom jednom cykle, sú všetky znaky v reťazci (tých 70 znakov) spracované rovnakým čislom, od 1 do 255.

Šifrovacia tabuľka priamo v EXE súbore. Vľavo demo a v pravo plná hra

Takýmto spôsobom sa mi podarilo nájsť 5 vzorky, 5 znakov, ktoré som pospájal do kopy. Nepoužili iba jednoduchý XOR s rovnakým číslom pre celú ASCII tabuľku, ale na skupinu znakov použili viac znakov. Našťastie ich bolo iba 5 takže som to dokázal ľahko pospájať.

Prvá verzia dešifrovacieho programu

Na tomto základe som urobil dešifrovací program a pokúsil sa dešifrovať niektoré súbory. A bolo to presne tak, zrazu boli súbory čitateľné.

Prvý obrázok je zašifrovaný text, druhý obrázok, je rozšifrovaný

Po odšifrovaní prvého súboru ma prekvapila správa, ktorá tam na mňa čakala. Neviem koľko ľudí sa pokúsilo odšifrovať súbory z hry, ale aj vďaka tejto správe som všetko odložil a dlhé roky sa k tomu nevrátil.

Rok 2017 …

Po dlhých rokoch budovania môjho archívu som všetko stratil aj svoj archív pre zlyhanie 6TB disku v mojom NASe. Všetky fotografie, dokumenty, zálohy, … Postupne som začal archív obnovovať a našiel som aj stratené staré diskety. Vtedy som obnovil väčšinu záloh a dokumentov a dokonca aj staré zdrojové kódy. Medzi nimi aj ten pôvodný dešifrovací program.

Povedal som si, vyskúšam ho či funguje. A v tom nastalo prekvapenie, nefungoval. Rozmýšľal som, či to môže mať súvis s tým, že som to skúšal na plnej verzii. Napadlo mi, čo tak to vyskúšať na demo verzii. A vtedy som na to prišiel. Na demo verzii fungoval, takže oni medzi tým zmenili šifru. Skúšal som najprv tradičnú metódu cez svoj XorFind.c, ale nepomohlo to.

Potom som premýšlal, keď dokážem nájsť súbor, ktorý má rovnakú veľkosť v demo verzii aj plnej verzii, pravdepodobne sú rovnaké súbory, teda ak demo súbor dešifrujem a aplikujem XOR medzi týmito súbormi, mal by som dostať vo výsledku súbor v ktorom sa dookola opakuje šifra. A tak som to skúsil.

XorFiles.c

Našiel som súbor, ktorý bol rovnaký — logo — logo2.dat. A tak som medzi rozšifrovaným demo logom a zašifrovaným logom aplikoval XOR funkciu a vo výsledku som očakával, že sa mi rovnaké znaky budú po 256 znakoch (teda po každých FF hex znakoch) opakovať. Otvoril som výsledný súbor a naozaj. Znaky sa stále opakovali, ako môžete vidieť na obrázku nižšie.

Opakujúca sa šifra

Ako to vyzerá v EXE súbore? šifru môžete nájsť na konci súboru medzi konštantami.

Uložená šifrovacia tabuľka v EXE súboroch. (v červenom rámčeku)

A ešte pre zaujímavosť porovnanie jedného rozšifrovaného súboru:

Súbor scrn0.atn v demo verzii a plnej verzii

Ukážka ako vyzerá skriptovací súbor v tejto adventúre:

Ukážka súboru scrn43.atn

Ak by ste sa chceli v tom vŕtať, prikladám aj dekódovací súbor JB_Coder.c :

JB_Coder.c na github.com

Ak vám to stále nestačí tak prikladám aj druhý súbor :