- 需要在两个系统各连接一次
我是先在Linux下连接后去Windows下连接的, 我以我的视角进行参数的, 逆序视角只需要后续操作反一下就行. - 导出注册表项
目标注册表项为HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys\
但因为这个注册表项是受保护的项, 所以得使用微软官方发布的PsExec来提权.
使用方式其实挺简单的, 使用管理员权限打开cmd/powershell, cd到对应的目录中去, 执行一下psexec64.exe -si regedit
就行, 如果是powershell, 前面还要加个./
让命令变为./psexec64.exe -si regedit
. 当然, 你的系统不支持64位程序就别用后面带64的程序, 灵活使用.- 打开目标注册表项, 找到蓝牙设备物理地址对应的注册表项导出
这里可能比较麻烦一点的就是如何找到蓝牙设备的物理地址了, 其实很简单, 就在控制面板
->硬件和声音
->设备与打印机
里面你就能找到连接的蓝牙设备, 选中就会在最下面看到物理地址, 通常是一串十六进制数. 找到对应的数据之后在注册表编辑器里把物理地址的整个项都导出来(等会要用) - 切换到Linux下
重启切过去, 如果是关机可能触发Windows的快速开机功能导致开机秒进Windows.
- 打开目标注册表项, 找到蓝牙设备物理地址对应的注册表项导出
- 切换到root用户
sudo su -
切过去, 后续都是在root用户下操作的 - 进入蓝牙设备目录并进入本机蓝牙设备
cd /var/lib/bluetooth/
这里我一开始在etc找了一段时间, 还很疑惑不在, 结果是在var
的. 可能是这种即插即用设备变化太频繁了吧.
至于本机蓝牙设备, 一般这个只有一个, 有多个的话欢迎在评论区探讨. - 查找外部蓝牙设备地址
这个一般会与Windows下的地址不一样, 此时第一阶段连接过的蓝牙信息就起作用了, 使用之前的连接记录, 找到你的设备. 你可以使用这个命令:find ./ -iname "info" -type f |xargs grep "Name";
或是在它后面再加一个grep的管道来过滤它的友好名称找到物理地址.
找到后将其按照之前的规则, 重命名为与Windows下的物理地址值(重点) - 修改info文件
注意: 这里是重点参考原文引用
其实看原文就已经足够了, 我这里简单阐述一下过程, 主要就是按照刚刚导出的注册表项中的值, 修改对应的info文件- IdentityResolvingKey部分
IRK转为大写后放到这个字段的Key里去 - LocalSignatureKey部分
CSRK转为大写后放到这个字段的Key里去 - LongTermKey
LTK转为大写后放到这个字段的Key里去
ERand需要按字节逆序转为十进制数放到这个字段的Rand里去, 什么叫按字节逆序呢?
e.g.
假如有(ef cd ab)这些数据在ERand里, 你要将其转为(ab cd ef), 这个数字再转为十进制数才是Rand需要的
EDIV可以直接转为十进制数放进EDiv
现在就完成了所有的步骤, 你需要重启系统之后稍微等一小会, 系统就会询问你是否信任一个新的设备(你也可以主动去蓝牙设备列表里授予信任), 你通过后就可以正常连接了.
- IdentityResolvingKey部分
其实这个方案应该是所有*nux都通用的(包括MacOS).