多系统下的蓝牙设备共用配对问题之LTK、EDIV、ERAND.以 Manjaro、Debian、Windows10 为例

最新版参加博客

多系统下的蓝牙设备共用配对问题之 LTK、EDIV、ERAND.以 Manjaro、Debian、Windows10 为例

  • date: 2020-09-6
  • lastmod: 2022-10-05

简介

多系统下的蓝牙设备配对问题的解决办法,以 Windows 10 + Manjaro + Debian 为例。尤其适合双(多)系统下的蓝牙设备不支持多配对的时候(有的蓝牙设备是可以进行多主机配对的),同理适合 win + linux 双系统的用户,mac 同理(本人暂无法验证,见参考中大佬的解决办法)。

本文不涉及 Mac 以及需要 CSRK 的设备(原因是我没有这样的设备,有需要的可以去参考中看相关资料)。

大纲

  1. linux 下进行蓝牙配对
  2. windwnows 下进行蓝牙配对
  3. 用 PStool/chntpw 导出 windows 的蓝牙配置信息
  4. 用 sudo 修改 linux 的蓝牙配置信息

实操

linux 下进行蓝牙配对

我这里使用的是 Manjaro,配对了两个蓝牙设备,鼠标(MiMouse)和键盘(KB),并且使用上是正常的。在系统托盘中的蓝牙管理可点击对应的设备展开更多信息可以看到设备对于的物理地址分别是 EB、D1 打头(方便起见,这个需要记一下,太长且不可复制,记一下开头就行,后面介绍咋复制)。

暂时我们记录的信息如下所示:

设备名称:鼠标 MiMouse
Linux 蓝牙 ID:EB

设备名称:键盘 KB
Linux 蓝牙 ID:D1

蓝牙设备的地址信息

windows 下进行蓝牙配对

配对蓝牙设备这个没啥好说的哈,配对完之后我们需要记录一下配对蓝牙设备的设备 ID。方法是在蓝牙设置界面中的 “相关设置” 选择 “更多蓝牙选项”;在弹出的 “蓝牙设置“ 窗口中的菜单栏选择 “硬件” ,在设备中选中刚才配对的某个设备,如键盘 KB;然后点击 “属性“;咋对应的 “属性窗口的菜单栏“ 选择 “事件“,在底部的 “信息” 展示中先是着 “已配置设备 BTHLE\DEV_id\“,这个 DEV_id 中的 id 就是该蓝牙设备的设备 ID。记录下来,之后对另一个蓝牙设备也这样操作获取其 ID.

蓝牙配置-等多蓝牙选项

蓝牙属性获取-硬件-属性-事件-信息

这里需要记住哪一个地址对应哪一个设备,因为在提取信息的时候没法从信息里知道其对应设备的名称(这一点 Linux 做的比较好,配置信息里有设备名称)。暂时我们记录的信息如下所示:

设备名称:鼠标 MiMouse
Linux 蓝牙 ID:EB
win 设备 ID:e35d79da5272

设备名称:键盘 KB
Linux 蓝牙 ID:D1
win 设备 ID:d118ff200048

方法一:用 PStool 导出 windows 的蓝牙配置信息

PsExec 官网下载其压缩包,提取其中的 PsExec64.exec://windows/system32,然后鼠标右键菜单标志(默认菜单栏最左边),选择以管理员身份打开 powershell,输入psexec64.exe -si regedit 后回车会打开注册表编辑器。(32位PC就提取PsExec.exe,powershell的命令改为psexec.exe -si regedit)。

在注册表上方的地址栏粘贴下面一行后回车转到蓝牙配置: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\

可以在左侧看到 Keys 下面有一个文件夹,这个文件夹代表你的电脑,点击展开它,里面的文件夹的名称刚好对应我们在上一步获取到的蓝牙设备的设备 ID。

d11的全部参数

e35的全部参数

复制 ERand 的十进制数据示意图,右键选中修改

复制 ERand 的十进制数据示意图,勾选十进制基数后复制

选中一个蓝牙设备的文件夹,右键导出,保存为 txt 文件,名称为这个设备的 ID,我们需要复制并记录其中的 LTK。之后获取 EDIV 和 ERAND 的十进制数值,数值在右侧可以看到,但不可以复制。复制的解决办法是右键这个参数的名称,点击修改,然后在弹出的窗口显示的是十六进制,在其右侧勾选十进制就会自动转换为十进制,复制保存下来。

复制 LTK 的时候需要注意两侧的不需要复制,只需要复制中间的就行,复制得到的结果和注册表中右侧显示的应该是一样的。

导出示意图,注意保存类型为 txt

LIK 复制例子

暂时我们记录的信息如下所示:

