Borderlands 4 reverse engineering toolkit — save editor, item serial decoder, NCS parser, items database, drop rate analysis, and memory tools.
| Crate | Description |
|---|---|
bl4 |
Core library (crypto, serial codec, save manipulation, manifest) |
bl4-cli |
Command-line interface (bl4 binary) |
bl4-idb |
Items database (SQLite/PostgreSQL, sync/async) |
bl4-ncs |
Nexus Config Store parser (game binary config format) |
bl4-community |
Community API server (Axum) |
bl4-save-editor |
GUI save editor (Tauri) |
uextract |
UE5 IoStore/pak extractor |
bl4-preload |
LD_PRELOAD instrumentation library |
From source:
git clone https://github.com/monokrome/bl4.git
cd bl4
cargo build --release -p bl4-cliBinary location: target/release/bl4
bl4 configure --steam-id 76561197960521364
bl4 configure --showSteam ID is required for encryption/decryption. Find it in your Steam profile URL.
# Decrypt to YAML
bl4 save 1.sav decrypt -o save.yaml
bl4 save 1.sav decrypt > save.yaml
# Encrypt from YAML
bl4 save 1.sav encrypt save.yaml
# Edit in $EDITOR
bl4 save 1.sav edit
# Query values
bl4 save 1.sav get
bl4 save 1.sav get --level
bl4 save 1.sav get --money
bl4 save 1.sav get --info
bl4 save 1.sav get "state.currencies.cash"
# Set values
bl4 save 1.sav set "state.experience[0].level" 50
bl4 save 1.sav set "state.currencies.cash" 999999
# Fog-of-discovery map manipulation
bl4 save 1.sav --map reveal
bl4 save 1.sav --map clear --zone "Crimson Badlands"
# Validate all items in a save
bl4 save 1.sav --validate-items# Decode a serial
bl4 serial decode '@Ugr$ZCm/&tH!t{KgK/Shxu>k'
bl4 serial decode '@Ugr$ZCm/&tH!t{KgK/Shxu>k' --verbose
bl4 serial decode '@Ugr$ZCm/&tH!t{KgK/Shxu>k' --rarity
# Validate serial legality
bl4 serial validate '@Ugr$ZCm/&tH!t{KgK/Shxu>k'
bl4 serial validate '@Ugr$ZCm/&tH!t{KgK/Shxu>k' --verbose
# Compare two serials
bl4 serial compare '<serial1>' '<serial2>'
# Modify serial (swap parts from source into base)
bl4 serial modify '<base>' '<source>' <parts>
# Batch decode serials to binary
bl4 serial batch-decode serials.txt output.binTrack, identify, and analyze items across saves:
# Initialize database
bl4 idb init
# Import items from a save file
bl4 idb import-save 1.sav --decode
# Decode all serials and populate metadata
bl4 idb decode-all
# List items with filters
bl4 idb list --weapon-type Pistol --manufacturer Jakobs
bl4 idb list --rarity Legendary --format csv
# Show item details
bl4 idb show '<serial>'
# Set metadata with source attribution
bl4 idb set-value '<serial>' name "Terminus" --source ingame
# Publish/pull items to community server
bl4 idb publish --server https://api.example.com
bl4 idb pull --server https://api.example.comParse and extract data from the game's binary configuration format:
# Scan a directory for NCS file types
bl4 ncs scan /path/to/decompressed/
# Show contents of an NCS file
bl4 ncs show inv0.bin
# Extract manifests (parts database, category names)
bl4 ncs extract -t manifest /path/to/decompressed/ --json
# Search for patterns across NCS files
bl4 ncs search /path/to/decompressed/ "weapon_ps"
# Decompress NCS from a .pak file
bl4 ncs decompress game.pak -o ./ncs/ --raw
# Decompress a single .ncs file
bl4 ncs decompress Nexus-Data-inv0.ncs -o inv0.bin --rawThe manifest is assembled from three data sources: game memory (part
indices, usmap schema), PAK assets (manufacturers, weapon types, gear
types, elements, rarities, stats), and NCS files (parts database,
category names). Requires the research feature:
cargo build -p bl4-cli --features research.
The bl4 manifest command runs the full pipeline in one shot:
# Full regeneration from game Paks + memory dump
bl4 manifest /path/to/game/Paks/ -d game.bin
# With a pre-extracted usmap (skips memory dump step)
bl4 manifest /path/to/game/Paks/ -m game.usmap
# Skip memory entirely (NCS + PAK extraction only)
bl4 manifest /path/to/game/Paks/ --skip-memory
# Resume from existing uextract output
bl4 manifest /path/to/game/Paks/ -d game.bin --skip-extract --extracted /tmp/bl4_extract
# Custom output directory
bl4 manifest /path/to/game/Paks/ -d game.bin -o share/manifest/Output lands in share/manifest/ by default. Individual steps can also
be run separately via bl4 memory, bl4 extract, and bl4 ncs.
Query drop rates and legendary item sources:
# Find where an item drops
bl4 drops find "Terminus"
# List all drops from a specific source
bl4 drops source "Dryl"
# List all known sources or items
bl4 drops list --sources
bl4 drops list --itemsQuery the parts manifest:
# Find parts for a weapon type
bl4 parts "Jakobs Pistol"Read and analyze live game process memory or dump files:
# Attach to live process
bl4 memory info
bl4 memory objects --class WeaponData
bl4 memory fname 12345
# Work with dump files
bl4 memory --dump game.bin info
bl4 memory --dump game.bin scan "48 8B 05 ?? ?? ?? ??"
# LD_PRELOAD instrumentation
bl4 memory preload run -- wine Borderlands4.exe
bl4 memory preload watch /tmp/bl4_log# Extract all assets from pak files
uextract /path/to/Paks -o extracted/
# Filter by path pattern
uextract /path/to/Paks -f "ItemSerialPart" -o parts/
# List contents without extracting
uextract list /path/to/Paks[dependencies]
bl4 = "0.6"use bl4::{decrypt_sav, encrypt_sav, SaveFile, ItemSerial};
use std::fs;
let encrypted = fs::read("1.sav")?;
let yaml_data = decrypt_sav(&encrypted, "76561197960521364")?;
let mut save = SaveFile::from_yaml(&yaml_data)?;
println!("Character: {:?}", save.get_character_name());
println!("Cash: {:?}", save.get_cash());
save.set_cash(999999)?;
let modified_yaml = save.to_yaml()?;
let encrypted = encrypt_sav(&modified_yaml, "76561197960521364")?;
fs::write("1.sav", encrypted)?;use bl4::ItemSerial;
let item = ItemSerial::decode("@Ugr$ZCm/&tH!t{KgK/Shxu>k")?;
if let Some((mfr, wtype)) = item.weapon_info() {
println!("{} {}", mfr, wtype);
}
let validation = item.validate();
println!("Legality: {}", validation.legality);.sav -> decrypt (AES-256-ECB) -> decompress (zlib) -> YAML
Key derivation: Steam ID XOR'd with hardcoded base key.
cargo test
cargo clippy --workspaceUnofficial tools. Borderlands and related trademarks are property of Gearbox Software and 2K. Not affiliated with or endorsed by Gearbox or 2K.
Use at your own risk.
BSD-2-Clause