windows/linux双系统共享蓝牙设备

windows/linux双系统共享蓝牙设备

linux下操作

首先启动linux系统,按正常方式连接蓝牙设备,并确认蓝牙设备可以正常使用。

通过蓝牙管理界面记录蓝牙设备的MAC地址,记为$device_addr

查看蓝牙设备配置信息

打开终端,使用sudo su作为root用户,然后cd到/var/lib/bluetooth

此时目录下应有一个以设备蓝牙适配器的MAC地址命名的目录,记为$adapter_addr

cd进入/var/lib/bluetooth/$adapter_addr/$device_addr,目录下应有一个info文件,使用vim或cat查看文件内容。

通过general部分的name可以确认是否是需要共享的蓝牙设备。

1
2
3
4
5
6
7
[General]
Name=Bluetooth Mouse M336/M337/M535
Class=0x000580
SupportedTechnologies=BR/EDR;
Trusted=true
Blocked=false
Services=00001000-0000-1000-8000-00805f9b44fb;00001124-0000-1000-8000-00805f9b44fb;00001200-0000-1000-8000-00805f9b34fb;

按照文件后面的内容Key类型不同,需要区分不同的设备类型。

情况一、后面只有[LinkKey]

1
2
3
4
[LinkKey]
Key=9B7896D8202DDAA80D1DBD75AB8E0440
Type=4
PINLength=0

情况二、后面有[IdentityResolvingKey]、[LongTermKey]等多项

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
[IdentityResolvingKey]
Key=AAFD936F05C3E708477043F30A06DF1A
[RemoteSignatureKey]
Key=9437CEEC9FD5FEAA30410C1713C6D6CF
Counter=0
Authenticated=false
[LocalSignatureKey]
Key=A2B3DF00255CFF4D9C4C7406E2CB07B7
Counter=0
Authenticated=false
[LongTermKey]
Key=5730627C8DE83BA55CD182FABBA0E571
Authenticated=0
EncSize=16
EDiv=62792
Rand=3160829177541363584
[SlaveLongTermKey]
Key=DA36C669AB37846E1CA15C8A6055912D
Authenticated=0
EncSize=16
EDiv=22299
Rand=4757000163648466617

这种情况说明你的蓝牙设备属于低功耗蓝牙设备(BLE)


按照上述情况不同,后续需要进行不同的操作。

windows下操作

重启到windows,在windows下重新配对蓝牙设备,并确认蓝牙设备可以正常使用。

查看注册表蓝牙信息

直接运行注册表编辑器权限不够,需要通过PSExec来运行。

先下载PSTools并解压,使用管理员权限打开Powershell并cd到解压后的PSTools文件夹。

使用下述指令打开注册表编辑器(如果杀毒软件有拦截选择放行):

1
.\psexec.exe -s -i regedit

定位到[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\$adapter_attr],其中$adapter_attr是之前得到的蓝牙适配器MAC地址。

如果没有CurrentControlSet,可以找ControlSet001。

提取Key

情况一、需要[LinkKey]

查看$adapter_attr注册表项本身存储的数据,应该如下所示:

1
2
3
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\$adapter_attr]
"MasterIRK"=hex:48,5d,82,ad,55,13,23,ed,08,af,46,c7,5e,d0,c7,bf
"$device_attr"=hex:9b,78,96,d8,20,2d,da,a8,0d,1d,bd,75,ab,8e,04,40

MasterIRK应当是都存在的键,而在其他键中需要寻找一个以之前获取的蓝牙设备的MAC地址命名的键,并通过注册表的导出功能导出为文件以备后续使用。

情况二、需要[IdentityResolvingKey]、[LongTermKey]等多项

对于BLE设备,其Key信息以子项形式存储。在$adapter_attr的子项中寻找与之前获取的$device_attr,并通过注册表导出功能导出为文件以备后续使用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys\001bdc0e3454\c4be84437bd0]
"LTK"=hex:57,30,62,7c,8d,e8,3b,a5,5c,d1,82,fa,bb,a0,e5,71
"KeyLength"=dword:00000000
"ERand"=hex(b):80,07,0b,e3,63,85,dd,2b
"EDIV"=dword:0000f548
"IRK"=hex:aa,fd,93,6f,05,c3,e7,08,47,70,43,f3,0a,06,df,1a
"Address"=hex(b):d0,6a,43,84,be,c4,00,00
"AddressType"=dword:00000000
"CSRK"=hex:a2,b3,df,00,25,5c,ff,4d,9c,4c,74,06,e2,cb,07,b7
"OutboundSignCounter"=dword:00000000
"AuthReq"=dword:00000001

MAC地址变化问题

部分蓝牙设备在windows下重新配对之后MAC地址会发生变化,例如+1.此时需要以新的MAC地址为准。

应用Key到linux

接下来我们要做的就是将提取的Key信息写入到linux下的配置文件中,使得linux无需再次配对能够重新直接连接蓝牙设备。

更新MAC地址

重启到linux,同样以root用户cd /var/lib/bluetooth/$adapter_addr/

如果在windows下重新连接后设备的MAC地址发生了变化,此时需要更改linux原先存储的MAC地址。

1
mv $device_attr $new_device_attr

如果之前MAC地址没变,则不需要这一步。

更新Key

用编辑器打开配置文件:

1
vim /var/lib/bluetooth/$adapter_addr/$device_addr/info

然后根据下述情况修改Key。

情况一、[LinkKey]

注册表中$adapter_attr注册表项中存储的以$device_attr为键的数据的值就对应info文件中[LinkKey]项下的Key字段。

从注册表导出文件中获取的信息格式如下所示:

1
"$device_attr"=hex:9b,78,96,d8,20,2d,da,a8,0d,1d,bd,75,ab,8e,04,40

可以通过如下bash命令转换为大写并去除逗号,输出为需要的格式(其他的shell可能不兼容):

1
2
3
$ key="9b,78,96,d8,20,2d,da,a8,0d,1d,bd,75,ab,8e,04,40"
$ echo ${key^^} | sed 's/,//g'
9B7896D8202DDAA80D1DBD75AB8E0440

将得到的结果替换info文件中的[LinkKey]项下的Key字段即可。

情况二、[IdentityResolvingKey]、[LongTermKey]等多项

下表展示了注册表键对应info中数据的关系:

注册表键info中项如何转换
LTK[LongTermKey]-> Key去掉逗号,全大写
ERand[LongTermKey]-> Rand去掉逗号,转为十进制
EDIV[LongTermKey]-> EDiv转为十进制
IRK[IdentifyResolvingKey]->Key去掉逗号,全大写
CSRK[LocalSignatureKey]->Key去掉逗号,全大写

在少部分情况下ERand需要进行字节逆序后再转为十进制。通常不必要。

重启蓝牙服务

在root下systemctl restart bluetooth

如果系统托盘图标有蓝牙开关,将蓝牙开关关闭之后再重新打开。

检查设备连接

开启蓝牙设备,此时应当无需配对也能直接连接到linux。

参考

0%