FTL-Peli: loputtomat rahat ilman rahakoodia

Yksinpeleissä ei voi huijata, sanotaan. Olen osittain samaa mieltä: jos pelaat peliä yksin ja sinulla on hauskaa, voit tehdä mitä vain. Jo 2000-luvun alussa The Sims -pelissä rakennettiin kavereiden kanssa valtavat kartanot rahakoodin avulla ja Age of Empires I ja II -peleissä resursseja riitti vaikka muille jakaa. Samaten keskiaikaa eläneet viholliseni mahtoivat yllättyä suuresti, kun heidän linnaansa alettiin moukaroida konekiväärein varustetulla autolla.

"How do you turn this on?"

Vaan oliko se sitten niin hauskaa? Hauska on tietenkin hyvin subjektiivista. Kunnolla suunniteltu peli on yleensä mukavaa ajanvietettä ja vaikeatkin pelit voivat olla hauskoja, palkitsevia ja rentouttaviakin. Huijaaminen vie pelistä yleensä pois sen oleellisimman: sen varsinaisen pelin. Jos pelissä tarkoituksena on toteuttaa monimutkaisia strategioita, niin strategian korvaaminen ylivoimaisilla joukoilla voi olla hetken aikaa hauskaa, mutta ei sitä kovinkaan montaa kertaa jaksa. Huijaamalla saatu voitto ei vaan tunnu samalta, edes yksinpelissä.

Nostalgiahuuruiset muistelut ja filosofiset pohdinnat sikseen, siirrytään asiaan.

FTL: Faster than Light

FTL-pelin alkutilanne

FTL eli Faster Than Light on niin kutsuttu Roguelike-peli. Rogue on vuonna 1980 julkaistu peli, jolle ominaista oli esimerkiksi pysyvä kuolema. Vaikka pelin voi tallentaa jatkaakseen sitä myöhemmin, kaikki valinnat olivat kuitenkin pysyviä. Jos mokasit, niin mokasit, eikä paluuta ollut. Vastaavasti genren piirteisiin kuuluvat vuoropohjaisuus ja satunnaisesti luotu, jokaisella pelikerralla muuttuva maailma.

FTL on modernimpi julkaisu. Pelissä lennellään avaruusaluksella kapinallisia karkuun, tutkien samalla avaruudesta löytyviä signaaleja. Vastaan tulee vihollisia, kauppoja ja satunnaisia tehtäviä. Pelin tarkoituksena on kehittää ja varustella alusta matkan varrelta löytyvistä ja ostettavista osista, palkata miehistöä ja kehittää miehistön taitoja. Lopussa on varsin perinteinen loppuvastus, jonka voittamalla peli päättyy. Pelissä on mahdollista suorittaa myös erinäisiä sivutehtäviä, joiden avulla saa itselleen uusia aluksia lennettäväksi.

Peli on hyvä, mutta se on helpollakin vaikeusasteella vaikea. Tämän näkemyksen ovat jakaneet monet muutkin esimerkiksi Redditissä. Erinäisiä ohjeita ja hyvin suunniteltuja strategioita voittamiseen varmasti löytyy, tai niitä voisi koittaa itse kehitellä. Kuitenkin jonkin aikaa sitten peliä pelatessani muistui mieleen, miten joskus lapsuudessa selainpelejä hakkeroitiin CheatEngine -ohjelman avulla. Koska FTL-pelin pystyy tallentamaan, kyseisen tallennuksen voisi varmaankin avata jollakin sopivalla ohjelmalla. Löytyisikö sieltä rahamäärä, jonka tilalle voisi sitten kirjoittaa vaikka 9999?

FTL-pelin rahamäärän hakkerointi heksaeditorilla

Aloitetaan kaivamalla pelin tallennukset esille. Kaikki riippuu siitä, miten olet pelin asentanut, mutta itse löysin pelin datan seuraavasta hakemistosta:

~/.local/share/FasterThanLight

Jos listataan kyiseisen hakemiston sisältö, mitään kovin ihmeellistä ei löydy:

$ ls
ae_prof.sav  continue.sav  settings.ini

Sattumoisin olin jättänyt pelin aiemmin kesken ja continue.sav lienee pelin tallennus. Aloitin silti uuden pelin ja pelasin sitä pari vuoroa eteenpäin. Pelissä oleva rahamäärä on nyt 71. Kaiken järjen mukaan tiedoston avaamalla pitäisi löytyä rivi, jossa lukee 71 ja sitten siihen vain uusi rahamäärä?

Jos avaamme continue.sav -tiedoston esimerkiksi notepadilla (tai tässä tapauksessa vastaavalla Gedit -ohjelmalla), sen sisällä ei olekaan mitään järkevää:

