微軟推出過一款無線鍵盤鼠標(biāo)套裝,型號是;Microsoft Wireless Keyboard/Mouse 800。這套鍵鼠具有反應(yīng)靈敏,手感細(xì)膩,價格適中等等優(yōu)點(diǎn),美中不足的是它使用2.4G進(jìn)行通訊,協(xié)議已經(jīng)被人攻破,可以使用很低的成本搭建一套監(jiān)聽的設(shè)備。本文就將介紹如何使用不到5元的 nRF24L01模塊加一塊ArduinoUno搭建一竊聽裝置。
本文是根據(jù)github 上SamyKamkar 的keysweeper項(xiàng)目寫成。代碼和實(shí)物只是很小的一部分,最重要的是原理。
首先,微軟的這個套裝鍵盤使用的是NRF 24LE1H芯片,簡單的可以理解成一個單片機(jī)加上nRF41L01模塊,這就給我們以可乘之機(jī);
鍵盤使用的模塊通訊方式和最常見的nRF41L01+模塊相同,因此這就是整個項(xiàng)目的硬件基礎(chǔ)。
1. 通訊速率
2. 使用的頻道(也就是頻率)
3. 通訊雙方的MAC地址
對于1來說,微軟鍵盤只使用2MBps;對于2來說,是通過掃描頻率范圍來確定的。鍵盤標(biāo)簽上給出來它在FCC申請注冊過的頻段是2403-2480Mhz,我們只需要在這個范圍內(nèi)每隔1MHz掃描即可。因?yàn)槲覀兊哪繕?biāo)只是監(jiān)聽,鍵盤作為發(fā)射端的MAC不重要,我們只需要知道接收器的MAC即可。當(dāng)然,這里也是這個項(xiàng)目的技巧和難點(diǎn)所在。
首先說說鍵盤和接收器的通信格式:
最開始的Preamble,翻譯成中文就是“前導(dǎo)碼”,是由間隔的0 1構(gòu)成的一字節(jié),也就是說只能是0x55(0b01010101)或者0xAA(0b10101010),通訊時通過解析這個可以知道每個bit的長度之類等等信息;前導(dǎo)碼后面的Address就是MAC,芯片根據(jù)這個信息可以確定是否是發(fā)給它的。比如,每一個PC上使用的網(wǎng)卡都會有世界唯一的MAC,當(dāng)有數(shù)據(jù)包送到網(wǎng)口,網(wǎng)卡本身通過解析數(shù)據(jù)包中的MAC得知是否是發(fā)送給自己的數(shù)據(jù)。更通俗的理解,在嘈雜的空間兩個人對話,最好的辦法是這樣喊“老張,XXX”。需要聽老張講話的人聽到“老張”,即可留心下面的內(nèi)容,“老張”就是接收端的MAC。
在nRF41L01+芯片上,有這樣的限制:只能監(jiān)聽特定的MAC地址。意思是:你需要設(shè)定芯片“聽”的具體MAC,它才能把對應(yīng)的數(shù)據(jù)傳出來。如果你不告訴它接收器的MAC,它是不會對鍵盤發(fā)出來的數(shù)據(jù)包有響應(yīng);經(jīng)過研究,SamyKamkar發(fā)現(xiàn)了一個有意思的事情,在設(shè)置nRF41L01+監(jiān)聽MAC的寄存器中,有一個設(shè)置監(jiān)聽MAC長度的寄存器(為了靈活,nRF41L01+可以設(shè)置不同長度的MAC):
參考2
從上面可以看出,這個芯片能相應(yīng)的最短的MAC是 3 字節(jié) 。但是,根據(jù)其他人的實(shí)驗(yàn),如果這里參數(shù)設(shè)置為00 實(shí)際上是在監(jiān)聽2字節(jié)的MAC地址。換句話說,如果知道鍵盤發(fā)送的數(shù)據(jù)包上出現(xiàn)的2個字節(jié)的數(shù)據(jù),我們就有機(jī)會把完整的數(shù)據(jù)監(jiān)聽下來。其他人繼續(xù)研究(他們有監(jiān)聽2.4G無線抓包的設(shè)備),又發(fā)現(xiàn)微軟這個鍵盤MAC最高位是 1 。這樣鍵盤一定會使用0xAA作為前導(dǎo)碼(因?yàn)槿绻褂?x55有可能和MAC最高的1“粘”在一起,所以只能使用0xAA)。這樣,我們知道發(fā)送的數(shù)據(jù)肯定還有一個0xAA了。還差一個才能湊夠2個字節(jié)。這時候就有很有意思的事情了:當(dāng)實(shí)際上沒有人對芯片“講話”的時候,芯片還是在工作的,很多時候它會聽到0x00或者0xFF。于是,我們可以欺騙IC,讓他“聽”0x00AA。芯片一直在接受,它會不斷校驗(yàn)“聽到”的結(jié)果,過濾掉不正確的結(jié)果。判斷正確與否的方法是CRC,我們關(guān)掉這個校驗(yàn),芯片就會通知我們所有的它聽到的信息,我們再校驗(yàn)聽到的MAC最低Byte是否為 0xCD(研究發(fā)現(xiàn)這個系列的鍵盤MAC最低Byte位0xCD),也就能知道告訴我們的那些信息是真實(shí)有效的。
使用這樣欺騙的方法,能夠獲得真實(shí)的接收器的MAC。有了MAC就可以光明正大的監(jiān)聽鍵盤的通訊了。
對于抓到的鍵盤數(shù)據(jù)是有加密的,只是方法非常簡單,使用MAC進(jìn)行XOR運(yùn)算。
解析解密之后的HID數(shù)據(jù),最終我們就可以得到按下信息。
? 設(shè)備類型0x0A = 鍵盤,0x08 = 鼠標(biāo)
? 數(shù)據(jù)包 0x78= 按鍵,0x38 = 長按
上面就是這個監(jiān)聽裝置的原理,硬件連接如上次文件PCB圖為準(zhǔn)。
nRF24L01+ |
Arduino Uno |
GND |
GND |
VCC |
3.3V |
CE |
D9 |
CSN |
D8 |
SCK |
D13 |
MOSI |
D11 |
MISO |
D12 |
IRQ (空) |
連接好之后即可使用