Home - thethiny/NRS-Asset-Manager GitHub Wiki

NRS Asset Manager

A Python toolkit for extracting and parsing game assets from NetherRealm Studios titles β€” UE3-based Midway engine games and UE4.27 (MK1).

Supported Games

Game Codename Engine Compression External Data Status
Mortal Kombat X (2015) MK10 UE3 (677) ZLIB / LZO .tfc Full extraction + 3D mesh + FMOD audio
Injustice 2 (2017) DCF2 UE3 (732) Oodle v4 .tfc Full extraction + skeletal mesh
Mortal Kombat 11 (2019) MK11 UE3 (769) Oodle v5 .psf Full extraction
Mortal Kombat 1 (2023) MK12 UE4.27 Oodle v9 .ucas (IoStore) UAsset parsing + IoStore extraction

Quick Start

CLI

# Auto-detects game from file header and version
python main.py extract path/to/file.xxx

# Display file header
python main.py header path/to/file.xxx

# List exports, imports, or names
python main.py list path/to/file.xxx --exports

# VFS mount and browse
python main.py vfs mount path/to/directory/
python main.py vfs tree path/to/file.xxx --depth 3

Browser (GUI)

python -m gui.browser

The PyQt6 browser supports:

  • Load tab β€” Add game paths, scan files, mount .xxx/.uasset/.utoc files with background threading
  • Browse tab β€” Tree with per-section texture preview, 3D mesh viewer, DataTable JSON, material sphere preview
  • Coalesced tab β€” Folder tree for localization/config files with export
  • MKScript tab β€” MKO function/variable/asset viewer

Extraction Pipeline

UE3 Games (MKX, IJ2, MK11)

.xxx (Compressed Archive)
  β†’ Midway Format (Decompressed UPK)
    β†’ Exports (Game Objects)
      → Handlers (Database→JSON, Texture2D→DDS/PNG, SkeletalMesh→3D, etc.)

UE4 Games (MK1)

UTOC/UCAS (IoStore, AES-ECB + Oodle v9)
  β†’ .uasset (Midway equivalent)
    → Exports (DataTable→JSON, etc.)

See Extraction Pipeline for details.

Encryption

Format Algorithm Games
Coalesced AES-ECB MKX, IJ2, MK11
DFP Rolling XOR + custom stream cipher MK11
FSB (FMOD) Bit-reverse + XOR MKX
IoStore AES-256-ECB MK1

Project Structure

mk_utils/
β”œβ”€β”€ nrs/
β”‚   β”œβ”€β”€ ue3_common.py              # Shared UE3 base classes
β”‚   β”œβ”€β”€ scene_assembler.py         # Mesh β†’ material β†’ texture binding
β”‚   β”œβ”€β”€ vfs/                       # Virtual filesystem (mount, browse, cache)
β”‚   β”œβ”€β”€ mkscript/                  # MKO bytecode parser (MKX, IJ2, MK11)
β”‚   β”œβ”€β”€ mkx/                      # MKX game module (UE3)
β”‚   β”œβ”€β”€ ij2/                      # IJ2 game module (UE3)
β”‚   β”œβ”€β”€ mk11/                     # MK11 game module (UE3)
β”‚   └── mk1/                      # MK1 game module (UE4.27)
β”‚       β”œβ”€β”€ ue4_common.py          # UAsset structs
β”‚       β”œβ”€β”€ archive.py             # IoStore container (UTOC/UCAS)
β”‚       β”œβ”€β”€ midway.py              # UAsset parser
β”‚       β”œβ”€β”€ ue4_properties.py      # UE4 tagged property deserializer
β”‚       └── class_handlers/        # DataTable handler
β”œβ”€β”€ formats/
β”‚   β”œβ”€β”€ compression/               # Oodle, ZLIB, LZO
β”‚   β”œβ”€β”€ coalesced.py               # AES-ECB Coalesced decryption
β”‚   β”œβ”€β”€ dfp.py                     # DFP encryption (pure Python)
β”‚   β”œβ”€β”€ fsb.py                     # FSB audio decryption
β”‚   └── dds.py                     # DDS header building + PNG conversion
β”œβ”€β”€ utils/
β”‚   └── structs.py                 # ctypes binary struct wrapper
gui/
β”œβ”€β”€ browser.py                     # PyQt6 asset browser
β”œβ”€β”€ mesh_viewer.py                 # OpenGL 3D mesh viewer
└── file_detector.py               # Magic/FourCC-based file detection

Documentation