Tiedosto on binääritiedosto. Siellä ei siis olekaan pelkkää tekstiä, vaan tiedot on tallennettu binäärilukuina, samaan tapaan kuin esimerkiksi kuvat, äänet ja videot tallennetaan. Näemme selvästikin, että tiedostossa on kaikenlaisia pelissä esiintyviä sanoja ja nimiä, eli tiedot tosiaankin ovat täällä. Mutta mikä on \00 tai muut, laatikoiden sisällä olevat pienet numerot?

Windowsin Notepad luultavasti ei saa tätä tiedostoa näinkään hyvin auki. Mikä olisi sopivampi työkalu?

Heksaeditori?

Tietokone käsittelee tietoja tavuina, eli 8 bitin jonoina, esimerkiksi 10010010 olisi yksi tavu. Näitä on suhteellisen hankala tarkastella ja erottaa toisistaan näin ihmisen näkökulmasta, joten tutummat numerot olisivat parempia. Jos yksittäisen tavun kokoisen binääriluvun muuntaa 10-järjestelemään, se saa arvon 0 ja 255 väliltä. Tällöin jokainen 8 bitin pätkä voitaisiin esittää kolmella “tavallisella” numerolla. Tietokoneen näkökulmasta näiden käsittely on vähän kömpelöä, joten tarvittaisiin jokin toinen järjestelmä, joka sopii sekä ihmisille, että tietokoneille. Kompromissiksi voidaan valita heksadesimaalit. Näin yksittäinen 4-bitin pätkä, eli 16 erilaista arvoa voidaan esittää 16 erilaisella ihmiselle tutulla merkillä. Koska numerot loppuvat kesken, käytetään kirjaimia: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Tästä on esimerkiksi se etu, että jokainen tavu saadaan kuvattua täsmälleen kahdella heksasymbolilla, 00 ja FF välillä, joista ensimmäinen merkki on neljä ensimmäistä bittiä ja toinen merkki on neljä jälkimmäistä bittiä.

Kun avataan pelin tallennus heksaeditorilla, se näyttää tältä:

Heksaeditori näyttää tiedoston sisällön kahdella tavalla: vasemmalla puolella tiedoston sisältö heksoina ja oikealla puolella sama sisältö tulkittuna tekstinä. Koska kaikki binääriluvut eivät merkkaa jotakin kirjainta, numeroa tai erikoismerkkiä, niiden tilalla näytetään tekstipuolella piste. Esimerkiksi ihan alussa: 0B ei ole mikään merkki joten tekstin puolella sen kohdalle tulee piste. Heksaluku 54 puolestaan on iso T-kirjain sanan The alussa, toisen rivin loppupuolella. Kirjainten lukuarvot tulevat käytännössä ascii taulukon perusteella. Kuvassa harmaalla korostettu vasen reuna on kunkin rivin ensimmäisen tavun järjestysnumero, nekin heksadesimaalina.

Jos käytät Windowsia ja haluat kokeilla vastaavaa työkalua, esimerkiksi HxD on hyvä valinta. Lyhyt googlaus osoittaa, että Macille on ainakin työkalu nimeltä Hex Fiend. Tämän artikkelin kuvissa käytössä on gHex -niminen työkalu.

Tiedoston tutkiminen

Ylempänä näkyvää kuvaa tarkastellessa missään ei näytä lukevan “money” tai pelin rahayksikköä “scrap” tai muuta vastaavaa, mutta pelihahmojen nimet ja lajit näkyvät. Swampson, Maria ja Ohm ja ne ovat kaikki “human” -lajia, eli ihmisiä ja nämä tiedot näyttäisivät löytyvän tekstiosion puolenvälin paikkeilla. Näiden välissä näyttäisi olevan myös joitakin numeroita. Tässä huomasin perinteisen tavan binääritiedostojen tallentamisessa. Kun peli avaa tiedoston, mistä se tietää, kuinka pitkä seuraava osio, kuten esimerkiksi nimi tulee olemaan? Ei sitä oikein voi tietää, ellei sitä ensin kirjoitetaan tiedostoon jollakin ennalta määrätyllä merkkimäärällä.

Katsotaan alla olevaa kuvaa. Esimeriksi ennen nimeä “Swampson” nähdään luvut 08 00 00 00. Tämä olisi 4 tavua, eli 32 bittiä, joka on varsin tyypillinen bittimäärä lukujen tallentamiseen. Tämä on nk. Little Endian -muodossa oleva luku: tietokoneelle on helpompi tallentaa luvut “väärin päin”, tavu kerrallaan. Käännetään siis tavujen järjestys, eli todellinen luku on 00 00 00 08. Etunollilla ei tietenkään ole merkitystä, eli tämä on ihan vain 8. Ja näinhän se on, että Swampson on 8 merkkiä pitkä. Sen jälkeen tulee 05 00 00 00 eli luku 5. Ja tämäkin on selvää: sana “human” on 5 merkkiä pitkä.

