
Sony WH-1000XM4 암호화 음성 팩에서 음성 안내 MP3 프롬프트를 복호화 및 추출합니다. AES 키는 Airoha MT2811 SoC의 블루투스 펌웨어 덤프를 통해 추출되었습니다.
Sony WH-1000XM4 암호화된 펌웨어 파일에서 음성 안내 MP3 프롬프트를 복호화하고 추출합니다.
AES-128-CBC 키는 RACE 프로토콜을 사용하여 Bluetooth Low Energy를 통해 헤드폰의 Airoha MT2811 펌웨어를 덤프한 후 ARM Cortex-M4 FOTA 복호화 루틴을 디스어셈블하여 추출되었습니다. 전체 기술 문서: 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
Sony CDN에서 다운로드 + 복호화 + 추출을 한 번에 수행합니다. 종속성은 인라인으로 선언되며 (PEP 723), uv run이 자동으로 처리합니다.
┌───────────────────────────────────────┐
│ 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
MT2811 CM4 펌웨어의 .rodata 섹션에서 플래시 오프셋 0xD53A(키)와 0xD529(IV)에 ASCII 문자열로 하드코딩되어 있습니다. 동일한 키가 모든 WH-1000XM4 기기와 모든 언어 팩에서 사용됩니다.
RACE_STORAGE_PAGE_READ (cmd 0x0403)를 사용하여 CM4 펌웨어 59KB를 플래시에서 덤프0x81F4에서 AES S-box 발견0x04200000 확인전체 기술 세부 정보: docs/WRITEUP.md
키를 직접 확인하려면 자신의 페어링된 WH-1000XM4 헤드폰에서 펌웨어를 덤프하고 그로부터 키를 추출할 수 있습니다.
# 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
이 도구는 펌웨어 바이너리에서 AES S-box를 검색하고, 인접한 널 종료 16바이트 ASCII 문자열을 찾은 다음, 각 후보 쌍에 대해 음성 팩 복호화를 시도하고 유효한 LZMA 헤더를 확인하여 검증합니다.
├── cli/
│ ├── extract.ts # Bun CLI tool (extract + key finder)
│ └── extract_key.py # Python BLE firmware dumper + key finder
├── docs/
│ └── WRITEUP.md # Full technical writeup
├── voice-packs/ # Downloaded .bin files (gitignored)
├── extracted/ # Extracted MP3 prompts (gitignored)
├── extract_all.py # Python alternative extractor
├── package.json
└── README.md
이 프로젝트는 개인 소유 하드웨어에 대해 교육 목적으로 수행된 보안 연구를 문서화합니다. 분석된 헤드폰은 정상적으로 페어링 및 연결되었으며 — 무단 액세스는 포함되지 않았습니다.
음성 팩 .bin 파일 및 추출된 MP3 프롬프트는 Sony Corporation의 저작권이 있으며 이 저장소에 포함되지 않습니다. CLI 도구는 런타임에 Sony의 공개 CDN에서 직접 다운로드합니다. 복호화된 음성 팩이나 추출된 MP3 파일을 재배포하지 마십시오. 이 도구는 연구 및 상호 운용성 목적으로만 제공됩니다.
MIT
| 언어 | 파일 | 프롬프트 수 | CDN |
|---|
| 🇬🇧 영어 | VP_english_UPG_03.bin | 54 | 다운로드 |
| 🇫🇷 프랑스어 | VP_french_UPG_03.bin | 54 | 다운로드 |
| 🇩🇪 독일어 | VP_german_UPG_03.bin | 54 | 다운로드 |
| 🇪🇸 스페인어 | VP_spanish_UPG_03.bin | 54 | 다운로드 |
| 🇮🇹 이탈리아어 | VP_italian_UPG_03.bin | 54 | 다운로드 |
| 🇵🇹 포르투갈어 | VP_portuguese_UPG_03.bin | 54 | 다운로드 |
| 🇳🇱 네덜란드어 | VP_dutch_UPG_03.bin | 54 | 다운로드 |
| 🇸🇪 스웨덴어 | VP_swedish_UPG_03.bin | 54 | 다운로드 |
| 🇫🇮 핀란드어 | VP_finnish_UPG_03.bin | 54 | 다운로드 |
| 🇹🇷 터키어 | VP_turkish_UPG_03.bin | 54 | 다운로드 |