Arx Fatalis PAK
From XentaxWiki
Choose archive extension:
Contents
PAK
- Format Type : Archive
- Endian Order : Little Endian
Format Specifications
// ARCHIVE HEADER
- uint32 {4} - Directory Offset
byte {X} - File Data
// FILES DIRECTORY
- uint32 {4} - Directory Length
// for each directory
- char {X} - Path
- byte {1} - null Path Terminator
- uint32 {4} - Number Of Files
- // for each file
- char {X} - Filename
- byte {1} - null Filename Terminator
- uint32 {4} - File Offset
- uint32 {4} - Packed flag (0 - unpacked, else - PKWARE implode)
- uint32 {4} - Decompressed Length (0 if not packed - use File Length below)
- uint32 {4} - File Length
- char {X} - Filename
- // for each file
Notes and Comments
- In retail version Directory XORed with string:
AVQF3FCKE50GRIAYXJP2AMEYO5QGA0JGIIH2NHBTVOA1VOGGU5H3GSSIARKPRQPQKKYEOIAQG1XRX0J4F5OEAEFI4DD3LL45VJTVOA1VOGGUKE50GRIAYX
- There are two type of demo version - first one doesn't use any XOR in Directory and second one use different from retail string:
NSIARKPRQPHBTE50GRIH3AYXJP2AMF3FCEYAVQO5QGA0JGIIH2AYXKVOA1VOGGU5GSQKKYEOIAQG1XRX0J4F5OEAEFI4DD3LL45VJTVOA1VOGGUKE50GRI
- The way to detect which key must be used (or not used at all) is to read first 5 bytes (first entry always empty and have 0 files: 1 (null Path Terminator) + 4 (Number Of Files) = 5) of the Directory and compare it with: 5 zero bytes (demo1 - no encryption), "AVQF3" (retail) or "NSIAR" (demo2).
MultiEx BMS Script
ImpType StandardTail ; SavePos TailOffOff 0 ; Get TO Long 0 ; GoTo TO 0 ; Get TS Long 0 ; SavePos T 0 ; Math T += 5 ; GoTo T 0 ; Get Path String 0 ; Get FN Long 0 ; For D = 1 To FN ; Set Name String Path ; Get Name String 0 ; SavePos FOO 0 ; Get FO Long 0 ; Get ZipState Long 0 ; Get OrSize Long 0 ; SavePos FSO 0 ; Get FS Long 0 ; Log Name FO FS FOO FSO ; Next D ;
Compatible Programs
- MultiEx Commander
- Game Extractor
- Arx Fatalis .PAK unpacker - with C++ source code
- arxunpak
- ArxPak
- afunpak
- arx-unpacker