2015年3月24日 星期二

BLE 裝置研究 - 小米手環 (2)

上一個章節介紹了一些基本功能後, 這一個章節我們就用一些 Tools 來逆向工程研究一下小米手環, 會用到如 BLE Scanner in Android/iOS, Device Monitor, Packet Sniffer 等工具, 細節請參考 BLE Tools

首先我們先來研究一下小米手環 Advertisement 的內容, Parsing 後廣播內容有四個欄位
  1. Flags: 0x06 (BLE General Discovery Mode + BR/EDR not supported)
  2. Incomplete 16bit UUID: 0xFEE0 & FEE7
  3. Complete Local Name: MI
  4. Manufacture Specific Data: 0x0157 (小米在 Bluetooth SIG 註冊的 Company ID), XXXX (一堆會改變的內容)
其中 1&2 是在 ADV_IND 的內容, 3&4 則是手環收到 SCAN_REQ 回的 SCAN_RSP 的內容, 如下圖所示







那我用 Scanner App 觀察了一下, 發現到每一分鐘, 手環廣播內容會變 (Manufacture Specific Data 的部分), 我抓了四張圖參考如下 (這邊的內容是 ADV_IND 和 SCAN_RSP 合起來的 raw data), 不過我只知道內容一分鐘會變一次, 但是因為他是 Manufacture Specific, 所以到底這一串資料代表何意義就真的不知道了, 但相信應該會是有用的資訊才對 (可能跟協助手環綁定手機有幫助的東西?)













接下來我們想知道小米手環 Profiles or Services 的功能, 上一章節有貼過這張圖, 是 Service Discovery 的結果, Generic Access (0x1800), Generic Attribute (0x1801) 以及 IAS (0x1802) 都是 Bluetooth 官方制定的 Service, 所以用法可以知道 (網路查就有了), 但是 UUID 0xFEE0, 0xFEE1, 0xFEE7 這三個 Services 以及他們的 Characteristics 則完全不知道用途是什麼, 因為這是小米自訂的 Services


























所以要知道到底這些未知的 Services / Characteristics 用途是什麼, 我想到可行的方法就是靠 Sniffer, 用 Sniffer 去偷聽手機 App 和手環之間的互動, 來分析這些 Services / Characteristics 的功能, 如下示意圖:




首先我讓手環進入 advertisement mode (不要讓手還跟手機綁定的情況下就會進入這個 Mode), 使用 Device Monitor 來抓看看 (因為需要看 Handle / UUID), 我貼圖也比較方便, 結果發現他 Service Discovery 到一半會失敗 (Attribute Validation Failed) 所以只能看到下面這樣:














我改用手機 APP 去連, 結果是可以看到 Characteristics 的 (只是不知道用途而已), 所以我也不知道為何 Device Monitor 會失敗


























為了抓到 Handle, 我看一下之前有抓成功的案例, 所謂的 Handle 其實就是一個遞增的值而已, 但前提是你要知道你的 Service 下有幾個 Characteristic 而 Characteristic 下有幾個 Descriptors, 而他就是從 1 開始遞增的, 所以我其實是可以自己寫一個 APP 來列出 Handle & UUID 的資訊.

(*) 安全因素就不提供太多明確資訊

接下來就是要讓 Sniffer 動起來可以抓到 Connected 後的 BLE Packets, 步驟如下:
  1. 讓手環進入 Advertising state, 這時手環就會開始發 Advertisement
  2. 開啟 packet sniffer 確定有抓到手環的 advertisement packets (ADV_IND)
  3. 再來打開手機, 用小米運動 APP 去跟手環連線, 如果 Sniffer 有抓到的話, 就可以進入抓到連線封包的狀態了
  4. 假如手機已經跟手環連接進入 Connected, 但是 Sniffer 沒看到, 就是沒抓成功, 重新試到可以抓到連線後的封包內容
抓到之後, 你只要對 App 做動作, 再去看 Sniffer, 就可以知道這些 Services/Characteristics 對應的功能是什麼了

註: 所謂的安全因素呢, 先說這邊只是我個人猜測, 沒有實際試過, 可能等我哪天比較有空再來試試看, 但假如我對小米手環韌體分析沒錯, 那理論上, 其實就是上一章節討論的部分, 所謂的綁定其實只是讓 App 認識你的手環而已, 避免其他手機也有裝 App 就去控制你的手環, 而這前提是因為 App 才知道怎麼去跟手環溝通, 所以綁定就是類似開啟 App 存取某手環的一個授權動作, 但是, 假如我自己知道如何去存取這些 Services/Characteristics, 那我可以自己寫程式, 不透過小米 App 就存取手環了, 所以 A 的手環, 假如當下他手機藍芽關的或是手機關機中, 手環處在 advertisement state, 那我自己寫的 App 可以不用跟 A 的手環綁定就去讀他的資料了, 所以我就知道 A 的睡眠跟運動資訊了!

最後相信大家都有一個疑問, 就是就算我 Sniffer 了資料, 但是我還是不知道資料內容的意義, 關於這點, 應該除了小米內部的人外, 我想不會有人知道, 能夠透過 Sniffer 知道的只有 行為 <=> 傳輸資料內容 的對照而已, 舉例來說我知道寫入 XXXX 然後手環就亮紅燈, 寫入 OOOO 然後手環就亮綠燈這樣子, 但每個 Byte or Bit 表示的意義, 就只能用現有資料去推跟猜看看, 但難度很高

註: 測試時的小米手環韌體版本:  v1.0.9.14

------------------------------------------------------
Copyright by Jackal Chen @ 2015
jackalchen737@gmail.com

相關系列文章:

沒有留言:

張貼留言