Nyt voitaisiin vaikka koittaa vaihtaa nimen Maria kohdalle toinen nimi. Koska tiedostoon on merkattu sen olevan 5 merkkiä pitkä, pääsemme helpoimmalla jos valitsemme saman pituisen nimen ja esimerkiksi Vilho on yhtä pitkä.

Vaihtamisella ei tosin tuntunut olevan vaikutusta, peliin palatessa hahmon nimi oli edelleen Maria.

Ongelmana on ilmeisesti se, että nämä lienevätkin aluksen tietoja, eli aluksessa olleen aloitusmiehistön tiedot. Nykyinen miehistö ja niiden keräämät taidot ovatkin listattuna myöhemmin ja siellä nimi Maria näkyy edelleen.

Tässä kohdassa miehistön jäsenten välissä on paljon enemmän tietoja. En lähtenyt tutkimaan rakennetta sen tarkemmin, mutta voin olettaa hahmon taitojen ja muiden tietojen olevan tässä pätkässä. Kuvassa ei näy heksaosiosa, mutta heksapuolella näkyy jokaisen miehistön jäsenen jälkeen samankaltaisia osioita, nyt kun peli on vielä käytännössä alkutilassaan. Nyt voisi ottaa tämän talteen ja pelata peliä vähän eteenpäin ja kirjata sitten ylös pelaajien muuttuneet taidot. Näin voisi selvittää tarkasti, missä kohtaa tiedostoa mikäkin taito on tallennettuna. Jätetään se nyt kuitenkin tekemättä.

Jälkimmäisen Maria -nimen muuttaminen Vilhoksi näkyy pelissä, eli tiedoston muokkaaminen vaikuttaa peliin:

Tämä prosessi on oikeastaan täsmälleen se, mitä Mark Watney teki “Yksin Marsissa” -elokuvassa Pathfinder-mönkijän koodia muuttaessaan ja ohjelmana näyttääkin olevan jonkinlainen heksaeditori.

Selvästikin peli lukee tiedoston sisällön kyselemättä. Kannattaa silti huomata, että virheellisellä muokkauksella olisi suuria seurauksia. Jos esimerkiksi muutetaan tiedostoa siten, että Swampson -hahmon nimen pituus ei olekaan 8 vaan 7, niin peli lukisi tällöin vain 7 tavua ja hahmon nimeksi tulisi Swampso. Isompi ongelma on, että peli olettaisi seuraavien 4 tavun tarkoittavan tämän hahmon lajin nimen pituutta. Peli siis lukee seuraavat 4 tavua ja niiden arvo on alkuperäisen 05 00 00 00 sijaan 6E 05 00 00. Tämä luku on 56E eli kymmenjärjestelmässä 1390. Tällöin peli (mahdollisesti) yrittäisi lukea seuraavat 1390 tavua saadakseen tietoon hahmon lajin, samalla lukien tiedostosta suuren määrän erinäisiä asioita, joilla olisi ollut jokin muu merkitys. Ensinnäkään peli ei luultavasti tunnista tätä luettua tietoa hahmon lajiksi ja toiseksi peli ei luultavasti edes pystyisi käynnistymään, koska tiedoston loppusisällöstä puuttuisi nyt suuri osa.

Loputtomat rahat

Seuraavaksi se mitä tultiin tekemään: rahamäärä. Rahaa eli Scrappia näyttäisi olevan 71, joka on heksadesimaaliksi muunnettuna 47. Tämä löytyykin tiedoston alkupuolelta:

Voidaan olettaa, että tässä on 2 tai 4 tavua little-endian koodattuna, eli rahamäärä on tästä tavusta alkaen oikealle. Pelataan varman päälle, eli muokataan nyt vain kahta tavua, laittamalla vaikka ekan nollan tilalle ykkönen. Eli haluttaisiin siis laittaa heksadesimaali rahaa 1047, joten kirjoitetaan tähän 47 10 00 00. Luku 1047 heksadesimaalista 10-järjestelmään on 4167, eli tästä saisi jo aika hyvän rahamäärän, luultavasti enemmän kuin pelissä ehtii edes käyttää.

Ja sehän toimii.

Helppoahan pelin läpäisy oli, kun ei tarvinnut enää punnita, mitä asioita kannattaa ostaa ja aluksen sai päivitettyä heti alussa täyteen voimaansa. Eipä silti, kaikki taistelut silti olleet ihan helppoja ja toisaalta lopussa piti edelleen osata pelata edes vähän.

Pelasin koko peli läpi ylisuurella rahamäärällä jo joskus muutamia vuosia sitten ja tälläkin kertaa sitä jaksoi pari kertaa. Silti, pelistä puuttui nyt selkeästi jotain oleellista. Taktiikoilla, pelin aikana tehdyillä valinnoilla ja rahankäytöllä ei ollut enää niin merkitystä. Peli oli kuin eri peli, paljon huonompi sellainen.

← p = ^(11+)\1+$
Divisium 3 →