看我如何逆向智能手環控制無人機

一年前,我買了一個智能手環,型號為SONY SmartBand SWR10。就像大部分智能手環一樣,它對我沒什麼用一直放在抽屜裡。

背景

突然有一天我有了個很好的靈感——朋友邀請我加入他們的“NASA太空”APP黑客馬拉松隊伍,而我選擇了“不要撞我的無人機”這個課題,它包括無人機控制和飛行信息方向的解決方案,於是我決定用我的手環來控制無人機。


看我如何逆向智能手環控制無人機


當黑客馬拉松開始時,我去尋找我的手環相關的開發API和開發工具,我很驚訝它居然沒有任何相關資料。論壇上也有用戶說SONY只提供了一些閉源的SDK給他們的程序員,而我的黑客馬拉松只允許開源的解決方案。事實上我認為創建我自己的接口並不困難。

思路

於是我啟動了我的手環應用,然後打開“藍牙HCI監聽日誌”。這個功能可以嗅探所有的流量並將其導入到SD卡中。

我打開日誌:


看我如何逆向智能手環控制無人機


然後用WireShark打開。


看我如何逆向智能手環控制無人機


這好像是在運行藍牙低能耗協議,並且比 GATT協議更特殊,這是一個雙向協議。手機有一個“GATT服務”,外圍設備會接收“GATT特徵碼”而它包含所有二進制數據。

我選擇了第一個UUID (00000208–37cb-11e3–8682–0002a5d5c51b) 然後在谷歌搜索。我希望搜索到一些傳統的標準GATT服務,但我卻發現了一些有趣的東西

https://github.com/fbarriga/sony-smartband-open-api

瞬間我覺得我可以完成了——我發現了別人對這個協議的逆向。同時也證實了我是對的,這個項目包含了連接,握手,電池狀態讀取,連接保持的工作原理實現。但是,加速計數據很奇怪。我將加速計上的數據掛載到MPAndroidChart,實時的圖表顯示如下:


看我如何逆向智能手環控制無人機


分析

雖然輸出與傾斜高度相關,但是值是完整的。在閱讀實現代碼之後,32位的整數值好像包含3個10位的值。這是合理的,因為大部分的加速計有10位的精度(大部分ADC)。數據證明了這一點,看前兩部分:


看我如何逆向智能手環控制無人機


但是解析這3個10位的數據也很奇怪,每幾個傾斜的值都會在511到-512之間變化,沒有偏移能夠改變它(沒有整數溢出產生)。所以,我覺得SONY是不是用了什麼傳統的二進制打包方法,或者他們有編碼算法和壓縮算法。

我嘗試用Protobuf,MsgPack,Thrift 來解析,但是都沒用。這時我只有一天來講加速計跟我的無線飛行器關聯到一起。但就在我絕望時,在查看他們的APP反編譯結果的半小時後,我發現了下面這些東西:


看我如何逆向智能手環控制無人機


前半部分的[0,512]是反的,這就是我獲得這些峰值的原因。我用簡單的異或對其進行調整。我把他們調整到[-1,1範圍],現在要做的就是把加速計和無線控制器建立連接(你可以在GitHub上找到實現)。

最終我完成了這個項目,並且贏得了獎項。

看我如何逆向智能手環控制無人機

*參考來源:medium.com ,FB小編老王隔壁的白帽子翻譯,轉載自FreeBuf黑客與極客(FreeBuf.COM)


分享到:


相關文章: