1

Тема: Z archive Unpacker

Консольный распаковщик архивов pac и exp игры Z и Z Expansion от 1996 - 1998 года. В качестве параметра указываем архив, получаем на выходе кучу файлов в текущей директории. Вот собственно и вся петрушка.

Беру

ЛС переполнен, не надо писать туда.

2 Отредактировано AxXxB (16-03-2007 14:55:53)

Re: Z archive Unpacker

В Новостях был вопрос: "Зачем нужен распаковщик, если нет упаковщика?"

Ответ.
Где-то на просторах Интернета я обнаружил вот такую запись (цитата не точна и переведена с английского):

Каждый файл-ресурс Z запакован по алгоритму LZSS (из семейства LZ77), а затем архивы упакованы в группы по алгоритму .jmp2

Что это за алгоритм .Jmp2, неизвестно.

Итак, с помощью твоего, Antares, распаковщика (спасибо за него огромное!) я распаковал HEADFX.PAC (потому что он самый маленький smile), а затем упаковал по алгоритму LZSS файл HEADBIT0.DAT, полученый при распаковке. Итак, фрагмент этого файла, запакованного в LZSS:

00000000: FF 00 00 28  00 44 01 0D | 00 DD 2C F1  F0 80 03 20
00000010: EF F2 80 08  7A FC F4 0D | FC F4 12 0D  00 10 F1 F0  
00000020: 5B 50 13 14  03 20 14 14 | 03 F0 23 04  DB C0 15 14  
00000030: 03 90 16 14  03 60 17 B6 | 14 03 30 18  14 03 00 19  

00000040: 14 03 D0 B6  53 04 A0 1A | 14 03 70 1B  14 03 40 AD  
00000050: 1C 14 03 10  1D 14 03 E0 | 7B 04 B0 7D  1E 14 03 80 
00000060: 1F 08 00 18  6F 01 AD 20 | 94 03 00 21  94 03 C0 A3  
00000070: 04 80 95 22  94 04 23 9C | 04 24 A4 04  C3 04 80 D5

00000080: 25 94 04 26  9C 04 27 A4 | 04 27 10 FA  95 03 29 EC 
00000090: 03 C0 2A 20  00 20 AA 2F | 01 2E FC 04  32 FC 04 36  
000000A0: FC 04 3A D6  FC 04 3E 20 | A5 03 41 24  13 1C 1D E7
000000B0: 1F 1A 14 DC  FF E1 FC 16 | 1D 1D FF 1B  1B 51 1A 1A

000000C0: 1B 1D 17 79  10 46 1F E3 | FA 14 1D 1C  1B 5B 10 3F 
000000D0: 17 17 19 1A  1A 15 71 1F | E3 FA BF 1A  1B 19 18 19 
000000E0: 1A 89 10 17  E7 17 1A 16 | 63 1F 77 1A  1B 16 15 37 
000000F0: 15 15 16 B5  12 19 16 36 | 1F E4 F9 5B  19 18 DD 10

Начало файла HEADFX.DAT, где и помещен HEADBIT0.DAT:

00000000: 00 00 00 00  FF 00 00 28 | 00 44 01 0D  00 BB 2C 41  
00000010: 00 80 03 20  23 00 80 08 | 55 F5 00 0D  75 01 12 70 
00000020: 00 10 A1 00  50 B5 13 74 | 02 20 14 74  02 F0 65 03 
00000030: C0 B6 15 F4  03 90 16 74 | 04 60 17 F4  02 DA 30 18

00000040: F4 02 00 19  F4 03 D0 65 | 06 DB A0 1A  F4 04 70 1B 
00000050: 74 05 40 1C  6B F4 05 10 | 1D 74 06 E0  E5 08 B0 1E 
00000060: 7D 74 07 80  1F 08 00 18 | 22 08 20 6B  74 0A 00 21 
00000070: 74 0A C0 65  0B 80 22 53 | 75 0A 23 F5  0A 24 75 0B

00000080: 65 0D 80 25  54 75 0C 26 | F5 0C 27 75  0D 27 10 06 
00000090: 93 0E B1 29  F4 0F C0 2A | F0 00 F0 01  B1 10 2E 55 
000000A0: F5 10 32 75  11 36 F5 11 | 3A 75 12 3E  2F F0 10 93 
000000B0: 10 41 74 13  1C 1D 1F 1A | 8F 14 10 00  BF 14 CC 15

000000C0: 16 1D 1D 1B  FE 1B 51 1A | 1A 1B 1D 17  F0 0F 39 7F 
000000D0: 17 EB 15 14  1D 1C E0 16 | F0 16 17 D1  17 19 10 17 
000000E0: 15 5F 18 DC  15 20 17 19 | 8C 18 F0 19  C1 19 D0 19 
000000F0: 1A 16 6F 17  9C 18 EB 1B | 16 15 00 1F  16 83 1C 19

Видим очень много (почти все) одинакового. Разница, думаю, заключена в том, что файл HEADFX.DAT запакован еще раз этим .jmp2 алгоритмом. Осталось только узнать, что это за .jmp2 алгоритм такой и сделать упаковщик. Упаковщик я, в принципе, и сам могу написать, только вот узнать бы про .jmp2...

