Skip to main content

Extract files from any kind of container formats

Project description

unblob

Accurate, fast, and easy-to-use extraction suite for binary blobs.

unblob parses unknown binary blobs for 78+ archive, compression, and file-system formats, extracts their content recursively, and carves out unknown chunks. It is the perfect companion for extracting, analyzing, and reverse engineering firmware images.

CI PyPI version PyPI downloads License: MIT


Demo

demo


Features

  • 78+ supported formats — archives, compression streams, and file systems including SquashFS, JFFS2, UBI/UBIFS, ext, CPIO, ZIP, 7-Zip, gzip, XZ, LZMA, LZ4, and many more. See the full list.
  • Recursive extraction — extracts containers within containers up to a configurable depth (default: 10 levels).
  • Precise chunk detection — identifies both start and end offsets of each chunk according to the format standard, minimizing false positives.
  • Unknown chunk carving — carves out and reports data that does not match any known format, automatically identifying null/0xFF padding.
  • Entropy analysis — calculates Shannon entropy and chi-square probability for unknown chunks, useful for spotting encrypted or compressed data.
  • JSON metadata reports — generates structured reports with chunk offsets, sizes, entropy, file ownership, permissions, timestamps, and more.
  • Multi-processing — uses all available CPU cores by default for fast extraction.
  • Extensible plugin system — write custom format handlers and extractors and load them at runtime with --plugins-path.
  • No elevated privileges required — runs safely as a regular user.
  • Battle-tested — fuzz tested against a large corpus of firmware images; relies on audited, pinned dependencies.

Installation

pip (recommended for most users)

pip install unblob

Then install the required external extractor tools. On Ubuntu/Debian:

sudo apt install android-sdk-libsparse-utils e2fsprogs p7zip-full unar zlib1g-dev liblzo2-dev lzop lziprecover libhyperscan-dev zstd lz4

For SquashFS support, also install sasquatch:

curl -L -o sasquatch_1.0.deb "https://github.com/onekey-sec/sasquatch/releases/download/sasquatch-v4.5.1-6/sasquatch_1.0_$(dpkg --print-architecture).deb"
sudo dpkg -i sasquatch_1.0.deb && rm sasquatch_1.0.deb

Verify that all extractors are available:

unblob --show-external-dependencies

Docker (batteries included)

The Docker image bundles all extractors — no extra setup needed:

docker run \
  --rm \
  --pull always \
  -v /path/to/extract-dir:/data/output \
  -v /path/to/files:/data/input \
  ghcr.io/onekey-sec/unblob:latest /data/input/firmware.bin

Note: Mount directories must be owned by the same uid:gid. On multi-user systems, add -u $UID:$GID to the command.

Kali Linux

sudo apt install unblob

Nix

nix profile install nixpkgs#unblob

Or add it to your NixOS/home-manager configuration — see the installation docs for flake and overlay examples.

From source

git clone https://github.com/onekey-sec/unblob.git
cd unblob
uv sync --no-dev
uv run unblob --show-external-dependencies

Requires Python ≥ 3.10, uv, and a Rust toolchain (for the compiled extensions).


Usage

Command line

Extract a file (output goes to <filename>_extract/ by default):

unblob firmware.bin

Specify a custom output directory:

unblob -e /tmp/output firmware.bin

Generate a JSON metadata report:

unblob --report report.json firmware.bin

Limit recursion depth and enable entropy analysis:

unblob -d 5 -n 2 firmware.bin

Skip files matching a magic string prefix:

unblob --skip-magic "POSIX tar archive" firmware.bin

Load a custom handler plugin:

unblob -P ./myplugins/ firmware.bin

Full CLI reference

Usage: unblob [OPTIONS] FILE

Options:
  -e, --extract-dir DIRECTORY     Extract the files to this directory.
  -f, --force                     Force extraction even if outputs already exist.
  -d, --depth INTEGER             Recursion depth (default: 10).
  -n, --entropy-depth INTEGER     Entropy calculation depth (default: 1; 0 = off).
  -P, --plugins-path PATH         Load plugins from the provided path.
  -S, --skip-magic TEXT           Skip files with a given magic prefix.
  -p, --process-num INTEGER       Number of parallel worker processes (default: CPU count).
  --report PATH                   Write a JSON metadata report to this file.
  -k, --keep-extracted-chunks     Keep extracted chunks on disk.
  --delete-extracted-files TEXT   Delete intermediate files after extraction.
  -v, --verbose                   Increase verbosity (-v, -vv, -vvv).
  --show-external-dependencies    List required external tools and their status.
  -h, --help                      Show this message and exit.

Python API

