Difference between revisions of "Unreal Engine 4 PAK"

From XentaxWiki
Jump to: navigation, search
(See Also)
(Games)
 
(18 intermediate revisions by the same user not shown)
Line 4: Line 4:
 
* ''' Format Type ''':    Archive <br>  
 
* ''' Format Type ''':    Archive <br>  
 
* ''' [http://en.wikipedia.org/wiki/Endianness Endian Order] ''': Little Endian <br>
 
* ''' [http://en.wikipedia.org/wiki/Endianness Endian Order] ''': Little Endian <br>
* ''' Signature ''':    None <br>  
+
* ''' Signature ''':    E1 12 6F 5A <br>  
  
  
Line 11: Line 11:
 
<div style="border:solid 1px #AAAAAA; padding:4px; background-color:#F9F9F9; font-weight:bold;">
 
<div style="border:solid 1px #AAAAAA; padding:4px; background-color:#F9F9F9; font-weight:bold;">
 
<tt>
 
<tt>
<font color="blue"><i>Uses ZLib, GZip, or Snappy Compression</i></font><br />
+
<font color="blue"><i>// Unreal Engine 4 PAK file format</i></font><br />
 
<font color="blue"><i>FILE DATA</i></font><br />
 
<font color="blue"><i>FILE DATA</i></font><br />
 
&nbsp;&nbsp;<font color="blue"><i>for each file</i></font><br />
 
&nbsp;&nbsp;<font color="blue"><i>for each file</i></font><br />
Line 17: Line 17:
 
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Compressed Length  <font color="purple">(not including the file header fields or padding)</font><br />
 
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Compressed Length  <font color="purple">(not including the file header fields or padding)</font><br />
 
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Decompressed Length<br />
 
&nbsp;&nbsp;&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Decompressed Length<br />
&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Compression Type  <font color="purple">(0=uncompressed, 1=ZLib, 2=GZip, 4=Snappy)</font><br />
+
&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Compression Type  <font color="purple">(0=uncompressed, 1=ZLib, 2=GZip, 4=Snappy, 16=bias memory, 32=bias speed)</font><br />
&nbsp;&nbsp;&nbsp;&nbsp;byte {20}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<font color="red">Unknown</font><br />
+
&nbsp;&nbsp;&nbsp;&nbsp;byte {20}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;data sha1 hash<br />
 