3

Re: Z archive Unpacker

JMP2 это просто формат\контейнер для хранения файлов, как например RAR или ZIP, а упакован каждый файл по модифицированному алгоритму LZSS. Поэтому просто раздобыть LZSS упаковщик и применить его к файлам не получиться, его нужно модифицировать.

ЛС переполнен, не надо писать туда.

4 Отредактировано AxXxB (16-03-2007 20:18:37)

Re: Z archive Unpacker

Спасибо! Все ясно. Можно тогда еще один вопрос? Первые четыре байта (00 00 00 00), я так понимаю, это результат контейнеризирования файлов? Потому как с них начинаются все .PAC файлы

Да, и если можно - какую-нибудь программу для объединения файлов по формату JMP2 roll.

5

Re: Z archive Unpacker

Первые четыре байта это просто резерв, начало файла идет после 4-ех нулей. Программы по объединению быть не может, так-как нет оригинального алгоритма упаковки. Это тоже самое что поместить в ZIP архив, файлы, сжатые по алгоритму RAR. Пока не будет полной двоичной совместимости все это бесполезно.

ЛС переполнен, не надо писать туда.

6

Re: Z archive Unpacker

Спасибо еще раз! А как извлечь из .DAT файлов нераспакованные ресурсы?
PS. Извини за оффтоп

7

Re: Z archive Unpacker

Они ни чем не упакованы, в них содержаться RAW данные. Тоесть изображения без палитр и заголовков.

ЛС переполнен, не надо писать туда.

8

Re: Z archive Unpacker

Ох, извини, не из .DAT, а из .PAC. (Вот что значит не спать 2ое суток smile)

9

Re: Z archive Unpacker

Тогда не понимаю вопроса. PAC это то же, что и EXP. Просто разные расширения. Или ты имеешь ввиду Z.pac в корне диска оригинального Z? Там находятся инсталяционные файлы. На кой нужен распаковщик, если они и так устанавливаются?

ЛС переполнен, не надо писать туда.

10

Re: Z archive Unpacker

Да, я не так задал вопрос. PAC - это ведь контейнеры? Как вытащить оттуда файлы, не разжимая их? То есть получить на выходе нераспакованные файлы?
ЗЫ. Я тебя наверно уже вконец вывел из себя

11

Re: Z archive Unpacker

Siberian GRemlin на oldgames вроде выкладывал ссылку на программу своего друга, которая позволяла просто извлечь файлы в нераспакованном виде. Ну а вообще берешь hex редактор и руками ковыряешь архив, довольно интересное и поучительное занятие big_smile. Заодно и разберешься как он устроен.

ЛС переполнен, не надо писать туда.

12 Отредактировано AxXxB (19-03-2007 18:29:33)

Re: Z archive Unpacker

Спасибо!!!
Как я понял, в архиве указывается размер уже расжатых файлов, а как узнать размер упакованных - хз... Теперь до меня дошло, зачем нужна полная двоичная совместимость. Будем ковыряться...

Внимание, вопрос!
В архиве после имени файла идет 4 байта (00 00 00 00), потом 4 байта, назначение которых до меня не дошло, а потом 4 байта, которые означают размер файла. Так вот, что означают эти неизвестные для меня 4 байта?

13

Re: Z archive Unpacker

А если еще подумать? lol. Наводящий вопрос - как распаковщик узнает, откуда ему брать данные для распаковки? Ответ на этот вопрос, даст ответ и на второй.

как узнать размер упакованных - хз...

ЛС переполнен, не надо писать туда.

14 Отредактировано AxXxB (27-03-2007 22:25:19)

Re: Z archive Unpacker

Нет, я конечно понял, что эти байты означают адрес начала файла, не такой уж я и тупой. Иначе как бы до меня дошло, зачем нужна двоичная совместимость? Скорее так - каким образом они указывают на это начало, т. е. как они кодируют адрес? Поскольку я только первый раз пробую ковыряться в архиве, то прошу сильно ногами не пинать. А если еще учесть, что мне недавно исполнилось 15...

15

Re: Z archive Unpacker

Возраст не имеет значения. Вопроса честно признаться не понял. Разложу по порядку.

- Под двоичной совместимостью понимается что два закодированных\сжатых файла должны на 100% быть идентичными. Если это условие не выполняется, алгоритм не годится и его нужно либо модифицировать либо переписывать.

- Архив JMP2 очень простой, помимо названия файла (макс. размер 8 байт), в нем существуют еще два поля: размер несжатого файла и смещение. Все.

- Размер сжатого файла определяется вычитанием из вышестоящего смещения, нижестоящего. Более подходящих слов сейчас не могу подобрать, но думаю смысл ясен.

Вот и вся структура архива, ничего там кроме содержимого самих файлов не кодируется, остальное математика на уровне 2 класса.

ЛС переполнен, не надо писать туда.

16

Re: Z archive Unpacker

Antares, большое спасибо! Под "адресом начала файла" я и подразумевал смещение (которое, как я понимаю, отсчитывается не от начала архива, а от конца). Так что, в принципе, я разобрался еще пост назад smile. Только вот насчет смещения сомневался и запутался.

