虽然蓝牙耳机伪装还未想到什么实战价值,但本文阐述的通用伪装技术,在实战中经常应用。
本文将介绍如何把 PC 伪装成一个蓝牙耳机。
背景知识
蓝牙为音频应用提供的 Profile 有如下几种:
-
HSP, HeadSet Profile
HSP 是一个功能非常基本音频 profile。它定义了两个角色 AG (Audio Gateway) 和 HS (HeadSet)。比如在手机与耳机相连场景中,手机就是 AG,而耳机则为 HS。
HSP 仅支持单声道音频的传输,且一个 AG 同时只能连接一个 HS。另外 HSP 还定义了一个按钮功能,用于开始或结束通话。
-
HFP, Hands-Free Profile
HFP 在 HSP 的基础上添加了更多的功能。它定义了两个角色 Handsfree 与 HandsfreeAudioGateway。比如在车机与手机相连场景中,车机就是 Handsfree,而手机则为 HandsfreeAudioGateway。
HFP 传输的音频仍是单声道的。但相对 HSP,HFP 提供了更多让耳机、车机控制手机的功能。比如通话等待,通话切换等等。
-
A2DP, Advanced Audio Distribution Profile
A2DP 是当今常用的蓝牙音频 Profile。它定义了两个角色 AudioSource 与 AudioSink。同 HSP 类似,在手机与音箱相连的场景中,手机就是 AudioSource,而音箱则为 AudioSink。
与 HSP 不同的是,A2DP 支持立体声的传输,且提供更好的音频传输质量。该 Profile 使用的音频传输协议称为 AVDTP (Audio/Video Distribution Transport Protocol)。
-
AVRCP, Audio/Video Remote Control Profile
AVRCP 定义了多媒体遥控器的功能。它定义了两个角色 A/V_RemoteControlController 与 A/V_RemoteControlTarget。比如耳机连接手机后,耳机就是 A/V_RemoteControlController,而手机则是 A/V_RemoteControlTarget。
AVRCP 以一条条命令的形式实现各种控制功能。比如快进,下一首等等。该 Profile 使用的传输协议是 AVCTP (Audio/Video Control Transport Protocol)。
Linux 中的蓝牙耳机伪装
在 Linux 中执行 sudo sdptool records local
可以查看本地启用的所有 Profile。可以发现 A2DP 定义的 AudioSink 默认被启用:
这意味着 Linux 默认就提供蓝牙耳机、音箱的功能。当手机通过蓝牙连接上 Linux 后,可以直接通过 Linux 播放声音。
关于 sdptool
这里有一个坑,当使用较新的 BlueZ 时,比如 BlueZ 5.50,执行上面的命令可能失败:
此时只要修改 bluetooth.service,为 bluetoothd 添加 --compat
启动参数即可:
伪装蓝牙设备名和设备类型
仅仅实现蓝牙耳机的接收音频并播放音频的功能对于伪装来说还不够,需要进一步伪装蓝牙设备的名称与类型。使用 spooftooph 即可完成这些伪装:
其中 -n
指定期望伪装的名字,-c
指定期望伪装的设备类型。蓝牙设备类型 (CoD, Class of Device) 可使用在线工具生成:
使用 hciconfig 可以验证这些名称是否修改成功:
关于蓝牙设备名和设备类型的伪装也有一些坑:
-
本地伪装成功在远端未必生效
有些手机会缓存蓝牙设备名称或类型。这些手机在一个蓝牙上电周期或更长的时间内,对同一个 BD_ADDR 不会更新其名称或类型。此时我们即时修改的设备名称和类型便不会生效。
解决该问题的办法是,在修改设备名称与类型的同时,修改设备的 BD_ADDR:
-
执行一些本地命令将导致设备名重置
使用 spooftooph 修改设备名称后,执行如下操作将导致设备名称重置:
sudo hciconfig <hcix> reset
sudo systemctl restart bluetooth.service
reboot
- 插拔蓝牙适配器
被重置的名称存储在与蓝牙适配器相关的配置文件中,比如:
名称被重置的根本原因是 spooftooph 在修改设备名称时并未修改该相应的配置文件。使用
bluetoothctl
的system-alias
可以解决该问题: