andrewseago/d3200-ble-note-downloader

GitHub: andrewseago/d3200-ble-note-downloader

一个通过 BLE 直接下载并解密 Anker Soundcore D3200 录音笔本地加密录音的 Python 工具,让用户无需依赖云端即可获取自己的音频文件。

Stars: 0 | Forks: 0

# Soundcore D3200 BLE 笔记录音下载器 下载并解密存储在 **Anker Soundcore D3200**(“soundcore Work”)AI 录音笔上的语音录音——完全通过低功耗蓝牙(Bluetooth Low Energy)进行,**无需云账号,也无需互联网连接**。 D3200 将其录音以加密的 Opus 音频格式存储在设备上。本项目记录了 BLE 传输协议和加密方案,并提供了一个可用的参考客户端,该客户端可以将录音从设备中导出,并写入普通且可播放的 `.ogg` 文件。 ## 为什么开发此项目 D3200 是一款出色的录音笔,但通常从中提取音频意味着要通过 Soundcore 应用程序和 Anker 的云端。这个项目的存在是为了让设备所有者能够在本地从他们**自己**的硬件中获取他们**自己**的录音,并将其输入到他们喜欢的任何 pipeline 中(例如本地转录),而无需经过云端往返。 ## 快速开始 ### 前置条件 - **Python 3.12+** 以及一个正常工作的 Bluetooth 适配器。 - **D3200 已开机且未连接到 Soundcore 应用程序。** 该录音笔一次只接受一个 BLE 连接——如果手机应用程序已连接(或者应用程序在后台打开并自动重新连接),扫描或连接将会失败。请先强制退出该应用程序,或关闭手机的 Bluetooth。 - **macOS:** 运行 Python 的程序(您的终端或 IDE)需要在*系统设置 → 隐私与安全性 → Bluetooth* 下拥有 Bluetooth 权限。如果没有此权限,扫描将静默地返回空结果。首次运行时 macOS 应该会提示授予权限;如果没有,请手动添加该应用程序。 - **Linux:** 需要 BlueZ(由 `bleak` 的后端提供支持)。运行扫描可能需要为您的用户授予适当的 Bluetooth 权限。 ``` git clone https://github.com/andrewseago/d3200-ble-note-downloader.git cd d3200-ble-note-downloader python3 -m venv .venv && source .venv/bin/activate pip install -e . # installs bleak + cryptography # 1. 确认设备是可发现的 python3 soundcore_d3200_downloader.py --scan-only # 2. 下载 + 解密最新的录像到 ./downloads python3 soundcore_d3200_downloader.py --output downloads # 或者通过 file id (hex) 下载特定的录像,如在扫描期间列出的: python3 soundcore_d3200_downloader.py --file-id --output downloads ``` 输出结果将保存在 `downloads/` 中: - `decrypted_.ogg` — 可播放的 Ogg/Opus(可在任何音频播放器中打开) - `decrypted_.raw_opus` — 串联的原始 Opus 数据包 - `raw_.bin`, `detail_.bin` — 原始 BLE 捕获文件,用于分析 ### 解密之前保存的捕获文件(离线) 如果您已经拥有 `raw_*.bin` + `detail_*.bin` 文件对以及 session,则可以在没有设备的情况下进行解密: ``` python3 tools/d3200_decrypt_ble.py \ --detail downloads/detail_.bin \ --raw downloads/raw_.bin \ --session-json downloads/session_.json \ --ogg-out downloads/decrypted_.ogg ``` ## 故障排除 - **扫描不到任何内容。** 设备可能仍连接到 Soundcore 应用程序——断开连接/强制退出该应用程序(或关闭手机 Bluetooth)。在 macOS 上,还需确认您的终端是否具有 Bluetooth 权限(请参阅前置条件)。该设备使用轮换的 BLE 地址,因此扫描程序是通过 RCSP service UUID 而不是固定的 MAC 进行匹配的——请给它充足的扫描时间。 - **已连接,但未列出任何文件。** 确保录音笔上确实有录音文件,并且在运行期间保持开机状态且在通信范围内。 - **`file-key unwrap failed`。** 这几乎总是意味着 ECDH 握手未能顺利完成。断开连接,稍等片刻,然后重试;生成的 `downloads/qc_keypair.json` 会跨运行重复使用,保留它即可。 - **`.ogg` 文件无法播放。** 任何支持 Opus 的播放器都可以正常播放(如 VLC、`ffplay`)。`ffprobe decrypted_.ogg` 应该会报告一个 Opus 立体声流。 ## 工作原理 完整的协议和加密机制记录在 **[docs/BLE_DECRYPTION_GUIDE.md](docs/BLE_DECRYPTION_GUIDE.md)** 中。简而言之: 1. **传输层 (Transport)** — 基于 BLE GATT 的 JieLi RCSP 帧(service `020cf5da-…`,写入 char `00007777-…`,通知 char `00008888-…`)。 2. **握手 (Handshake)** — 在 NIST P-256 上进行 ECDH。共享密钥提供给 HKDF-SHA256(salt/info = `0x010203`)以派生出 32 字节的 **session key**。 3. **单文件密钥 (Per-file key)** — 包含文件详情的响应带有一个 46 字节的包装密钥(wrapped key)。使用 session key 对其进行 AES-256-CTR 解密后会得到 `b"soundcored3200" || <32-byte fileKey>`。 4. **音频 (Audio)** — 每个 160 字节的 Opus 数据包都使用 `fileKey` 和按数据包计算的计数器 `audio_nonce[0:12] || BE32(sequence * 10)` 进行 AES-256-CTR 解密。 5. **容器 (Container)** — 解密后的数据包被封装为标准的 Ogg/Opus 文件。 所有原语都是标准的(ECDH P-256、HKDF-SHA256、AES-256-CTR)。此过程不涉及任何特定于设备的秘密、PIN 码或云账号。 ## 目录结构 ``` soundcore_d3200_downloader.py Reference BLE client (scan → handshake → download → decrypt) tools/d3200_sdk_crypto.py Key derivation, file-key unwrap, packet decryption tools/known_plaintext.py Ogg/Opus parsing and D3200-compatible container writer tools/d3200_decrypt_ble.py Offline decrypt CLI for saved captures docs/BLE_DECRYPTION_GUIDE.md Full protocol + crypto reference tests/ Crypto known-vector and Ogg/Opus container tests ``` ## 范围与法律声明 这是一项**个人互操作性和数据可移植性研究**,旨在供拥有 D3200 的用户提取自己的录音。 - 它仅作用于您拥有的硬件和您制作的录音。 - 它使用标准、公开记录的加密原语。它不分发任何 Anker 固件、应用程序二进制文件或专有密钥,也不包含任何规避 DRM 的工具。 - 扫描并连接到他人的 Bluetooth 设备,或访问不属于您的录音,是本项目不支持也不允许的用途。 您有责任遵守您当地的法律以及 Anker 的服务条款。本项目按“原样”提供,不提供任何担保。本项目与 Anker 或 Soundcore 没有关联,也未获得其认可。 ## 许可证 [GPL-3.0-or-later](LICENSE)。
标签:Python, 云资产清单, 无后门, 物联网, 硬件互联, 蓝牙低功耗, 逆向工具, 逆向工程, 音频解密