A játék archívumának beillesztése - a játékokról és a formátumok leírásáról szóló cikkek
A cikk példaként bemutatja a DAT archívum kicsomagolásának folyamatát a Imperium Galactica II játékból
Tegyük fel, hogy szeretne grafikus képet kapni egy bizonyos játékról. Tegyük fel, hogy az Ön választása az Imperium Galactica II-re esett. Ugyanezek a szabályok alkalmazandók majdnem minden játékra.
Különböző gyártók különböző módon és erőforrások bujkálnak. Az egyik esetben, megtalálja a textúra helyezni az egyes fájlokat, a másik azok csomagolása a levéltárakban, hogy pontos legyek - a psevdoarhivy mert a tömörítési algoritmusok meglehetősen ritkák, és az archívumok teljes értelemben nem. Tehát olyan fájlokat keresünk, amelyeket méretük különböztet meg a többiek hátterében. Az archívumok azonban viszonylag kicsiek lehetnek, mint az IG2 esetében. Itt minden archívumban van néha egy, és néha akár száz fájl is. Ezt az ügyet megvizsgáljuk.
Minden formátum dekódolásakor a sikeres eredmény valószínűsége jelentősen megnő, ha a formátum több mintáját egyidejűleg szétszerelik. Ebben az esetben a két fájl használható: sounds_colony_speech_self-destruct.dat és textures_colony_lens.dat.
Most forduljunk a második kísérleti archívumhoz és a 3. ábrához. Ahogy már megértettük, a FAT offset az archívum utolsó négy bájtjában olvasható. Végül megerősítsük ezt a feltételezést, nézzük meg a második archívum utolsó négy bájtját (3. ábra). A $ 5BB2 offset értéke $ 106 értéket olvas. Vonja le ezt az értéket az archívum teljes méretéről és kapjon $ 5AB0 értéket. Folytatjuk ezt a torzítást és hol jutunk el? Igen, a második archívum elején a FAT. Tehát a hipotézis megerősítést nyert.
Csak az egyik fájl rekordjának szerkezetét kell figyelembe venni. Itt vannak a mezők a rekordban (zárójelben, a mező hossza jelezve):
- Fájlnév (a hossz tetszőleges).
- Az eltolás az archívumban előtte (4 byte).
- Trash (4 byte).
- Adatok mérete (4 bájt).
- A tényleges fájlméret (ha a GZip tömörítési algoritmust használja) (4 bájt).
- Trash (4 byte).
A névtér hossza lehet fix vagy tetszőleges az összes rekordban. A második esetben, vagy a mező előtt, a név hossza meg van adva, vagy (a mi esetünkben) a név az első nulla karakterre kerül. A fennmaradó mezők kísérletileg kitaláltak. Az első fájl mérete = először az Offset second offset. Maga az elmozdulás kitalálható. Ez különösen akkor könnyű, ha az összes fájl azonos típusú, azaz közös azonosítóval rendelkezzen a fejlécben. Például a második archív úgy a rekord az első fájl (offset $ 5AB0) és a második (offset $ 5ACE). Az első fájl neve után egy nulla karaktert elhagyva olvassa el 00 00 00 00-et. Azt feltételezzük, hogy ez az első fájlhoz képest eltolódik. Folytatjuk ezt az elmozdulást, azaz az archívum elején, és emlékezzen legalább az első két bájtra - $ 78 9C. Most ugyanazt a négy karaktert olvassa el - $ FF 48 00 00. Ezt az offsetet ($ 48FF) megyünk és ugyanazt a két bájtot látjuk. így a két fájl azonosítója egybeesik, ezért a fájl-eltolást tartalmazó mező helyesen van meghatározva. Ugyanez a tudományos kutya módszer határozza meg a fennmaradó mezőket.
Végül szeretnék valami mást figyelni. Néha a pszeudoarchívumok fájljait egy teljesen valós GZip archivátor tömöríti. Ezt a módszert használják mind az IG2, mind a HOMM III-ban. A GZip formátum azonosítója a $ 1F 8B 08 00 00 00 00 00 00 00 00 szekvencia. A játékokban azonban ez az azonosító ismeretlen oknál fogva $ 78 9C-vel helyettesíthető. A pszeudoarchívum kicsomagolásához egy teljes GZip archívum létrehozása az ott tárolt fájlból, például a 2. archívumból (3. ábra) a flare.bmp fájl helyes kibontása:
- Hozzon létre egy Flare.bmp nevű fájlt.
- Itt írni a jelenlegi GZip azonosítót, azaz. $ 1F 8B 08 00 00 00 00 00 00 00.
- Másolja a Flare.bmp adatokat a pszeudoarchívumból a létrehozott fájlba. a harmadik bájtból kiindulva (a hamis GZip elvágásához).
- A Flare.bmp végén írja be a Real fájlméretet. Ez szerepel a FAT rekordban.
Manőver „false cím» GZip csak ezt, és csak akkor használja a könyvtárat GZipLib vagy más könyvtárak azonos osztályban. Ha ZLib-ot használsz, nem kell szerkesztened a fejlécet.