17

Re: Z archive Unpacker

Распаковщик зетовских файлов я написал на коленке где-то за полгода до опубликованного тут. Если бы автор прочитал ззоне форум, то не изобретал велосипед. Хотя, ему тоже респект за работу. Я её не оспариваю.

Что касается самого формата, то там было много заморочек. Сначала я тупил и не понимал, что файлы сжаты т.к. заголовки lbm-файлов были похожи на какое-то расширение этого формата (сам lbm - контейнерный формат) и размер некоторых "сжатых" файлов был больше оригинала(!). Потом самой большой проблемой было узнать метод компрессии из офигенного количества оных, а потом разобраться в конкретной реализации и модификации.

Что касается фразы в переводе с английского: "Каждый файл-ресурс Z запакован по алгоритму LZSS (из семейства LZ77), а затем архивы упакованы в группы по алгоритму .jmp2" - это админ ззоне решил подправить то, как я описал формат, и получилось коряво.
Что касается запаковки. Применяемая модификация LZSS довольна распространена (особенно в кругах амиги, мака) и по запросу гугль выдаёт даже целые исходники. Не думаю, что авторы очень заморачивались в изменении устоявшегося метода запаковки. Да и вообще можно не запаковывать файлы, а ставить в признак запаковки отсутствие оной, что фактически приведёт к разряжению оригинального файла байтом "FF" через 8 байт (конечно, это уже не запаковка получится, но работать должно).
Кстати, на ззоне распаковщик с исходниками, так что читайте код на С - он эсперанто. smile

18

Re: Z archive Unpacker

Да, так получилось, но есть одно существенное отличие, я выдрал алгоритм из игры, а не использовал чьих то исходников. То есть вся программа от начала до конца, написана мной.

Если бы я ранее обнаружил твой распаковщик, то конечно не стал бы писать свой, это очевидно. Для меня это просто очередное повышение опыта в разборе алгоритмов программ, это интересно. Сам же распаковщик почти не представляет интереса для большинства игроков.

Приятно, что на форуме начинают появляться люди разбирающиеся в программировании.

ЛС переполнен, не надо писать туда.

19

Re: Z archive Unpacker

Разве я говорил, что передрал чужие исходники? Я тоже всё своими головой и ручками делал.

Исходники мне нужны были, чтобы уточнить, почему мой первоначальный вариант правильно распаковывает только начало файла. Просто в описалове алгоритма говорилось о смещении относительно скользящего окна, а оказалось, что в реализации - кольцевого буфера.

И я делал это тоже just for fun.

Re: Z archive Unpacker

Antares пишет:

- Под двоичной совместимостью понимается что два закодированных\сжатых файла должны на 100% быть идентичными. Если это условие не выполняется, алгоритм не годится и его нужно либо модифицировать либо переписывать.

Не всегда. Знаю двух людей, которые разобрали формат видеороликов и написали свои кодировщики для них - у обоих файлы получаются отличные от оригинальных, при перегоне Игровой_Формат-Стандартный_Формат-Игровой_Формат, причём игра их отлично воспринимает и 100% совместимость. Понятное дело, в кодировании видеопотока есть где разгуляться.=)

Bullfrog, Westwood и многие другие...

21

Re: Z archive Unpacker

dr_dizel пишет:

Что касается запаковки. Применяемая модификация LZSS довольна распространена (особенно в кругах амиги, мака) и по запросу гугль выдаёт даже целые исходники.

А если попробовать запаковать по имеющейся модификации? Алгоритм распаковки ведь, если я правильно понимаю, тот же, и есть большая вероятность того, что игра может понять и такое сжатие.

22

Re: Z archive Unpacker

Так google-и по "lzss.c". Должно много полезной инфы выдать.
Например: oku.edu.mie-u.ac.jp/~okumura/compression/lzss.c

23

Re: Z archive Unpacker

Исходник запаковки LZSS у меня есть, более того, только что я сжал файлы, извлеченные из Main.exp (написал прогу, которая все сделал за меня lol), осталось только поместить их в контейнер и запустить winz.exe.

24 Отредактировано dr_dizel (21-04-2007 20:41:25)

Re: Z archive Unpacker

Так в чем проблема? Я помню даже пример писал на ззоне. Сча отковыряю...


// --[DOOR.PAC]-- 

file_name:      DOOR.PAC 

sizeof(DOOR.PAC):      77 958 bytes 

0x00:    ubyte8 magic_number[4]   = 0x00000000; 

-0x03:   ubyte8 file_id[4]        = "JMP2"; 

-0x07:   uint32 files_in_package = 0x0A   // 10 

struct packed_file_id 
{ 
    char   file_name[12]; // dos_name = 8+'.'+3
    uint32 unused;         // 0x00000000
    uint32 lzss_offset;
    uint32 real_length;

};

25

Re: Z archive Unpacker

Эх, не понимаю я Сей, на VB кодю. Структуру JMP2 Antares объяснил мне самым подробнейшим образом, за что ему огромное спасибо. Так что сейчас забубеню.