Arx Fatalis

From XentaxWiki
Jump to: navigation, search

Choose archive extension:

PAK


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


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