
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.
┌───────────────────────────────────────┐
│ 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.
├── cli/
│ ├── extract.ts # Herramienta CLI de Bun (extractor + buscador de clave)
│ └── extract_key.py # Volcador de firmware BLE y buscador de clave en Python
├── docs/
│ └── WRITEUP.md # Documentación técnica completa
├── voice-packs/ # Archivos .bin descargados (gitignorados)
├── extracted/ # Indicaciones MP3 extraídas (gitignoradas)
├── extract_all.py # Extractor alternativo en Python
├── package.json
└── README.md
Este proyecto documenta una investigación de seguridad realizada con fines educativos en hardware de propiedad personal. Los auriculares analizados se emparejaron y conectaron normalmente — no hubo acceso no autorizado.
Los archivos .bin de paquetes de voz y las indicaciones MP3 extraídas tienen derechos de autor de Sony Corporation y no están incluidos en este repositorio. La herramienta CLI los descarga directamente de la CDN pública de Sony en tiempo de ejecución. No redistribuyas paquetes de voz descifrados ni archivos MP3 extraídos. Esta herramienta se proporciona únicamente con fines de investigación e interoperabilidad.
MIT
| 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 |