ПредишенСледващото

В статията, като пример, описва процеса на разопаковане на файловия формат на играта Imperium Galactica II DAT

Да предположим, че сте искали да получите графика на някои играчки. Ние също така да приемем, че вашият избор е паднал върху Imperium Galactica II. Същите правила се поберат почти всяка игра.

Различните производители имат различни ресурси и да се скрият. В един случай, можете да намерите текстура пуснати на отделни файлове, в друга те са опаковани в архивите, за да бъдем точни - в psevdoarhivy защото те рядко се прилага algoritny компресия и в пълния смисъл на думата, те не са архиви. Така че, търсите файлове, които се отличават с техния размер от останалите. Въпреки това, файловете могат да бъдат сравнително малки, както е в нашия случай с IG2. Тук, във всеки един архив съдържа понякога, а понякога и на стотици файлове. Ето така ние смятаме.

Когато декодирането на всяка вероятност формат на успешен резултат се увеличава драматично, когато при синтактичния анализ на множество проби от този размер. В този случай, двата файла се използва: sounds_colony_speech_self-destruct.dat и textures_colony_lens.dat.

Сега е ред на втория по експериментална библиотека и на фигура 3. Както вече знаеше, вероятно FAT офсет може да се прочете в последните четири байта на файла. За окончателно потвърди тази хипотеза, погледнете в последните четири байта на втория файл (Фигура 3). Там, офсет $ 5BB2 се отчита стойността на $ 106. Изваждане на тази стойност от общия архив размера и да получите $ 5AB0. Елате в този офсет, и какво ще се получи? Да, в началото на втората резервната FAT. Така че, хипотезата е потвърдена.

Остава само да се разгледа структурата на записването на един от файловете. Това се съдържа в полето за въвеждане (в скоби се посочва дължината на полето):

  1. Името на файла (произволна дължина).
  2. Изместването в архива преди него (4 байта).
  3. Junk (4 байта).
  4. Размерът на данни (4 байта).
  5. Действителният размер на файла (ако се използва алгоритъма на GZip компресия) (4 байта).
  6. Junk (4 байта).

дистанциите име може да бъде във всички записи или произволна неизменност. Във втория случай, както преди името на полето определена дължина, или (както е в нашия случай) име се прочете до първата нула характер. Други области на експериментален предполагам. Размерът на първия файл компенсира = отместване на първия-втория. Излишно е да компенсира предполагам. Това е особено лесно, ако всички файлове са от същия тип, т.е. имат общ идентификатор в заглавието. Така например, през втората архива помисли записа на първия файл (отместване $ 5AB0), а вторият (офсет $ 5ACE). След името на първия файл, липсва нулев знак прочетете $ 00 00 00 00. Ние ще приемем, че това е отклонението на първия файл. Хайде това изместване, т.е. в началото на файла, и не забравяйте, поне през първите два байта - $ 78 9C. Сега четем едни и същи четири знака - $ FF 48 00 00. Отидете за този офсет ($ 48FF), и да видим същите два байта. по този начин двата файла са същите номера,, така че областта, която съдържа файла компенсира определени правилно. Същият метод научни и останалите полета са определени.

Накрая бих искал да се обърне внимание на нещо друго какво. Понякога файлове са компресирани в psevdoarhivah съвсем реална GZip архиватор. Този метод се използва и IG2 и HOMM III. идентификатор формат GZip е последователност от $ 8B 1F 08 00 00 00 00 00 00 00. Въпреки това, в този идентификатор игри неизвестни причини да ми се заменя със $ 78 9C. Това ще образуват безценен архив от файла GZip, която се съхранява там, например, правото да се извлече втората архивен файл flare.bmp (Фигура 3), необходимо за разопаковане psevdoarhiva:

  1. Създаване на файл с име Flare.bmp.
  2. Запис GZip да представи ID, т.е. $ 1F 8B 08 00 00 00 00 00 00 00.
  3. Копирайте при създаването на файла с данни от Flare.bmp psevdoarhiva. започвайки от третия байт (за да се спре фалшива самоличност GZip).
  4. В края на Flare.bmp влиза действителния размер на файла. Той е включен в влизането FAT.

Маневра "фалшива заглавие» GZip точно това, а само когато използвате библиотеката GZipLib или други библиотеки от същия клас. хедър не е необходимо да редактирате, когато се използва ZLib.

Подкрепете проекта - споделете линка, благодаря!