letterbomb 5.0.0

A fork of the classic Wii hacking tool from fail0verflow
Documentation
<div align="center">

<h1>✉️💣 LetterBomb</h1>

[![](assets/upscaled.png)](https://gitlab.com/whoatemybutter/letterbomb)

[![Crates.io](https://img.shields.io/crates/v/letterbomb.svg)](https://crates.io/crates/letterbomb)
[![docs.rs](https://docs.rs/letterbomb/badge.svg)](https://docs.rs/letterbomb)
[![CI/CD](https://img.shields.io/gitlab/pipeline/whoatemybutter/letterbomb/master?label=ci%2Fcd)](https://gitlab.com/whoatemybutter/letterbomb/-/pipelines)
[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://spdx.org/licenses/MIT.html)

</div>

A Rust-native fork of the classic Wii hacking tool originally written in Python.
by [fail0verflow](https://github.com/fail0verflow/letterbomb).
Offered in both library and binary flavors.

LetterBomb generates the payload files to trigger the [LetterBomb exploit](https://wiibrew.org/wiki/LetterBomb) for a
Wii console on version 4.3.

- [MSRV]#minimum-supported-rust-version
- [Getting started]#getting-started
- [Example]#example
  - [As a binary]#as-a-binary
  - [As a library]#as-a-library
- [What happened to Python?]#what-happened-to-python
- [License]#license

---

## Minimum supported Rust version

MSRV is `1.85.0`, edition `2024`.

## Getting started

LetterBomb is on [crates.io](https://crates.io/crates/letterbomb).

```toml
[dependencies]
letterbomb = "5.0.0"
```

Or install the standalone binary:

```shell
cargo install letterbomb
```

---

## Example

### As a binary

LetterBomb outputs in color.

```shell
# Help
letterbomb -h

# Order of arguments is mac region output
# Region can be U E J K
letterbomb "00:17:ab:5a:6e:f5" K outputdir

# Use -b or --bundle to include HackMii installer
letterbomb "00:17:ab:5a:6e:f5" U outputdir -b

# Errors are printed transparently
letterbomb "00:17:ab:99:99:99"
# => error: invalid value '00:17:ab:99:99:99' for '<mac>': MAC address is for emulated Wii
letterbomb "00:17:ab:5a:6e:f5" A
# => error: invalid value 'A' for '<region>': region "A" not U, E, J, K

# Output isn't allowed to be a file
touch outputfile
letterbomb "00:17:ab:5a:6e:f5" E outputfile
# => error: output is file; will not clobber

# If outputdir does not exist, it will be created
# Intermediate parent directories for output are created if safe
letterbomb "00:17:ab:5a:6e:f5" U outputdir/sub/sub/sub/sub
```

---

### As a library

```rust
use std::collections::HashMap;
use letterbomb::{generate::make_payload_now, mac::WiiMAC, region::Region};

fn test() {
    let mac: WiiMAC = "00:17:AB:5A:6E:F5".parse()?;
    let region = Region::U;
    let include_bundle = true;

    // `payload` maps sub-paths (e.g. "boot.elf", "message.txt", …)
    // to file contents as Vec<u8>.
    let payload: HashMap<String, Vec<u8>> =
        make_payload_now(mac, region, include_bundle)
            .ok_or("failed to build payload")?;
}
```

---

## What happened to Python?

- Versions **1.x–4.x** of LetterBomb were implemented in **Python**.
- Starting with **v5.0**, the codebase was **rewritten in Rust** for performance, safety, and cross-platform support.
  Functionality should be identical, if not improved.
- If you still need Python bindings,
  you can wrap the library API yourself
  or continue to use the old Python release at your own risk.

---

## License

Licensed under [MIT](https://spdx.org/licenses/MIT.html).