
Décrypter et extraire les invites vocales MP3 des packs vocaux cryptés Sony WH-1000XM4. Clé AES extraite via un dump du firmware Bluetooth du SoC Airoha MT2811.
Déchiffrer et extraire les invites vocales MP3 des firmwares chiffrés des Sony WH-1000XM4.
La clé AES-128-CBC a été extraite en vidant le firmware Airoha MT2811 des écouteurs via Bluetooth Low Energy en utilisant le protocole RACE, puis en désassemblant la routine de déchiffrement FOTA du ARM Cortex-M4. Article technique complet : docs/WRITEUP.md
# Installer Bun (si pas déjà fait)
curl -fsSL https://bun.sh/install | bash
git clone https://github.com/HelgeSverre/sony-vp-extract.git
cd sony-vp-extract
bun install
# Télécharge automatiquement depuis le CDN Sony, puis extrait
bun run cli/extract.ts --all
# Tout extraire — téléchargement automatique depuis le CDN Sony si voice-packs/ est vide
bun run cli/extract.ts --all [dossier-entrée] [dossier-sortie]
# Extraire un seul pack vocal
bun run cli/extract.ts voice-packs/VP_english_UPG_03.bin extracted/
# Afficher les infos du pack vocal
bun run cli/extract.ts --info voice-packs/VP_english_UPG_03.bin
# Téléchargement uniquement (pas d'extraction)
bun run cli/extract.ts --download [dossier-sortie]
uv run extract_all.py
Télécharge depuis le CDN Sony + déchiffre + extrait — tout en une commande. Les dépendances sont déclarées en ligne (PEP 723) — uv run gère tout automatiquement.
| Langue | Fichier | Invites | CDN |
|---|---|---|---|
| 🇬🇧 Anglais | VP_english_UPG_03.bin | 54 | Télécharger |
| 🇫🇷 Français | VP_french_UPG_03.bin | 54 | Télécharger |
| 🇩🇪 Allemand | VP_german_UPG_03.bin | 54 | Télécharger |
| 🇪🇸 Espagnol | VP_spanish_UPG_03.bin | 54 | Télécharger |
| 🇮🇹 Italien | VP_italian_UPG_03.bin | 54 | Télécharger |
| 🇵🇹 Portugais | VP_portuguese_UPG_03.bin | 54 | Télécharger |
| 🇳🇱 Néerlandais | VP_dutch_UPG_03.bin | 54 | Télécharger |
| 🇸🇪 Suédois | VP_swedish_UPG_03.bin | 54 | Télécharger |
| 🇫🇮 Finnois | VP_finnish_UPG_03.bin | 54 | Télécharger |
| 🇹🇷 Turc | VP_turkish_UPG_03.bin | 54 | Télécharger |
┌───────────────────────────────────────┐
│ En-tête (4096 octets) │
│ ├── 0x000 nonce aléatoire (32 octets)│
│ └── 0x100 Métadonnées TLV │
│ ├── compression_type = 2 │
│ ├── body_size │
│ ├── decompressed_size (1 Mo) │
│ └── SHA-256 du décompressé │
├───────────────────────────────────────┤
│ Corps (offset 0x1000+) │
│ Chiffré AES-128-CBC │
│ └── Compressé LZMA1 │
│ └── Image des guides vocaux (1Mo)│
│ ├── En-tête (version+nombre)│
│ ├── Table des entrées (54 × 8o)│
│ │ (taille, abs_offset) │
│ └── Fichiers MP3 (48kHz mono)│
└───────────────────────────────────────┘
AES-128-CBC Key: eibohjeCh6uegahf
AES-128-CBC IV: miefeinuShu9eilo
Trouvée codée en dur sous forme de chaînes ASCII dans la section .rodata du firmware MT2811 CM4 à l'offset flash 0xD53A (clé) et 0xD529 (IV). La même clé est utilisée sur toutes les unités WH-1000XM4 et tous les packs de langues.
RACE_STORAGE_PAGE_READ (cmd 0x0403)0x81F40x04200000 à partir du pool littéral du tableau de vecteurs ARMDétails techniques complets : docs/WRITEUP.md
Si vous souhaitez vérifier la clé de manière indépendante, vous pouvez vider le firmware de vos propres écouteurs WH-1000XM4 appairés et en extraire la clé :
# Vider le firmware via BLE et extraire la clé
uv run cli/extract_key.py
# Ou si vous avez déjà un dump firmware :
uv run cli/extract_key.py --firmware your_dump.bin
# Alternative Bun (fichier firmware requis) :
bun run cli/extract.ts --extract-key your_dump.bin
L'outil recherche dans le binaire du firmware la S-box AES, trouve les chaînes ASCII adjacentes de 16 octets terminées par un null, puis valide chaque paire candidate en essayant de déchiffrer un pack vocal et en vérifiant la présence d'en-têtes LZMA valides.