dragon-gor!
Писал, правда как-то давно,
такой вот мануал.
BTW, если тебе на zoneofgames, даже какую-нибудь ссылку почитать не дали, а сразу послали - значит они просто пижоны. ИМХО.
В общем, этому научить сложно, если не сказать, невозможно. (*улыбается*)
Просто интуиция.
Обычно, алгоритм такой:
1) Берётся файл-архив, например archive.dat
2) Открывается каким-нибудь HEX-редактором
3) Смотрится его начало - если там есть что-то похожее на имена файлов - значит это FAT (File Allocation Table - таблица размещения файлов) архива.
Если в начале FAT'а нет - смотрим конец файла. Если и там нет - смотрим какой-нибудь файл в том же каталоге, например, с именем archive.<b>dir</b>, если и его нет - значит файл-архив зашифрован либо в нём хранятся только хэши (современные игры, типа Tomb Raider: Legend) от имён файлов, соответственно, будут проблемы. Иногда FAT хранится в .EXE файле (редко - в основном видел только в старых играх).
4) После этого смотришь сколько байт между двумя именами файлов.
Считаешь их количество. Обычно там должно быть:
- если файл записан как ASCIIZ, то там в конце будет \0 после имени файла, иногда под имя файлы резервируеться жёсткое количество байт (Doom - .WAD / Quake I & II, Half-Life I - .PAK)
- смещение начала файла от начала archive.dat (т.е. где файл начинается)
- размер файла (может не храниться, а только смещение: Syberia II - .SYB архивы)
- может быть ещё какая-нибудь информация (дата и время создания файла - .ASF от Silent Hill 2 и ещё где пары игр), флаг, отвечающий за использование сжатия и шифрования (.DAT в Resident Evil 3), CRC32 сумма может храниться и т.д. - короче, что только разработчикам в голову придёт
Важно: поля могут идти В ЛЮБОМ порядке (см. след. пункт).
5) После обнаружения FAT, обычно, нужно определить только три вещи:
- количество файлов (обычно оно предшествует FAT'у)
А для каждого файла в отдельности:
- имя файла
- размер этого файла
и/или
- смещение этого файла от начала archive.dat (т.е. где файл начинается)
(смещение может выравниваться - Resident Evil 3 - т.е. прочитанное смещение нужно выравнять, умножив на, скажем, 32 - т.е. каждый новый файл начинается с границы кратной 32-ум байтам) Ещё смещение может быть абсолютным - отсносительно начала архива archive.dat и относительным - относительно начала заголовка (тогда чтобы получить абсолютное смещение, нужно к смещению прибавить размер заголовка)
Если известно только смещение или только размер - то вторую величину придётся высчитывать вручную. Думаю, это не особенно сложно.
а) В случае если известен только размер файла, то тупо после FAT / заголовка обычно следует первый файл архива. Значит следующий будет начинаться с:
размер_заголовка + сумма(размеров всех файлов, что шли до него)
!!!ЭТО РАБОТАЕТ ТОЛЬКО ТОГДА, КОГДА НЕТ ВЫРАВНИВАНИЯ!!!
б) В случае, если известно только смещение, то тут размер файла получается как:
смещение_второго - смещение_первого
Для получения размера последнего файла отнимается от размера всего файла archive.dat.
Чтобы узнать, какое из обнаруженных полей отвечает за размер/смещение:
1) Обычно размер и смещение идут подряд
2) Обычно размер и смещение 4 байта каждое (DWORD / Long тип)
3) Что отвечает за смещение, а что за размер - очень просто узнать - берутся подозрительные 4 байта, считаются как число (не забываем их развернуть в зависимости о Little Endian / Big Endian формата). Пока что обозначим эти два числа как long1 и long2.
4) Теперь, что делаем - смещаемся на long1 - там должно быть начало файла, если его там нет, то пробуем сместиться на long2 - если и там нет, то в обоих смещениях осматриваем окрестности - если заголовок где-то недалеко, то, значит, смещение было относительное - осталось выяснить "относительно" чего (обычно заголовка архива archive.dat).
5) Теперь, пусть у нас long2 - это было смещение. Тогда величина long2+long1 - должна указывать на начала следующего файла за тем, который начинался с long2 (или на конец файла (что одно и то же), если файлы выравнены). То что long1 - не размер можно сразу определить, если это число больше размера архива archive.dat в целом.
Очень удобно искать смещение, если в архиве файлы не пожаты и известного формата - например все .WAV начинаются на 'RIFF' так что найти где начинается первый файл и второй - не составит особого труда.
Остальные поля заголовка (типа сигнатрура, размер архива, количество файлов и т.д.) - находятся методом "тыка" - т.е. просто тупо парсишь все файлы из FAT'а, пока они не кончатся (т.е. не пойдёт "мусор" - данные первого файла) и считаешь их количество. После этого ищешь в FAT'е или заголовке поле, где записан этот номер - это и есть количество файлов. Иногда, может указываться размер поля с FAT, но не количество файлов. Если так, и <i>записи фиксированной длинны</i>, то количество получить просто:
TotalFiles:=SizeOf(FAT) Div SizeOf(SingleFATRecored);
для Си:
TotalFiles = sizeof(FAT) / sizeof(SingleFATRecord);
Обычно размер хранится только для ASCIIZ строк-имён (Earth 2140 - .WD), тогда там где-то должна быть ещё таблица смещений на начала этих строк.
Вообще, изучи вот это:
Xentax Wiki GRAFsТам много описаний форматов к разным играм. Просто посмотри, как другие форматы устроены - тогда сразу сам будешь при раскопке прикидывать что да как (правда, там некоторые форматы некорректно описаны - могут быть ошибки, так что аккуратней если надумаешь писать распаковщик).
Здесь я, естественно, описал далеко не всё, а только самое основное.
Остальное - придёт с опытом.
Удачи.