3 releases
Uses new Rust 2024
| 0.1.3 | Aug 3, 2025 |
|---|---|
| 0.1.2 | Jul 31, 2025 |
| 0.1.1 |
|
| 0.1.0 | Jul 31, 2025 |
#344 in Development tools
110KB
2.5K
SLoC
Pay10ad Dumper
Feature-rich Android OTA payload dumper written in Rust.
What is Payload? Android payload is a file that contains ROM partitions like boot, system, vendor and others. Payload Dumper extracts these partitions from the
payload.binfile.
🪄 Features
- Extract partitions selectively (Specify via
-p/--partitions) - Extract from local
payload.binor ROM zip file without decompressing the whole archive - Extract from HTTP(S) URL (
payload.binor zip) without downloading the whole file (Need server support) - Verify output partitions
- Parallelism to maximize speed (Customizable via
--no-parallel/--threads) - Tiny: < 1M compressed on all common platforms (Windows, MacOS, Linux)
📥 Installation
Using binstall
cargo binstall pay10ad-dumper
Downloading from Releases
Navigate to the Releases page and download respective binary for your platform. Make sure to give it execute permissions.
Compiling from Source
cargo install pay10ad-dumper
📖 Usage
Common Usage
- Extract all partitions from
payload.bin:pay10ad-dumper payload.bin - List partitions from
ota.zip:pay10ad-dumper -l ota.zip - Extract
boot&init_bootfrom<URL>:pay10ad-dumper -p boot -p init_boot <URL>
📸 Screenshots
Extracting init_boot.img from an online OTA zip file with specified UA:

Listing partitions from local payload.bin:

Listing partitions from remote ota.zip:

CLI Reference
$ pay10ad-dumper --help
Usage: pay10ad-dumper <payload_path> [-o <out>] [--diff] [--old <old>] [--partitions <partitions...>] [--threads <threads>] [--list] [--metadata] [--no-parallel] [--no-verify] [-u <user-agent>]
Feature-rich Android OTA payload dumper written in Rust
Positional Arguments:
payload_path path or URL to your payload
Options:
-o, --out output directory for extracted partitions
--diff enable differential OTA mode (requires --old)
--old path to the directory containing old partition images
(required for --diff)
--partitions list of partition names to extract
--threads number of threads to use for parallel processing
--list list available partitions in the payload
--metadata save complete metadata as JSON (use --out - to write to
stdout)
--no-parallel disable parallel extraction
--no-verify skip hash verification
-u, --user-agent the User-Agent to use if extracting from URL (Defaults to a
representative browser UA)
--help, help display usage information
🤔 Comparison
| Project | Lang | Zip | URL | URL + zip | Size |
|---|---|---|---|---|---|
vm03/payload_dumper |
🐍 Python | 🔴 | 🔴 | 🔴 | N/A |
5ec1cff/payload-dumper |
🐍 Python | 🟢 | 🟢 | 🟡 | N/A |
payload-dumper-go |
🐹 Go | 🟢 | 🔴 | 🔴 | ≈5.5M |
payload-dumper-rust |
🦀 Rust | 🟢 | 🟢 | 🟢 | ≈3.5M |
pay10ad-dumper |
🦀 Rust | 🟢 | 🟢 | 🟢 | ≈2M |
Specification
- Heading
Zip: Whether it supports extracting partitions from ZIP archives without decompressing it first.URL: Whether it supports extracting partitions frompayload.binURLs without downloading the whole file.URL + Zip: Whether it supports extracting partitions fromota.zipURLs without downloading the whole file.Size: Executable size on Linux, decompressed.
- Values
🔴: No🟢: Yes🟡: Not tested
🛣️ Todo
- Async
- Better errors
- Use another CLI parser
- Customize HTTP headers
🎉 Credits
- Forked from rhythmcache/payload-dumper-rust to scratch my own itch (Set User-Agent)
Dependencies
~13–34MB
~502K SLoC