Unpack: Talesrunner Pkg
Start with QuickBMS and a known-good script. Only when you encounter modern, encrypted PKGs should you dive into Python or C++ custom extractors. And always remember: the skills you gain from this process—binary parsing, cryptographic reversals, compression algorithms—apply far beyond a single game.
Introduction TalesRunner , the chaotic and beloved arcade-style runner game developed by Rhaon Entertainment and published by Nowcom (and later Papaya Play), has maintained a dedicated modding community for nearly two decades. At the heart of any attempt to customize, translate, or reverse engineer the game lies a single technical hurdle: the TalesRunner PKG file . talesrunner pkg unpack
# Read file table file_count = struct.unpack('<I', f.read(4))[0] entries = [] for _ in range(file_count): offset = struct.unpack('<I', f.read(4))[0] zsize = struct.unpack('<I', f.read(4))[0] size = struct.unpack('<I', f.read(4))[0] name_len = struct.unpack('B', f.read(1))[0] name = f.read(name_len).decode('utf-8') entries.append((name, offset, zsize, size)) # AES decryption (example key - replace with actual) cipher = AES.new(b'your_aes_key_16b', AES.MODE_ECB) for name, offset, zsize, size in entries: f.seek(offset) enc_data = f.read(zsize) dec_data = cipher.decrypt(enc_data) # Decompress if needed (LZSS, zlib) out_path = os.path.join(output_dir, name) os.makedirs(os.path.dirname(out_path), exist_ok=True) with open(out_path, 'wb') as out: out.write(dec_data[:size]) if == ' main ': unpack_talesrunner_pkg('data001.pkg', './extracted') Start with QuickBMS and a known-good script
# TalesRunner PKG unpack script for QuickBMS # Supports XOR obfuscation and LZSS decompression get NAME basename string NAME + "_unpacked/" set MEMORY_FILE string "" comtype lzss f.read(4))[0] zsize = struct.unpack('<
import struct import os from Crypto.Cipher import AES def unpack_talesrunner_pkg(pkg_path, output_dir): with open(pkg_path, 'rb') as f: header = f.read(4) if header != b'PKG\x00': raise ValueError("Invalid PKG signature")