
Descifrar y extraer indicaciones de voz en MP3 de paquetes de voz cifrados de los Sony WH-1000XM4. Clave AES extraída mediante volcado de firmware Bluetooth del SoC Airoha MT2811.
Descifra y extrae las indicaciones MP3 de guía de voz de los archivos de firmware cifrados de los Sony WH-1000XM4.
La clave AES-128-CBC se obtuvo volcando el firmware Airoha MT2811 de los auriculares a través de Bluetooth Low Energy usando el protocolo RACE, luego desensamblando la rutina de descifrado FOTA del ARM Cortex-M4. Documentación técnica completa: docs/WRITEUP.md
# Install Bun (if not already installed)
curl -fsSL https://bun.sh/install | bash
git clone https://github.com/HelgeSverre/sony-vp-extract.git
cd sony-vp-extract
bun install
# Downloads from Sony CDN automatically, then extracts
bun run cli/extract.ts --all
# Extract all — auto-downloads from Sony CDN if voice-packs/ is empty
bun run cli/extract.ts --all [input-dir] [output-dir]
# Extract a single voice pack
bun run cli/extract.ts voice-packs/VP_english_UPG_03.bin extracted/
# Show voice pack info
bun run cli/extract.ts --info voice-packs/VP_english_UPG_03.bin
# Download only (no extraction)
bun run cli/extract.ts --download [output-dir]
uv run extract_all.py
Downloads from Sony CDN + decrypts + extracts — all in one command. Dependencies are declared inline (PEP 723) — uv run handles everything automatically.
| Idioma | Archivo | Indicaciones | CDN |
|---|---|---|---|
| 🇬🇧 Inglés | VP_english_UPG_03.bin | 54 | Download |
| 🇫🇷 Francés | VP_french_UPG_03.bin | 54 | Download |
| 🇩🇪 Alemán | VP_german_UPG_03.bin | 54 | Download |
| 🇪🇸 Español | VP_spanish_UPG_03.bin | 54 | Download |
| 🇮🇹 Italiano | VP_italian_UPG_03.bin | 54 | Download |
| 🇵🇹 Portugués | VP_portuguese_UPG_03.bin | 54 | Download |
| 🇳🇱 Neerlandés | VP_dutch_UPG_03.bin | 54 | Download |
| 🇸🇪 Sueco | VP_swedish_UPG_03.bin | 54 | Download |
| 🇫🇮 Finlandés | VP_finnish_UPG_03.bin | 54 | Download |
| 🇹🇷 Turco | VP_turkish_UPG_03.bin | 54 | Download |
┌───────────────────────────────────────┐
│ 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
Encontrados hardcodeados como cadenas ASCII en la sección .rodata del firmware MT2811 CM4 en el offset de flash 0xD53A (clave) y 0xD529 (IV). La misma clave se usa en todas las unidades WH-1000XM4 y todos los paquetes de idioma.
RACE_STORAGE_PAGE_READ (cmd 0x0403)0x81F40x04200000 a partir del literal pool de la tabla de vectores ARMDetalles técnicos completos: docs/WRITEUP.md
Si quieres verificar la clave de forma independiente, puedes volcar el firmware de tus propios auriculares WH-1000XM4 emparejados y extraer la clave de él:
# Dump firmware over BLE and extract key
uv run cli/extract_key.py
# Or if you already have a firmware dump:
uv run cli/extract_key.py --firmware your_dump.bin
# Bun alternative (firmware dump required):
bun run cli/extract.ts --extract-key your_dump.bin
La herramienta busca en el binario del firmware la S-box de AES, encuentra cadenas ASCII adyacentes de 16 bytes terminadas en nulo, luego valida cada par candidato intentando descifrar un paquete de voz y verificando si hay cabeceras LZMA válidas.