设备名称:鼠标 MiMouse
Linux 蓝牙 ID:EB
win 设备 ID:e35d79da5272
LTK:04 29 6f 8e 03 bb 5c 13 - f1 4c 6d ba fe 45 d8 a4
EDIV:33544
ERAND:8341617009900789008

设备名称:键盘 KB
Linux 蓝牙 ID:D1
win 设备 ID:d118ff200048
LTK:0f d1 d2 cf 06 33 24 d1 - 47 4e a5 71 e3 3a 09 2d
EDIV:12016
ERAND:12806037061999603757

格式转换

Linux 下的配置格式和刚才获取的有一丢丢差距,大小写和空格等,对 RK、LTK 需要转大写并且去掉其中的空格和短线;对设备 ID 则需要转大写并手动插入英文冒号。

这是两个简单在线工具网站,字母大写去空格,去短线和加入冒号需要自己操作,还没发现好工具。

暂时我们记录的信息如下所示:

设备名称:鼠标 MiMouse
Linux 蓝牙 ID:EB
win 设备 ID:EB:FE:DC:C0:E6:CE
LTK:04296F8E03BB5C13F14C6DBAFE45D8A4
EDIV:33544
ERAND:8341617009900789008

设备名称:键盘 KB
Linux 蓝牙 ID:D1
win 设备 ID:D1:18:FF:20:00:48
LTK:0FD1D2CF063324D1474EA571E33A092D
EDIV:12016
ERAND:12806037061999603757

方法二:在 linux 上用 chntpw 导出 windows 的蓝牙配置信息

如果已使用方法一,可以跳过本小节。首先挂载 C 盘,找到 C 盘下的路径 Windows/System32/config/。需要安装软件包 chntpw。此次无法通过 mac 查看设备名称,因此前面在 win 配对的时候就需要记录下设备对应的大概 mac 地址了。

只需要使用 hex 读取 LTK、ERand,EDIV 在 ls 的时候就可以读取到十进制数据,用 hex 读 EDIV 的话,还得先反转再转换成十进制(不反转直接进制转换出来是不对的,尝试了疯狂断连)

# 切换路径,此步骤每个人路径大多不同
$ cd /run/media/kearney/C/Windows/System32/config/
# 使用 chntpyw 读取注册表
$ chntpw -e SYSTEM
> ls
  <ControlSet001>
> cd ControlSet001\Services\BTHPORT\Parameters\Keys
> ls
  <28cdc4babb2c>

> cd 28cdc4babb2c
> ls
  <d132ff200048>
  <fae0e5592901>
> cd d132ff200048
> ls
    16  3 REG_BINARY         <LTK>
     8  b REG_QWORD          <ERand>
     4  4 REG_DWORD          <EDIV>                 55245 [0xd7cd]
     
