2018. október 3., szerda

Napokkal ezelőtt kezdtem új játékot, ilyen team-oriented D&D RPG (most mindenki érti), és csak most jöttem rá, hogy két karakternek is véletlenül ugyanazt a hangot állítottam be az elején, és ez nem módosítható utólag. Már épp felbasztam az agyam aggodalmaskodni kezdtem, hogy kezdhetem elölről megint, aztán úgy döntöttem, hogy némi hekkeléssel ez elkerülhető. A mentett játékállás file 4,3 millió byte-ot tartalmaz, de pár perc alatt rájöttem segítség nélkül, melyik az az egy, amelyiket át kell írni, hogy másik hangkészletet kapjon az adott figura. El kell fogadni a tényt, hogy egy IT zseni írja ezt a blogot.


5 megjegyzés:

  1. Engem érdekelne részletesebben is a folyamat. Hogy lehet rájönni?

    VálaszTörlés
  2. Legfeljebb 8 kezdő karaktert kell irányítani a játékban. Ezeket egyenként kell létrehozni a játék legelején, mindegyik külön fájlba mentődik, aztán a mentett karakterekből kell tetszőlegesen összeállítani a csapatot. A játék telepítési mappáján belül meg kellett találni, melyik alkönyvtárban vannak a mentett karakterek, ez nem volt nagy ügy.
    A mentett karakter fájl elég kicsi, 1 kbyte méretű, olyan adatokat tartalmaz, hogy mekkora az ereje, ügyessége, IQ-ja, neve, frizura típusa, hangja stb.
    Hexadecimális szerkesztő programban megnyitottam ezek a fájlokat, az való arra, hogy tetszőlegesen módosítható legyen bármilyen fájl tartalma.
    Minden byte egy 0 és 255 közti számot jelöl 16-os számrendszerben, de mindnek van alfanumerikus jelentése is, tehát pl. a 101-es érték (16-os számrendszerben, azaz hexadecimálisan "65") az "e" betűt jelöli. A szerkesztő programnak van olyan nézete is, ami eleve átkódolja ezeket a számokat alfanumerikus karakterekké.

    Ilyen egy mentett karakter fájl hexadecimális nézetben:

    09 00 00 00 1B 02 00 00 02 00 00 00 00 00 00 00 47 74 3C 9D E7 58 E4 48 83 F7 65 7E 1E A2 E5 F1 0C 00 00 00 53 7A 74 61 72 62 6C 6F 67 67 65 72 58 0C 00 00 01 00 00 00 07 00 00 00 00 00 00 00 04 00 00 00 0D 00 00 00 77 00 00 00 01 00 00 00 00 00 00 00 C8 32 00 00 BD 7F AF F2 68 CB 71 45 A1 B4 68 90 02 00 00 00 00 00 00 00 47 74 3C 9D E7 58 E4 48 83 F7 65 7E 1E A2 E5 F1 0D 00 00 00 15 00 81 00 20 04 80 14 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 60 CC 80 04 10 04 00 40 06 01 E0 01 00 00 E0 01 00 00 5F 00 00 00 30 60 00 90 0C 00 00 00 8A D8 8F 42 01 04 00 00 00 0E 00 00 00 9E 2C 00 00 3E 2B 66 06 05 07 62 04 5E A1 4D 00 53 2D 36 07 54 BE C2 0E 3F 46 00 00 39 46 42 09 55 A7 7B 02 D5 6D 56 04 39 BA 8B 07 6F A3 4F 07 6D 76 8E 04 E2 5A 71 06 44 9B 83 08 02 00 00 00 FF 3F 00 00 00 00 00 00 FF FF FF FF 01 04 00 00 00 19 00 00 00 9D 2C 00 00 01 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 FF FF FF 01 00 00 00 00 01 04 00 00 00 06 00 00 00 9B 2C 00 00 11 00 00 00 0D 00 00 00 0D 00 00 00 08 00 00 00 0F 00 00 00 0E 00 00 00 02 00 00 00 3F 00 00 00 00 00 00 00 01 04 00 00 00 01 00 00 00 9C 2C 00 00 07 00 00 00 02 00 00 00 01 00 00 00 00 00 00 00 44 00 00 00 A2 00 00 00 04 00 00 00 00 00 00 00 01 04 00 00 00 02 00 00 00 9F 2C 00 00 00 00 00 00 09 00 00 00 02 00 00 00 03 00 00 00 00 00 00 00 58 0C 00 00 01 04 00 00 00 04 00 00 00 A0 2C 00 00 04 00 00 00 04 00 00 00 04 00 00 00 04 00 00 00 02 00 00 00 5C 00 00 00 00 00 00 00 28 00 00 00 01 0C 00 00 00 53 7A 74 61 72 62 6C 6F 67 67 65 72 00 09 00 00 00 01 00 00 00

    VálaszTörlés
  3. Amit a program megmutat alfanumerikus kódolásban is:

    Gt+f b ^ˇM S-6 TľÂ ?F 9FB U§{ ŐmV 9ş‹ oŁO mvŽ âZq D›ƒ ˙? ˙˙˙˙ ť, ˙˙˙ ›,

    ? ś, D ˘ ź, X  , \ ( Sztarblogger

    Először azt gondoltam, könnyen kideríthető, melyik bájt felel a hangkészletért, ha létrehozok két egyforma embert, akik közt az egyetlen különbség a hangjuk, és megnézem a fájl tartalmában, hogy melyik byte különbözik. Valami okból azon sok byte is eltér ilyenkor, amikről nem tudom biztosan, hogy miket tárolnak, de nem is fontos. A problémát azzal hidaltam át, hogy létrehoztam 4 ugyanolyan embert, akikből 3-nak volt ugyanaz a hangja, a negyediknek eltért, majd megnéztem, hogy melyik az a byte, amelyik 3 esetben ugyanaz, de a negyediknél eltér. Ez már elég könnyen beazonosítható volt, az ember nevét a második helyen tároló byte sorozat utáni második byte. Tehát itt közel a legvégéhez a Sztarblogger utáni második karakter helye, ahol az alfanumerikus nézetben nem is látszik semmi, de felül, a hexadecimálisban 09. Ez konkrétan azt jelenti, hogy a játék elején, amikor egy listából lehet hangot választani, a 10. helyen levő hang van beállítva (az első 00 lenne, a programozók mindig 0-tól kezdik a számolást).
    Hogy hol van benne az ember neve, az onnan látható könnyen, hogy csak az tűnik értelmes szónak a fájlban, mert az az egy szöveges adat tartozik egy emberhez, a többi látszólag értelmetlen zagyvaság, amik igazából számok.
    Ez volt a karakterfájl, de még nem a mentett játékállás fájl. Utóbbi a csapattagok adatain kívül rengeteg dolgot tárol még, hogy melyik térképen mit derítettünk fel, hol vannak megölt szörnyek hullái, kivel mit beszélgettünk stb., így lett belőle egy 4 MB-os fájl. Ebben viszont valahol megvannak a csapatot alkotó emberek adatai is, amit úgy találtam meg, hogy az alfanumerikus nézetben rákerestem a nevére ebben a nagy adathalmazban. Aztán átírtam a név utáni második byte-ot a hexa nézetben, jelen példában mondjuk 09-ről 06-ra. A játékot betöltve pedig a várakozásnak megfelelően megváltozott az ember hangja, a játék eleji listán levő 10. hangról a 7-.re.

    VálaszTörlés
  4. Az alfanumerikus kódolási résznél nem is hagyta a kommentdoboz, hogy olyan formában másoljam ide a szöveget, mert ez másfajta kódolást használ, így kicsit kevésbé érthető :(. Lényeg, hogy ugyanannyi betű volt benne, mint fölötte a számok.

    VálaszTörlés
  5. Köszi a kimerítő választ.
    Kéne neked új névjegykártya:

    "Sztárblogger Ferenc
    Programozás-nyomozó"

    és utána alfanumerikusban a telefonszámod :-D

    VálaszTörlés