
Decripta ed estrai i messaggi vocali MP3 di guida dai pacchetti vocali crittografati di Sony WH-1000XM4. Chiave AES estratta tramite dump del firmware Bluetooth del SoC Airoha MT2811.
Decriptare ed estrarre i promemoria MP3 della guida vocale dai file firmware crittografati delle Sony WH-1000XM4.
La chiave AES-128-CBC è stata estratta scaricando il firmware Airoha MT2811 delle cuffie tramite Bluetooth Low Energy usando il protocollo RACE, poi disassemblando la routine di decriptazione FOTA del ARM Cortex-M4. Documentazione tecnica completa: docs/WRITEUP.md
# Installare Bun (se non già installato)
curl -fsSL https://bun.sh/install | bash
git clone https://github.com/HelgeSverre/sony-vp-extract.git
cd sony-vp-extract
bun install
# Scarica automaticamente dal CDN Sony, poi estrae
bun run cli/extract.ts --all
# Estrai tutto — scarica automaticamente dal CDN Sony se voice-packs/ è vuoto
bun run cli/extract.ts --all [input-dir] [output-dir]
# Estrai un singolo pacchetto vocale
bun run cli/extract.ts voice-packs/VP_english_UPG_03.bin extracted/
# Mostra informazioni sul pacchetto vocale
bun run cli/extract.ts --info voice-packs/VP_english_UPG_03.bin
# Solo download (nessuna estrazione)
bun run cli/extract.ts --download [output-dir]
uv run extract_all.py
Scarica dal CDN Sony + decripta + estrae — tutto in un unico comando. Le dipendenze sono dichiarate inline (PEP 723) — uv run gestisce tutto automaticamente.
| Lingua | File | Promemoria | CDN |
|---|---|---|---|
| 🇬🇧 Inglese | VP_english_UPG_03.bin | 54 | Scarica |
| 🇫🇷 Francese | VP_french_UPG_03.bin | 54 | Scarica |
| 🇩🇪 Tedesco | VP_german_UPG_03.bin | 54 | Scarica |
| 🇪🇸 Spagnolo | VP_spanish_UPG_03.bin | 54 | Scarica |
| 🇮🇹 Italiano | VP_italian_UPG_03.bin | 54 | Scarica |
| 🇵🇹 Portoghese | VP_portuguese_UPG_03.bin | 54 | Scarica |
| 🇳🇱 Olandese | VP_dutch_UPG_03.bin | 54 | Scarica |
| 🇸🇪 Svedese | VP_swedish_UPG_03.bin | 54 | Scarica |
| 🇫🇮 Finlandese | VP_finnish_UPG_03.bin | 54 | Scarica |
| 🇹🇷 Turco | VP_turkish_UPG_03.bin | 54 | Scarica |
┌───────────────────────────────────────┐
│ Header (4096 bytes) │
│ ├── 0x000 Random nonce (32 bytes) │
│ └── 0x100 TLV metadata │
│ ├── compression_type = 2 │
│ ├── body_size │
│ ├── decompressed_size (1 MB) │
│ └── SHA-256 of decompressed │
├───────────────────────────────────────┤
│ Body (offset 0x1000+) │
│ AES-128-CBC encrypted │
│ └── LZMA1 compressed │
│ └── Voice guidance image (1MB) │
│ ├── Header (version+count) │
│ ├── Entry table (54 × 8B) │
│ │ (size, abs_offset) │
│ └── MP3 files (48kHz mono) │
└───────────────────────────────────────┘
AES-128-CBC Key: eibohjeCh6uegahf
AES-128-CBC IV: miefeinuShu9eilo
Trovata codificata come stringhe ASCII nella sezione .rodata del firmware MT2811 CM4 all'offset flash 0xD53A (key) e 0xD529 (IV). La stessa chiave è utilizzata su tutte le unità WH-1000XM4 e in tutti i pacchetti linguistici.
RACE_STORAGE_PAGE_READ (comando 0x0403)0x81F40x04200000 dal pool letterale del vettore ARMDettagli tecnici completi: docs/WRITEUP.md
Se desideri verificare la chiave in modo indipendente, puoi scaricare il firmware dalle tue cuffie WH-1000XM4 abbinate ed estrarre la chiave:
# Scarica il firmware tramite BLE ed estrai la chiave
uv run cli/extract_key.py
# Oppure se hai già un dump del firmware:
uv run cli/extract_key.py --firmware your_dump.bin
# Alternativa Bun (richiede dump del firmware):
bun run cli/extract.ts --extract-key your_dump.bin
Lo strumento cerca nel binario del firmware l'AES S-box, trova le stringhe ASCII di 16 byte null-terminate adiacenti, poi valida ogni coppia candidata tentando di decriptare un pacchetto vocale e verificando la presenza di intestazioni LZMA valide.