> hex LTK
:00000  32 28 41 A7 3C D9 66 06 20 E2 50 D5 AE 6B 3E FF 2(A.<.f. .P..k>.
> hex IRK
:00000  A4 D4 B0 77 37 46 A7 DF 0C CF C0 91 67 51 36 85 ...w7F......gQ6.
> hex ERand
:00000  BE 58 C3 26 99 F9 DF 1D                         .X.&....

> cd ..
> cd fae0e5592901
  size     type              value name             [value if type DWORD]
    16  3 REG_BINARY         <LTK>
     8  b REG_QWORD          <ERand>
     4  4 REG_DWORD          <EDIV>                 41045 [0xa055]
> hex LTK
:00000  77 F7 F7 D1 38 6E 07 17 95 89 A2 00 2D D8 44 97 w...8n......-.D.
> hex ERand
:00000  86 C2 7B D2 B7 F7 AE 7B                         ..{....{

LTK、ERand 转换的 py3 代码,发现 wiki 上显示的代码有点问题,再深入发现是文档渲染的问题,然而找了下格式帮助文档也没有找到正确的格式,就先在 discussion 里提出了。

# LTK 去除空格
>>> '77 F7 F7 D1 38 6E 07 17 95 89 A2 00 2D D8 44 97'.replace(' ', '')
# ERand 反转 去空格 换进制
>>> ERand='86 C2 7B D2 B7 F7 AE 7B'
>>> ERand=list(reversed(ERand.strip().split()))
>>> int("".join(ERand), 16)

后面的步骤一致,改 LongTermKey 下的 LTK ERand Eiv,然后修改路径为新 mac 地址即可。键盘、鼠标测试通过。

用 root 权限修改 linux 的蓝牙配置信息

重新进入到 Manjaro。到这里我们还需要本机的蓝牙 ID 和 Linux 系统下对应的蓝牙设备 ID,分别在下面第 1、2 条命令获取。

# 获取本机的蓝牙 ID
$ sudo ls /var/lib/bluetooth
28:CD:C4:BA:BB:2C

# 获取已经配对的蓝牙设备 ID,后面那串 28:...:2C 是上面获取到的“本机的蓝牙 ID” 
$ sudo ls /var/lib/bluetooth/28:CD:C4:BA:BB:2C
cache  D1:17:FF:20:00:48  EB:FE:DC:C0:E6:CE  settings
# 从上面的输出就知道鼠标和键盘的具体ID,而且可以复制

到这里我们可以更新小本本中 Linux 蓝牙 ID 并增加本机 ID了。现在我们记录的信息如下所示:

本机的蓝牙 ID: 28:CD:C4:BA:BB:2C
设备名称:鼠标 MiMouse
Linux 蓝牙 ID:EB:FE:DC:C0:E6:CE
win 设备 ID:E3:5D:79:DA:52:72
LTK:04296F8E03BB5C13F14C6DBAFE45D8A4
EDIV:33544
ERAND:8341617009900789008

设备名称:键盘 KB
Linux 蓝牙 ID:D1:17:FF:20:00:48
win 设备 ID:D1:18:FF:20:00:48
LTK:0FD1D2CF063324D1474EA571E33A092D
EDIV:12016
ERAND:12806037061999603757

现在我们该更改 Linux 的蓝牙配置信息了。其中要修改的配置有

winlinux备注
LTKLongTermKey转大写,去掉空格、短线
EDIVLTK.EDiv十进制
ERandLTK.Rand十进制

有的设备配置文件有 [SlaveLongTermKey],其也有 Ediv、Rand 的属性,不要动它,只需要改 [LongTermKey] 下的 Ediv、Rand。不然结果就是疯狂的连接与掉线。。。

# 以下指令需要修改对应的路径才能使用

# 修改鼠标的配置信息
$ sudo nano /var/lib/bluetooth/28:CD:C4:BA:BB:2C/EB:FE:DC:C0:E6:CE/info
# 更新配置的蓝牙 ID,这一步很重要。相当于重命名
# 将旧的 “Linux 蓝牙 ID“ 修改为 “win 设备 ID”
$ sudo mv /var/lib/bluetooth/28:CD:C4:BA:BB:2C/EB:FE:DC:C0:E6:CE/ /var/lib/bluetooth/28:CD:C4:BA:BB:2C/E3:5D:79:DA:52:72

# 修改键盘的配置信息
$ sudo nano /var/lib/bluetooth/28:CD:C4:BA:BB:2C/D1:17:FF:20:00:48/info
$ sudo mv /var/lib/bluetooth/28:CD:C4:BA:BB:2C/D1:17:FF:20:00:48/ /var/lib/bluetooth/28:CD:C4:BA:BB:2C/D1:18:FF:20:00:48

# 重启蓝牙服务,使设置生效
$ sudo systemctl restart bluetooth 

# 将 Manjaro 的蓝牙配置复制到 Debian 中,多 Linux 系统下可以这样操作,亲测有效。(双系统可以跳过)
# Debian 的路径与你挂载的路径和名称有关 - /run/media/kearney/Debian/
$ sudo cp -r /var/lib/bluetooth/28:CD:C4:BA:BB:2C/ /run/media/kearney/Debian/var/lib/bluetooth/

键盘原配置

键盘更新之后的配置

鼠标原配置

鼠标更新之后的配置

开机自启

linux 的蓝牙默认是登陆后在启动服务的,也就是在输入密码的时候你还是得用电脑的键盘(如笔记本键盘),蓝牙键盘是暂时不能使用的,为了让在登陆的时候也能使用蓝牙键盘,如 Bluetooth - ArchWiKi 中 Auto power-on after boot 小节说的一样

sudo nano /etc/bluetooth/main.conf
# ctrl + w 启动搜索 AutoEnable
# 去掉 AutoEnable 前面的井号,把它的值改为 true

总结

在最后的步骤 “用 root 权限修改 linux 的蓝牙配置信息” 中,其实可以用 root 账户登陆桌面,操作就会是图形化操作,当然也可以在管理员用户下用 su root 切换到 root 账户,这样不需要记录本机 ID 和 Linux 蓝牙 ID,因为可以用 tab 自动补全,但想了一下能用 sudo 解决的话,就先用着吧见仁见智。

平实主要是用 Manjaro, Debian 没法用 AUR,下载了也涉及依赖问题,社区推的 DUR 还不成熟,先留着,之后估计会砍掉 Debian 装 BSD 玩一下。

上面用 pstool 的办法看起来似乎没有 chntpw 那么方便,有空再翻译一下 Arch wiki。

参考

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值