Home

Awesome

PUBG Mobile Unpacker

Description:

PUBG Mobile Pak Extractor is a C program designed to extract contents from PUBG Mobile pak files. This tool is tailored for versions before the 1.1.0 update, as post-update changes in encryption algorithms are not currently supported.

Key Features:

Usage:

  1. Compile the program.
  2. Run the executable with the PUBG Mobile pak file as an argument.

Note: Ensure compatibility with the version specified, and be aware of the limitations post the 1.1.0 update due to changes in encryption methods.

How to Use:

./pubg_mobile_unpack <path_to_pak_file>

Build Instructions:

To build the executable, use the following command:

cc pubg_mobile_unpack.c -o pubg_mobile_unpack -lz -lzstd -liconv -O2

for pubg mobile chinese (game for peace) version

cc game_for_peace_unpack.c -o game_for_peace_unpack -lz -O2

pubgm pak file structure:

Format Specifications
Unreal Engine 4 PUBGM PAK file format

FILE DATA
  for each file
    uint8 {20}       - File Hash
    uint64 {8}       - File Offset
    uint64 {8}       - File Size
    uint32 {4}       - Compression Method (0=uncompressed, 1=zLib, 6=zstd)
    uint64 {8}       - Compressed Length
    uint8 {21}       - Dummy byte

    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)
    }
    
    uint32 {4}       - Compressed Block Size
    uint8 {1}        - Is Encrypted
    byte {X}         - File Data
    
INDEX DATA
  uint32 {4}       - Relative Directory Name Length (including null terminator) (10)
  byte {X}         - Relative Directory Name (../../../)
  uint32 {4}       - Number of Files
  for each file
    uint32 {4}       - Filename Length (including null terminator)
    byte {X}         - Filename
    uint8 {20}       - File Hash
    uint64 {8}       - File Offset
    uint64 {8}       - File size
    uint32 {4}       - Compression Method (0=uncompressed, 1=zlib, 6=zstd)
    uint64 {8}       - Compressed Length 
    uint8 {21}       - Dummy byte
    
    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)
    }
    
    uint32 {4}       - Compressed Block Size
    uint8 {1}        - Is Encrypted

FOOTER (45 bytes)
  uint8  {1}       - IsEncrypted (obfuscated) (xor key) 0x01
  uint32 {4}       - Signature (obfuscated) (xor key) 0xA0116E7
  uint32 {4}       - Version (normal)
  byte {20}        - IndexData sha1 hash (obfuscated) (xor key) 0x8CD3A05AD36453DEEDA8CA5926C6955484259BE0
  uint64 {8}       - IndexData length (obfuscated) (xor key) 0x1FFBEE0AB84D0C43
  uint64 {8}       - IndexData offset (obfuscated) (xor key) 0xA6D17AB4D4783A41
  

Contributing:

Contributions are welcome! If you find any issues or have improvements to suggest, please open an issue or submit a pull request.

License:

This project is licensed under the MIT License.