无线通信的简单理解

微软推出了无线键盘鼠标套装,型号为; 微软无线键盘/鼠标800。这套键盘和鼠标具有反应灵敏、手感细腻、价格实惠等优点。 唯一的缺点是它使用2.4G进行通信。 协议被攻破,可以用很低的成本搭建一套监控设备。 本文将介绍如何使用成本不到5元的nRF24L01模块和Arduino Uno构建一个窃听设备。 本文是基于 github 上 SamyKamkar 的 keyweeper 项目编写的。 代码和实物只是一小部分,最重要的是原理。 首先,这套微软键盘采用的是NRF 24LE1H芯片,可以简单理解为单片机加上nRF41L01模块,这就给了我们一个机会; 键盘使用的模块通讯方式与最常见的nRF41L01+模块相同。 所以这就是整个项目的硬件基础。 使用nRF41L01+模块进行通信,有以下要求: 1、通信速率 2、使用的信道(即频率) 3、通信双方的MAC地址。 对于1,微软键盘仅使用2MBps; 对于2,是通过扫描频率范围来确定的。 键盘标签显示其向FCC申请注册的频段为2403-2480Mhz。 我们只需要在这个范围内每1MHz扫描一次。

因为我们的目标只是监控,作为发送端的键盘的MAC并不重要,我们只需要知道接收端的MAC即可。 当然,这个项目的技巧和难点就在于此。 首先我们来说一下键盘与接收器之间的通信格式:初始Preamble,翻译成中文为“前导码”,是一个由0 1间隔组成的字节,也就是说只能是0x55(0b01010101)或者0xAA(0b10101010) ),通信时解析这个就可以知道每一位的长度等信息; preamble后面的Address就是MAC,芯片可以根据这个信息判断是否是发给它的。 例如,PC上使用的每张网卡都会有一个世界上唯一的MAC。 当有数据包发送到网口时,网卡本身通过解析数据包中的MAC来知道数据是否是发送给自己的。 更通俗的理解是,两个人在吵杂的空间里交谈时,最好的办法就是喊“老张,XXX”。 需要听老张演讲的人,听到“老张”时可以关注以下内容。 “老张”是接收端的MAC。 在nRF41L01+芯片上,有这样一个限制:只能监听特定的MAC地址。 含义:需要设置芯片“监听”的具体MAC,以便其能够传输相应的数据。 如果不告诉它接收者的MAC,它不会响应键盘发送的数据包; 经过研究,SamyKamkar 发现了一个有趣的事情。 在设置nRF41L01+监听MAC的寄存器中,有一个监听MAC长度的设置。 寄存器(为了灵活性,nRF41L01+可以设置不同长度的MAC):参考2 从上面可以看出,该芯片可以对应的最短MAC是3个字节。

不过根据别人的实验,如果这个参数设置为00,实际上是在监听一个2字节的MAC地址。 换句话说,如果我们知道键盘发送的数据包上出现的2个字节的数据,我们就有机会监听到完整的数据。 其他人继续研究(他们有设备监控2.4G无线抓包),发现微软键盘的MAC最高位是1。这样,键盘肯定会使用0xAA作为前导码(因为如果使用0x55,它可能被“粘”到最高的MAC 1,所以你只能使用0xAA)。 这样我们就知道发送的数据肯定还是有0xAA的。 还少了1个就凑成了2个字节。 这时发生了一件非常有趣的事情:当没有人真正对芯片“说话”时,芯片仍然在工作,很多时候它会听到0x00或0xFF。 因此,我们可以欺骗IC,让他“听”0x00AA。 芯片始终在接收,它会不断验证它“听到”的结果,并过滤掉不正确的结果。 判断正确与否的方法就是CRC。 如果我们关闭此检查,芯片将通知我们它听到的所有信息。 然后我们检查一下我们听到的MAC的最低Byte是否为0xCD(研究发现该系列键盘的MAC最低Byte位为0xCD),这样就可以知道告诉我们的信息是真实有效的。 利用这种欺骗方法,可以获得真实的接收者MAC。 使用 MAC,您可以公开监控键盘通信。

捕获的键盘数据是加密的,但是方法很简单,使用MAC进行异或运算。 解析解密后的HID数据后,我们终于可以得到新闻信息了。 •设备类型 0x0A=键盘,0x08=鼠标 •数据包 0x78=按钮,0x38=长按 以上就是该监控设备的原理。 硬件连接如上一个文件中的PCB图所示。 nRF24L01+Arduino UnoGNDGNDVCC3.3VCED9CSND8SCKD13MOSID11MISOD12IRQ(空)连接后即可使用