from pathlib import Path
from unblob.processing import ExtractionConfig, process_file

config = ExtractionConfig(
    extract_root=Path("/tmp/output"),
    randomness_depth=1,
)

result = process_file(config, Path("firmware.bin"))

To also write a JSON report:

process_file(config, Path("firmware.bin"), report_file=Path("report.json"))

ExtractionConfig accepts the same options as the CLI: max_depth, process_num, skip_magic, force_extract, keep_extracted_chunks, and more. See the API reference for the full list.


Testing

unblob uses pytest. Integration test fixtures are stored in Git LFS.

# Install Git LFS (one-time setup)
git lfs install

# Install all development dependencies
uv sync --all-extras --dev

# Run the full test suite
uv run pytest tests/ -v

Documentation

Full documentation is available at https://unblob.org:


Contributing

Contributions are welcome! If you would like to add support for a new format or improve an existing one:

  1. Open an issue to describe the format (hex dumps, spec links, and sample files help a lot).
  2. Read the development guide to learn how to write handlers and extractors.
  3. Fork the repository, implement your changes, and open a pull request.

If you just need a format supported and don't want to implement it yourself, open an issue — we'll consider adding it.

See CONTRIBUTING for more details.


License

unblob is licensed under the MIT License.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

unblob-26.6.4.tar.gz (163.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

unblob-26.6.4-cp39-abi3-musllinux_1_1_x86_64.whl (734.4 kB view details)

Uploaded CPython 3.9+musllinux: musl 1.1+ x86-64

unblob-26.6.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (530.7 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

unblob-26.6.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (525.6 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

unblob-26.6.4-cp39-abi3-macosx_11_0_arm64.whl (478.0 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

unblob-26.6.4-cp39-abi3-macosx_10_12_x86_64.whl (484.0 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

File details

Details for the file unblob-26.6.4.tar.gz.

File metadata

  • Download URL: unblob-26.6.4.tar.gz
  • Upload date:
  • Size: 163.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: maturin/1.13.3

File hashes

Hashes for unblob-26.6.4.tar.gz
Algorithm Hash digest
SHA256 5dac92c617912d77fef471b28df86cdd7aa3817de3b6febd9bb9251fb41552fa
MD5 18d7743ca5a76f234d61264ded8e3656
BLAKE2b-256 b07130a7ff4b91e99e45a9df491cd16d048ce50d2e2998c1dbdd3a0ba6558f5f

See more details on using hashes here.

File details

Details for the file unblob-26.6.4-cp39-abi3-musllinux_1_1_x86_64.whl.

File metadata

File hashes

Hashes for unblob-26.6.4-cp39-abi3-musllinux_1_1_x86_64.whl
Algorithm Hash digest
SHA256 3ee8696c2aa883d136047cb565ce25826adf5daa6b77fbf89803438e0c4c696f
MD5 428842fa1357f7d33ab171641088b46c
BLAKE2b-256 1f7e08898b09543f36e58e171f8faecaa4275e7fb7d831cafe19ba157503d197

See more details on using hashes here.

File details

Details for the file unblob-26.6.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for unblob-26.6.4-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0fc16e9c7dc92fcf86b8b61475700c9dd16e1dddacf34467574ea965a5d3584e
MD5 78c65238a5713eaee711082d494af4ea
BLAKE2b-256 33c01a794c156f0f4dc88542357850decd0854e65dadd7f63da85fba5ad37dbe

See more details on using hashes here.

File details

Details for the file unblob-26.6.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for unblob-26.6.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0d5dfdd3850ab8849c6be5f9c27724d679b8e55e909b92726e3835cd1b67cff7
MD5 7f9837b557dae676eb93179e61e99d43
BLAKE2b-256 0b5cf956c5dba696f2a012711847703b53cb2338f0c090640aacdc88dac7d091

See more details on using hashes here.

File details

Details for the file unblob-26.6.4-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for unblob-26.6.4-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a2276495ae5ec3ed760af85c4c486711998205bbff97b09bde970b3d007b1476
MD5 f1f391a5cb5d3ef5cb3f4b0264677de4
BLAKE2b-256 e7bfafe6d513884431111d808af37ee58be29251385d44466bfcf78b0d15bdfc

See more details on using hashes here.

File details

Details for the file unblob-26.6.4-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for unblob-26.6.4-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7b3d1a1a41e031395d052d6ac3d52c7edef0f40f2c4438514c6e5565361aaef7
MD5 1088ac99a4c27c41521a859abd202cc8
BLAKE2b-256 5d13e41ce1e1f93df5d8c936609cd081e3fe5d94722344667fa0ac343b0211b1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page