broadlink協議分析


原文:Broadlink smart home devices complete protocol hack

鏈接:https://blog.ipsumdomus.com/broadlink-smart-home-devices-complete-protocol-hack-bc0b4b397af1

在smart home diy 網站上,有人研究如何將智能設備加入自己的DIY smart home hub上。第一個添加就是broadlink設備。作者最終實現的是用自己的代碼來控制博聯設備。文章對broadlink的協議部分進行了介紹,並給出了控制設備的node.js源碼。
Step1 配置和配對
長按reset按鈕,直到藍燈快閃。
這時出現了名爲BroadlinkProv的wifi熱點。這就是配置訪問點。

Step2 逆向broadlink協議
broadlink使用的是QUIC UDP協議進行交互。QUIC有兩個工作選項,public和not public。不同點在於消息的第一個字節的第二個比特。
所有的消息可以廣播發送或發送到指定ip地址。broadlink使用80端口交互(應該是設備端口是80)。

broadlink 消息結構
當public bit被設置爲0,也就是low public flag,消息結構如下:

public flag : 0x00
public number: 0x00
payload
當public bit被設置爲1,也就是high public flag,消息結構如下:

public flag:0x5a( Version:No, Reset:Yes, CID:0x2,Packet #1, Multipath:Yes)
Connection ID:24113000182295205 (0xa5aa555aa5aa5500)
Tag:0x00
Tag ID:0x00
padding:爲0x00
payload(從第18個字節開始)

broadlink消息的頭部將緊跟QUIC的頭部,並有如下結構:
對於low public flag實際上是沒有broadlink頭部的。
對於high public flag,頭部信息。
對於public消息,整個broadlink頭部長度是56字節。
bytes 32-33(0x20-0x23)總是整個消息的checksum。對數據進行所有操作(包括加密)後進行計算。 通過使用0xbeaf的Magic完成校驗和計算。
然後在字節36-37(0x24)爲設備ID。Ipsum Domus使用0x7D00,Broadlink值如下:
0: 'SP1'; 
0x2711: 'SP2'; 
0x2719 or 0x7919 or 0x271a or 0x791a: 'Honeywell SP2'; 
0x2720: 'SPMini'; 
0x753e: 'SP3'; 
0x2728: 'SPMini2'; 
0x2733 or 0x273e: 'SPMini OEM';        
0x2736: 'SPMiniPlus'; 
0x2712: 'RM2'; 
0x2737: 'RM Mini'; 
0x273d: 'RM Pro Phicomm'; 
0x2783: 'RM2 Home Plus'; 
0x277c: 'RM2 Home Plus GDT'; 
0x272a: 'RM2 Pro Plus'; 
0x2787: 'RM2 Pro Plus2'; 
0x278b: 'RM2 Pro Plus BL'; 
0x278f: 'RM Mini Shate'; 
0x2714: 'A1'; 
0x4EB5: 'MP1'; 
>= 0x7530 and <= 0x7918: 'SPMini2 OEM';

在字節38(0x26)是command,對應的request IDs如下:
Hello       : [0x6]
Discover    : [0x1a]
Join        : [0x14]
Auth        : [0x65]
Command     : [0x6a]
而且相應的response IDs:
Hello       : [0x7]
Discover    : [0x1b]
Join        : [0x15]
Auth        : [0x3e90]
Command     : [0x3ee]
還有一些額外的信息域:
字節40(0x28)共兩個字節。這個值用來將請求與相應相關聯。
字節42(0x2a)爲設備的MAC地址,以小端格式存放。
字節48(0x30)爲device id
字節52(0x34)爲checksum。這個checksum的計算與整個消息是一樣的,只不過它是針對payload的計算。
然後,如果要求加密,則加密整個payload,並把它加在頭部後面(在public high的情況下是從第57個字節開始)。
數據加密是aes-128 CBC算法,無padding。IV如下:
Initial key: [0x09, 0x76, 0x28, 0x34, 0x3f, 0xe9, 0x9e, 0x23, 0x76, 0x5c, 0x15, 0x13, 0xac, 0xcf, 0x8b, 0x02]
Initial vector: [0x56, 0x2e, 0x17, 0x99, 0x6d, 0x09, 0x3d, 0x28, 0xdd, 0xb3, 0xba, 0x69, 0x5a, 0x2e, 0x6f, 0x58]
本文只是對原文章進行翻譯,若有侵權請及時告知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章