&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>if (compressed){</i></font><br />
 
&nbsp;&nbsp;&nbsp;&nbsp;<font color="blue"><i>if (compressed){</i></font><br />
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Number of Compressed Blocks<br />
 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Number of Compressed Blocks<br />
Line 70: Line 70:
 
<br />
 
<br />
 
<font color="blue"><i>FOOTER (44 bytes)</i></font><br />
 
<font color="blue"><i>FOOTER (44 bytes)</i></font><br />
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Magic Number <font color="purple">((bytes)225,18,111,90)</font><br />
+
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Signature <font color="purple">((bytes)225,18,111,90) // E1 12 6F 5A  // "..oZ" </font><br />
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Version  <font color="purple">(3)</font><br />
+
&nbsp;&nbsp;uint32 {4}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Version  <font color="purple">// 1, 2, 3, 4, 7 or 8</font><br />
 
&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Directory Offset<br />
 
&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Directory Offset<br />
 
&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Directory Length  <font color="purple">(not including FOOTER)</font><br />
 
&nbsp;&nbsp;uint64 {8}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;Directory Length  <font color="purple">(not including FOOTER)</font><br />
&nbsp;&nbsp;byte {20}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;<font color="red">Unknown</font><br />
+
&nbsp;&nbsp;byte {20}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;directory sha1 hash<br />
 
<br />
 
<br />
 
</tt>
 
</tt>
Line 86: Line 86:
  
 
* [http://aluigi.org/bms/unreal_tournament_4.bms unreal_tournament_4.bms]
 
* [http://aluigi.org/bms/unreal_tournament_4.bms unreal_tournament_4.bms]
 +
* [https://zenhax.com/viewtopic.php?f=9&t=1005&p=56251#p56251 Other scripts]
  
 
=== Notes and Comments ===  
 
=== Notes and Comments ===  
  
 +
* It is popular file format used in many games made on Unreal Engine 4.
 
* These files normally occur in path such as "\<game_name>\<build_name>\Content\Paks\<build_name>-WindowsNoEditor.pak"
 
* These files normally occur in path such as "\<game_name>\<build_name>\Content\Paks\<build_name>-WindowsNoEditor.pak"
 
* This archive type uses ZLIB, GZIP or Snappy compression method.
 
* This archive type uses ZLIB, GZIP or Snappy compression method.
 +
* Data may be encrypted with AES encryption.
 +
* To parse the archive, footer needs to be read first, because it has important info about offsets.
  
 
=== Games ===  
 
=== Games ===  
 
List of games using this file format:
 
List of games using this file format:
* Legendary Hunter VR
+
 
* Little Nightmares II (PC) (*.PAK)
+
* Little Nightmares II (PC) (*.PAK) (version 8)
 
* Styx: Shards of Darkness
 
* Styx: Shards of Darkness
 +
* Tekken 7 (PC) (*.PAK) (version 3)
 
* The Fall of Lazarus
 
* The Fall of Lazarus
 +
* Many more...
  
 
=== Compatible Programs ===  
 
=== Compatible Programs ===  
Line 121: Line 127:
 
[[Category:GZIP compression]]
 
[[Category:GZIP compression]]
 
[[Category:SNAPPY compression]]
 
[[Category:SNAPPY compression]]
 +
[[Category:AES encryption]]
 
[[Category:File Format]]
 
[[Category:File Format]]

Latest revision as of 15:34, 3 October 2021

Back to index | Edit this page

PAK

  • Format Type : Archive
  • Endian Order : Little Endian
  • Signature : E1 12 6F 5A


Format Specifications

// Unreal Engine 4 PAK file format
FILE DATA
  for each file
    uint64 {8}       - null
    uint64 {8}       - Compressed Length (not including the file header fields or padding)
    uint64 {8}       - Decompressed Length
    uint32 {4}       - Compression Type (0=uncompressed, 1=ZLib, 2=GZip, 4=Snappy, 16=bias memory, 32=bias speed)
    byte {20}        - data sha1 hash
    if (compressed){
      uint32 {4}       - Number of Compressed Blocks
      for each compressed block
        uint64 {8}       - Offset to the start of the compressed data block (relative to the start of the archive)
        uint64 {8}       - Offset to the end of the compressed data block (relative to the start of the archive)

      byte {1}         - null
      for each compressed block
        uint32 {4}       - Decompressed Length of thie block
        byte {X}         - File Data (ZLib Compression)

      byte {0-2047}    - null Padding to a multiple of 2048 bytes (sometimes, not always)
      }

    else if (uncompressed){
      uint32 {4}       - null
      byte {1}         - null
      byte {X}         - File Data
      byte {0-2047}    - null Padding to a multiple of 2048 bytes (sometimes, not always)
      }

DIRECTORY
  uint32 {4}       - Relative Directory Name Length (including null terminator) (10)
  byte {9}         - Relative Directory Name (../../../)
  byte {1}         - null Relative Directory Name Terminator
  uint32 {4}       - Number of Files
  for each file
    uint32 {4}       - Filename Length (including null terminator)
    byte {X}         - Filename
    byte {1}         - null Filename Terminator
    uint64 {8}       - File Offset
    uint64 {8}       - Compressed Length (not including the file header fields or padding)
    uint64 {8}       - Decompressed Length
    uint32 {4}       - Compression Type (0=uncompressed, 1=ZLib, 2=GZip, 4=Snappy)
    byte {20}        - Unknown
    if (compressed){
      uint32 {4}       - Number of Compressed Blocks
      for each compressed block
        uint64 {8}       - Offset to the start of the compressed data block (relative to the start of the archive)
        uint64 {8}       - Offset to the end of the compressed data block (relative to the start of the archive)

      byte {1}         - null
      uint32 {4}       - Decompressed Block Size (65536 if multiple blocks, otherwise the same as the decompressed length)
      }

    else if (uncompressed){
      uint32 {4}       - null
      byte {1}         - null
      }

FOOTER (44 bytes)
  uint32 {4}       - Signature ((bytes)225,18,111,90) // E1 12 6F 5A // "..oZ"
  uint32 {4}       - Version // 1, 2, 3, 4, 7 or 8
  uint64 {8}       - Directory Offset
  uint64 {8}       - Directory Length (not including FOOTER)
  byte {20}        - directory sha1 hash

MultiEx BMS Script

Not written yet.

QuickBMS Script

Notes and Comments

  • It is popular file format used in many games made on Unreal Engine 4.
  • These files normally occur in path such as "\<game_name>\<build_name>\Content\Paks\<build_name>-WindowsNoEditor.pak"
  • This archive type uses ZLIB, GZIP or Snappy compression method.
  • Data may be encrypted with AES encryption.
  • To parse the archive, footer needs to be read first, because it has important info about offsets.

Games

List of games using this file format:

  • Little Nightmares II (PC) (*.PAK) (version 8)
  • Styx: Shards of Darkness
  • Tekken 7 (PC) (*.PAK) (version 3)
  • The Fall of Lazarus
  • Many more...

Compatible Programs

See Also