Cum să intestrează arhivele jocului - articole despre jocuri și descrieri de formate

Articolul, ca exemplu, descrie procesul de despachetare a arhivei DAT din jocul Imperium Galactica II

Să presupunem că ați vrut să obțineți grafică dintr-o anumită jucărie. Să presupunem, de asemenea, că alegerea dvs. a căzut pe Imperium Galactica II. Aceleași reguli se vor aplica aproape oricăror jocuri.







Diferiți producători în diferite moduri și resurse se ascund. Într-un caz, puteți găsi texturi plasate pe fișiere separate, în altul acestea sunt ambalate în arhive, mai precis - în pseudo-arhive, tk. algoritmi de compresie sunt destul de rare în ele, și în sensul complet al cuvântului arhive nu sunt. Deci, căutăm fișiere care se disting prin dimensiunea lor pe fundalul celorlalte. Cu toate acestea, arhivele pot fi relativ mici, ca în cazul nostru cu IG2. Aici, în fiecare arhivă, există uneori câte una, și uneori chiar o sută de fișiere. Vom analiza acest caz.

Când decodificați orice format, probabilitatea unui rezultat de succes crește dramatic dacă mai multe eșantioane din acest format sunt dezasamblate simultan. În cazul nostru, sunt utilizate două arhive: sounds_colony_speech_self-destruct.dat și textures_colony_lens.dat.

Ne întoarcem acum la cea de a doua a bibliotecii experimentale și la Figura 3. Așa cum am știut deja, probabil FAT de offset poate fi citit în ultimele patru octeți din fișier. Pentru a confirma în cele din urmă această ipoteză, să aruncăm o privire asupra ultimilor patru octeți ai celei de-a doua arhive (Figura 3). Acolo, offsetul de 5BB2 citește valoarea de 106 USD. Reduceți această valoare din mărimea totală a arhivei și obțineți $ 5AB0. Mergem la această prejudecată și de unde ajungem? Da, la începutul celei de-a doua arhive FAT. Astfel, ipoteza a fost confirmată.

Rămâne doar să se ia în considerare structura înregistrării unuia dintre dosare. Iată câmpurile din înregistrare (în paranteze, este indicată lungimea câmpului):







  1. Numele fișierului (lungimea este arbitrară).
  2. Deplasarea în arhiva înaintea ei (4 octeți).
  3. Coș de gunoi (4 octeți).
  4. Dimensiunea datelor (4 octeți).
  5. Dimensiunea reală a fișierului (dacă se folosește algoritmul de compresie GZip) (4 octeți).
  6. Coș de gunoi (4 octeți).

Lungimea câmpului de nume poate fi fixă ​​sau arbitrară în toate înregistrările. În al doilea caz, fie înaintea câmpului este specificată lungimea numelui, fie (ca în cazul nostru) numele este citit la primul caracter zero. Câmpurile rămase sunt ghicite experimental. Dimensiunea primului fișier = Deplasați al doilea offset primul. Deplasarea însăși poate fi ghicită. Acest lucru este foarte ușor dacă toate fișierele au același tip, adică au un identificator comun în antet. De exemplu, în cea de-a doua arhivă, ia în considerare intrarea pentru primul fișier (offset $ 5AB0), iar pentru al doilea ($ 5ACE offset). După numele primului fișier, sărind peste un caracter zero, citiți $ 00 00 00 00. Vom presupune că acesta este compensarea primului fișier. Mergem pe această deplasare, adică la începutul arhivei și amintiți-vă cel puțin primele două octeți - 78 dolari 9C. Acum citiți aceleași patru caractere - $ FF 48 00 00. Mergem la acest offset ($ 48FF) și vedeți aceiași doi octeți. astfel identificatorii ambelor fișiere coincid, prin urmare, câmpul care conține offsetul fișierului este determinat corect. Aceeași metodă științifică determină câmpurile rămase.

În cele din urmă, aș dori să fiu atenți la altceva. Uneori, fișierele din pseudoarchive sunt comprimate de un arhivator GZip complet real. Această metodă este utilizată atât la IG2, cât și la HOMM III. identificator de format gzip este o secvență de 8B $ 1F 08 00 00 00 00 00 00 00. Cu toate acestea, în jocuri de acest identificator, din motive necunoscute mi se înlocuiește cu 78 $ 9C. Aceasta ar forma o arhivă valoroasă din dosar gzip, care este stocat acolo, de exemplu, dreptul de a extrage al doilea flare.bmp fișier arhivă (Figura 3), au nevoie pentru despachetare psevdoarhiva:

  1. Creați un fișier numit Flare.bmp.
  2. Pentru a scrie aici identificatorul actual GZip, adică $ 1F 8B 08 00 00 00 00 00 00 00.
  3. Copiați datele Flare.bmp din pseudo-arhivă în fișierul creat. începând cu cel de-al treilea octet (pentru a întrerupe falsul GZip).
  4. La sfârșitul Flare.bmp introduceți dimensiunea fișierului Real. Acesta este inclus în înregistrarea FAT.

Manevra „titlu fals» gzip doar că, și numai atunci când utilizați biblioteca GZipLib sau alte biblioteci din aceeași clasă. Dacă utilizați ZLib, nu este necesar să modificați antetul.







Trimiteți-le prietenilor: