最近吼砂,我發(fā)現(xiàn)自己就“物理網(wǎng)絡(luò)和Web藍(lán)牙 ”進(jìn)行了大量的討論绩鸣。為了演示這些技術(shù)的一些功能,我想為我的演示找到一款價(jià)格合理的設(shè)備 - 最好低于10美元 - 這樣我的觀眾就可以輕松獲得演示設(shè)備并自行嘗試凡简。
通過搜索互聯(lián)網(wǎng)秤涩,我以10美元以下的價(jià)格從中國購買了一些消費(fèi)“智能燈泡”帜乞,因此我訂購了兩種來玩。智能燈泡包括一個(gè)RGB LED筐眷,因此它們可以改變顏色黎烈,當(dāng)然它們也是通過藍(lán)牙控制的!正如你可以從這種產(chǎn)品期望的那樣匀谣,沒有任何文檔 - 只是鏈接下載Android應(yīng)用程序照棋。由于我想展示如何通過Web藍(lán)牙控制它們,因此我決定嘗試對協(xié)議進(jìn)行反向工程武翎。
為什么要花時(shí)間對協(xié)議進(jìn)行逆向工程烈炭?
首先,這種方式更有趣宝恶。它還使您能夠?qū)⑵渑c諸如天氣服務(wù)(燈泡根據(jù)天氣變化顏色)符隙,您的startup的自動化版本(代碼被破壞時(shí)燈泡為紅色)或快速閃爍隨機(jī)顏色等任何內(nèi)容結(jié)合起來(我的觀眾真的很喜歡這最后的用途)趴捅。
一旦你控制了燈泡,可能性僅受限于你的想象力:你可以用你的聲音控制它(使用語音識別)霹疫,用手機(jī)的加速度計(jì)控制它,當(dāng)你接到電話時(shí)閃爍燈泡,或者甚至通過全天改變色溫來調(diào)節(jié)睡眠周期栏笆,以獲得類似日出/夕陽光的效果缸逃,以幫助調(diào)節(jié)全天的身體褪黑激素水平。而這些只是適合我餐巾背面的想法苞七!
為了完成這個(gè)項(xiàng)目惠啄,你不需要知道有關(guān)藍(lán)牙的一切姥闭,但需要一些基本概念才能實(shí)現(xiàn)铜跑。
如果您想了解更多關(guān)于藍(lán)牙低功耗(又名BLE)的信息囤锉,我很樂意為您指出正確的方向驱入,或者寫一篇文章解釋BLE的更多技術(shù)方面 - 在評論中回復(fù)我莺褒!
藍(lán)牙低功耗101(或者100)
在低功耗藍(lán)牙中,設(shè)備可以執(zhí)行兩種角色之一雪情。設(shè)備可以是“中央(Central)”(本例中為手機(jī))遵岩,也可以是“外設(shè)”(分別為燈泡)。
藍(lán)牙設(shè)備具有對應(yīng)于設(shè)備的一種功能的服務(wù)(services) 巡通。例如旷余,您的智能手表可能會公開一項(xiàng)服務(wù)以報(bào)告設(shè)備的電池電量,然后另一臺設(shè)備測量您的心率扁达。每項(xiàng)服務(wù)都暴露稱為特性(characteristics)的變量/屬性正卧。這些特征代表了服務(wù)的一個(gè)參數(shù),可以讀取,寫入或者兩者兼有。
例如眨攘,在上述電池服務(wù)中红氯,它將具有電池電量特性,這是一個(gè)只讀值,包含0到100之間的1字節(jié)值,報(bào)告設(shè)備中剩余電池的百分比。
溫度服務(wù)可以具有一個(gè)溫度特性罐盔,以及另一個(gè)濕度特性,兩者都是只讀的救崔。智能燈泡服務(wù)可以具有一個(gè)特性用于開/關(guān)(寫入0將其關(guān)閉惶看,1開啟)以及用于亮度(0至100左右)的另一特性捏顺,其可以是只寫或可讀可寫。
外設(shè)周期性地宣告他們擁有的服務(wù)(通常每秒約一次)幅骄。中心(例如您的手機(jī))可以看到這些廣告,并且可以與周圍的任何外圍設(shè)備建立連接本今,并對其服務(wù)提供的特征進(jìn)行讀取/寫入拆座。
每種服務(wù)和特性都由唯一的16位或128位數(shù)字標(biāo)識,如ff05
(16位)或00000000–0000–1000–8000–00805F9B34FB
(128位)冠息。 16位預(yù)留用于標(biāo)準(zhǔn)服務(wù)和特性挪凑,例如前面提到的電池電量服務(wù),并由Bluetooth SIG Group定義逛艰。盡管如此躏碳,許多消費(fèi)設(shè)備喜歡將它們用于自己的目的。
逆向工程燈泡:燈泡1
逆向工程第一個(gè)燈泡瓮孙,一個(gè)智能LED燈E27 RGBW 5W燈泡 ,很容易选脊。簡而言之 - 我打開NRF Connect 杭抠,掃描,發(fā)現(xiàn)燈泡恳啥,嘗試一些值偏灿,并得到我想要的。
連接到燈泡后钝的,我對設(shè)備暴露的不同特征進(jìn)行隨機(jī)寫入翁垂,最終它改變了顏色。經(jīng)過一些試驗(yàn)和錯(cuò)誤之后硝桩,我發(fā)現(xiàn)協(xié)議非常簡單沿猜。您只需要將4個(gè)字節(jié)寫入Service ffb0
/ Characteristics ffb2
,格式如下: BB GG RR WW
(藍(lán)色碗脊,綠色啼肩,紅色和白色級別),對應(yīng)燈泡的內(nèi)部LED衙伶。
我甚至沒有得到這個(gè)燈泡的應(yīng)用程序祈坠,并且從來沒有-我只是通過直接用nRF Connect控制它,后來寫了一個(gè)小的Node.js應(yīng)用程序矢劲,以使用noble控制它赦拘。
逆向工程燈泡:燈泡2
第二個(gè)燈泡芬沉,一個(gè)魔術(shù)藍(lán)UU E27燈泡 躺同,更有趣阁猜。使用與nRF Connect相同的技術(shù),我立即發(fā)現(xiàn)唯一可寫的特征(在服務(wù)ffe5
中的特征號ffe9
)笋籽,但給它發(fā)送值蹦漠,它沒有任何效果。我決定嘗試另一種方法 - 使用隨燈泡提供的官方Android應(yīng)用程序车海,然后記錄所有通信信息笛园,找出命令,然后將它們自己發(fā)送到燈泡來控制它侍芝。
首先研铆,我安裝了此燈泡的官方應(yīng)用程序 ,確保藍(lán)牙已啟用州叠,并打開應(yīng)用程序以確笨煤欤可以與燈泡配對并通過應(yīng)用程序控制它。
Android 4.4(和更新版本)可以選擇記錄進(jìn)出設(shè)備的所有藍(lán)牙數(shù)據(jù)包咧栗。我使用此功能來記錄應(yīng)用程序和燈泡之間的消息逆甜。如果你想親自嘗試一下,啟用起來非常簡單:
- 首先致板,如果您尚未這樣做交煞,則需要在Android中啟用開發(fā)人員模式 。
- 接下來斟或,轉(zhuǎn)到設(shè)置素征,然后打開“開發(fā)人員選項(xiàng)”并打開“啟用Bluetooth HCI snoop日志”。這將開始記錄通過您的設(shè)備的所有藍(lán)牙流量萝挤。
一旦我的記錄機(jī)制全部建立起來御毅,我就打開了“Magic Blue”應(yīng)用程序,并向燈泡發(fā)送了一些命令以多次改變它的顏色)怜珍。為了完成該過程的第一部分端蛆,我將藍(lán)牙通信記錄從我的Android設(shè)備復(fù)制到了我的PC。
您可以在/sdcard/btsnoop_hci.log
找到錄制文件酥泛。您可以使用“文件管理器”應(yīng)用程序找到該文件并通過Google Drive或Email共享該文件欺税,也可以使用USB電纜將Android設(shè)備連接到PC,然后在根文件夾中找到btsnoop_hci.log
文件揭璃。
如果您的計(jì)算機(jī)上安裝了Android SDK晚凿,則還可以使用USB電纜連接它并使用以下命令復(fù)制日志:
adb pull /sdcard/btsnoop_hci.log
注意:在某些設(shè)備中, btsnoop_hci.log
是以不同的路徑創(chuàng)建的瘦馍,例如/sdcard/Android/data/btsnoop_hci.log
歼秽。
我使用Wireshark打開藍(lán)牙日志。Wireshark是一款免費(fèi)工具情组,可讓您分析網(wǎng)絡(luò)流量燥筷。如果您想要自己逆向工程燈泡箩祥,請注意,您可能需要將文件重命名為btsnoop_hci.pcap肆氓,Wireshark才能識別它袍祖。
最初,有大量的數(shù)據(jù)包谢揪,其中一些可能與藍(lán)牙無關(guān)蕉陋。我使用“過濾器”選項(xiàng)(見上圖)選擇“寫入特征值(Write Characteristic Value)”命令。我使用這個(gè)過濾器:
btatt.opcode.method==0x12
(或者拨扶,您也可以通過設(shè)備地址進(jìn)行過濾凳鬓,以查看與特定設(shè)備的所有通信。以下是使用MagicBlue燈泡地址過濾的示例:
bluetooth.addr==f7:34:5b:f8:cc:ef
有時(shí)候通過這種方式可以更容易地找到你要找的東西患民。)
看著其中一個(gè)寫命令缩举,我發(fā)現(xiàn)這個(gè)有效載荷:
有效載荷為56 ff 08 5a 00 f0 aa
。
我使用上面提到的nRF Connect應(yīng)用程序?qū)⒋酥蛋l(fā)送到服務(wù)ffe5
的特性ffe9
(如果您還記得匹颤,這是唯一可寫的)仅孩,并且瞧 - led變成了粉紅色紫色。
通過試驗(yàn)其他一些組合摆尝,我找出了協(xié)議的格式。我發(fā)現(xiàn)實(shí)際上有兩種格式因悲,一種用于控制RGB LED堕汞,另一種用于控制暖白色LED(看起來像不能同時(shí)開啟):
56 RR GG BB 00 f0 aa
第一個(gè)字節(jié)始終為56
,然后是紅色晃琳,綠色和藍(lán)色值的三個(gè)字節(jié)讯检,然后是值為00 f0 aa
另外三個(gè)字節(jié)。
對于白色LED卫旱,格式是:
56 00 00 00 WW 0f aa
第一個(gè)字節(jié)仍然是56
人灼,然后接下來的三個(gè)字節(jié)是00(或者任何你想要的,真的顾翼,因?yàn)樵O(shè)備將不給予他們注意)投放,然后是一個(gè)指定白色LED亮度的值,以及另外兩個(gè)字節(jié)的值0f aa
适贸。
最后灸芳,燈泡還包含一些奇特的模式涝桅,例如兩種顏色之間的漸變。這些由不同的命令激活:
bb II SS 44
II是照明模式(lighting mode)的索引( 25
和38
之間的值有效)且SS是速度(數(shù)值越低意味著顏色變化越快)烙样,每個(gè)單位大約為200毫秒(所以數(shù)值5
會每秒觸發(fā)一次變化)冯遂。
例如,模式編號25
改變所有彩虹色和白色之間的淡入淡出谒获。要在每兩種顏色之間延遲約1秒來激活它蛤肌,請發(fā)送以下命令:
bb 25 05 44
關(guān)于安全的一個(gè)詞
正如你在上面看到的,這兩款智能燈泡都沒有安全機(jī)制究反。這意味著范圍內(nèi)的每個(gè)人都可以連接并控制它們寻定。雖然第二個(gè)燈泡至少需要對協(xié)議進(jìn)行逆向工程,但第一個(gè)燈泡甚至不需要付出很多努力精耐。我希望一些高端智能燈泡的設(shè)計(jì)考慮到安全性狼速,盡管從Google的“藍(lán)牙智能燈泡安全性”來看,似乎沒有人真正解決這些問題(例如卦停,我只能找到一個(gè)提到智能燈泡的安全審查)向胡。
所以只要知道,盡管這些燈泡作為裝飾惊完,玩具或藝術(shù)項(xiàng)目的一部分是很好的僵芹,但在閱讀本文后,您可能不得不容忍鄰居在家中突然改變燈泡的燈光小槐。
故事的道德:我不會將它們用于任何關(guān)鍵的事情拇派。
結(jié)論:我們已經(jīng)破解了燈泡......現(xiàn)在為了更多的樂趣!
所以現(xiàn)在我們通過對協(xié)議進(jìn)行逆向工程來破解燈泡凿跳,我們可以自信地改變我們鄰居的智能燈泡的顏色(我在開玩笑:我不會寬恕或推薦這個(gè)......我只是說我們可以 )件豌。
如果您有興趣使用我使用的智能燈泡,您可以在這里 (第一個(gè))和這里(第二個(gè))獲取它們控嗜。我邀請你自己試驗(yàn)燈泡茧彤,看看你可以用它們做些什么干凈的事情(如果遇到任何麻煩或發(fā)現(xiàn)任何超酷的東西,請隨時(shí)在評論中告訴我)疆栏。
在我的下一篇文章中 曾掂,我將討論Web藍(lán)牙,并演示如何通過網(wǎng)頁控制燈泡壁顶。所以如果你讓拿到了自己的燈泡珠洗,你會準(zhǔn)備好跟著我來:)
更新(2017年2月):我拆開燈泡并逆向工程了它的固件。
有興趣了解燈泡的內(nèi)部工作原理若专?查看后續(xù)的帖子 许蓖,我從燈泡中提取固件并對其進(jìn)行逆向工程,或閱讀我如何讓燈泡在沒有電源的情況下運(yùn)行 。