對小米Mi Band 2的破解
Mi Band 2(小米手環2)是小米公司在2016年6月2日正式釋出的一款運動追蹤產品,它支援運動計步、睡眠監測、久坐提醒、心率監測(可實時監測)、來電提醒、螢幕解鎖(Android系統)、振動鬧鐘和免密支付等功能。
要想讓你的MiBand 2和手機繫結,具體過程有以下5步:
1.首先在手機的應用商店裡下載小米運動APP,並開啟手機藍芽。
2.用手機號註冊登入小米帳號,或直接登入小米賬號,並進入手環的繫結頁面裡。
3.開始搜尋手環,藍芽搜尋需要時間,需耐心等待片刻。
4.出現“請點選手環”的提示後,在手環上點選觸控按鍵。
5.繫結完成會出現√,這樣手環就繫結完成啦!
破解MiBand2裝置前的準備
本文所講的破解,正是利用了以上與手機繫結過程中的藍芽連線過程。
對Mi Band 2的破解還得從發表的一篇博文開始談起,當時我在文中談到有關運動追蹤產品的監控問題。後來,我的朋友Volodymyr shymansky 幫助我在Github 上找到了Mi Band 2的程式碼。根據這些程式碼,我就可以順利進入連線到Mi Band 2,執行通知,並開啟心臟測量等功能。但這並不是我的本來目的,我地目的是要從感測器獲取實時原始資料,以便我瞭解Mi Band 2的真實追蹤情況。簡而言之,我想開發一個健身運動的預測工具,所以我決定破解我的健身追蹤器。
由於我沒有任何破解低功耗藍芽的經驗,所以首先我試著瞭解這項技術的工作原理,以及它們之間的不同功能是如何組合在一起的。事實證明,這很簡單,以下就是我總結的一些經驗:
1.每個低功耗藍芽都有一些特定的服務物件;
2.每個服務物件都有一些自己的特點;
3.其中一些特點含有特定的描述符(如果特徵具有多個引數或型別為讀取或通知型別);
4.某些特性僅具有讀或寫訪問許可權(例如,當前時間,電池狀態或修訂資訊);
5. 有些特徵比較複雜,需要使用請求或通知迴圈(例如實時心率監視器或授權);
除了瞭解以上這些基本的原理外,你還需要兩個可以幫助你除錯低功耗藍芽的應用程式:Wireshark協議分析器和BLE藍芽除錯工具。為此你需要進入你的Android手機開發者選項來進行相應設定,由於本文我討論在iOS中的情況,所以感興趣的iOS使用者請自行找到相同的設定選項。
wireshark是一款專用於網路封包的工具,比較適用於網路管理和安全工程這個職業。通過使用Wireshark免費開源分析,為當前和未來的網路工程師,網路架構師,應用工程師,網路顧問和其他IT專業人員提供有關故障排除,保護,分析和維護高效,高效的網路基礎架構的最佳實踐的教育工具。BLE藍芽除錯工具是一款好用的藍芽串列埠除錯工具,使用者能夠線上對藍芽裝置進行資料的接受以及顯示,能夠在手機上進行資料的傳送,支援一鍵掃描連線,能夠直接列印資料,是一個非常實用的工具。
準備好除錯工具,並設定好對應的選項,就可以開始進行破解MiBand2裝置了。
破解MiBand2裝置
首先,你需要從手機應用程式取消配對的Mi Band2裝置。
現在讓我們看看Mi Band2的服務特性,開啟BLE偵錯程式開始掃描,你會看到以下的場景。
將你的裝置MAC地址儲存在某個地方,稍後我們要用到它。現在讓我們連線到Mi Band2,看看它有哪些服務和特性。
通過這兩個簡單的操作,我們已經獲得了有關Mi Band2裝置的一些有用資訊。不過獲取資訊的另一種方法是使用命令列工具,如hcitool和gatttool。
首先,要通過以下命令從命令列執行BLE掃描。
sudo hcitool lescan
連線到低功耗藍芽的Mac地址並檢索服務和描述符:
sudo gatttool -b YOUR_MAC -I -t random > connect > primary > char-desc
在某些情況下,BLE堆疊可能出現故障,你可以開啟或關閉藍芽裝置或執行以下命令。
sudo hciconfig hci0 reset
如何嗅探資料
為了嗅探手機與低功耗藍芽通訊時的資料,我們需要在開發設定中啟用藍芽日誌。要執行此操作,你需要先在Android裝置上啟用開發人員設定。為此,請按照以下步驟操作。
注意:在Android 4.1及更低版本中,預設情況下可以使用“開發人員選項”。而在Android 4.2及更高版本中,你必須按如下步驟,才能啟用“開發人員選項”:
1.在Android裝置上開啟“設定”應用;
2.選擇系統(該操作只需要在Android 8.0或更高版本的裝置上才有);
3.滾動到底部,然後選擇“關於手機”的選項;
4.滾動到底部,然後選擇“版本號”選項,點選7次;
5.返回上一操作螢幕,在底部附近找到“開發人員”選項。
現在開啟“開發”設定並找到“Enable Bleutooth HCI snoop log” 選項,啟用它。在此之後,來自裝置與所有外部藍芽裝置的所有藍芽通訊將被記錄下來。你可以通過訪問名為btsnoop_hci.log的檔案來檢視日誌(在我的Android 7.0裝置,日誌位於/mtklog/btlog/btsnoop_hci.log。
身份驗證
現在,我們需要執行以下步驟來獲取有關身份驗證(配對)如何工作的一些資訊。
1.開啟藍芽和HCI日誌;
2.將你的裝置與Xiaomi Android App配對;
3.關閉藍芽;
4.將你的btsnoop_hci.log下載到你的PC;
5.用Wireshark開啟它;
6. 找到處理0x0055的第一個ATT協議請求(0x0055代表安徽華米資訊科技有限公司,小米可穿戴裝置就是該公司生產的);
此時,你看到的場景如下所示。
這個請求是驗證過程的第一步,從上圖中可以看出,控制代碼UUID的值是:
1.配對裝置:
主要服務UUID是0000fee1-0000-1000-8000-00805f9b34fb
2.驗證特徵(Char)UUID
00000009-0000-3512-2118-0009af100700
3.通知描述符(Des)控制代碼
0x2902
以下是身份驗證步驟:
1.通過向Des傳送2個位元組的請求\ x01 \ x00來設定驗證通知(以獲得響應);
2.使用命令將16位元組加密金鑰傳送到驗證特徵,並將2位元組\ x01 \ x00 + KEY附加到其中;
3.通過向驗證特徵傳送2個位元組\ x02 \ x00,使用命令從裝置請求隨機金鑰;
4.從裝置響應中獲取隨機金鑰(最後16個位元組);
5.使用AES/ECB/NoPadding加密演算法(從Crypto.Cipher匯入AES),並用我們的16位元組金鑰加密此隨機數,最後將其傳送回驗證特徵(\ x03 \ x00 +編碼資料)
實時資料的獲取
身份驗證過程有點複雜,更糟糕的是,心率監測器在15秒後就自動關閉了。以下是從Mi Band2獲取的UUID值:
1.硬體服務(HRDW)UUID
0000fee0-0000-1000-8000-00805f9b34fb
2.心臟監測服務(HMS)UUID
0000180d-0000-1000-8000-00805f9b34fb
3.心率測量特徵(HRM)UUID
00002a37-0000-1000-8000-00805f9b34fb
4.心臟監測控制特性(HMC)UUID
00002a39-0000-1000-8000-00805f9b34fb
5.感測器特性(SENS)UUID
00000001-0000-3512-2118-0009af100700
6.通知描述符(DES)控制代碼
0x2902
以下是如何執行的一些常見操作:
1.要關閉當前聽力監聽測量;
2. 向HMC \x15\x02\x00傳送一次測量請求;
3.向HMC \ x15 \ x01 \ x00傳送請求以進行連續測量;
4.通過向SENS \ x01 \ x03 \ x19傳送命令來啟用陀螺儀和心臟原始資料;
5.通過向DES \ x01 \ x00寫入請求來啟用HRM通知;
6.通過向HMC \ x15 \ x01 \ x01傳送請求,開始連續的心臟測量;
7.傳送命令到SENS \ x02(不知道為什麼需要這樣做);
8.然後在收到通知時,我們需要每隔12秒向HCM傳送一個值為\ x16的ping
解析資料
要解析資料,你就需要了解如何解壓縮來自裝置的資料。
有些資料是可以從日誌中解析的,有些則不能。找到正確的資料包和編碼可能需要一些時間,以我的裝置為例,我試圖在彼此相鄰的資料包中找到類似的位元組,可以發現有些位元組在資料包中重複出現。
Raw heart: 02102d8c348c448c458c3d8c428c488c 16 Raw heart: 0218468c418c3d8c468c3f8c398c418c 16 Realtime heart: 93 Raw heart: 0220408c448c3f8c428c498c3c8c3d8c 16 Raw heart: 02283d8c398c488c3e8c468c488c328c 16 Realtime heart: 99 Raw heart: 0230438c408c378c3a8c318c458c388c 16 Realtime heart: 102 Raw heart: 02404f8c408c458c428c4d8c558c4d8c 16 Raw heart: 02483e8c3b8c3f8c348c398c318c428c 16 Realtime heart: 98 Raw heart: 02504c8c428c5e8c4f8c588c498c558c 16 Raw heart: 0258478c458c3c8c4e8c3f8c468c4d8c 16 Realtime heart: 100 Raw heart: 0260518c4d8c4f8c4b8c4f8c528c458c 16 Raw heart: 0268408c3f8c538c4d8c408c548c598c 16 Realtime heart: 102 Raw heart: 0278418c508c4e8c548c588c468c498c 16 Raw heart: 0280368c328c2e8c3c8c338c308c3f8c 16 Realtime heart: 101
我們可以看到一個清晰的模式,其中字串368c 328c 2e8c 3c8c 338c 308c 3f8c重複,並且資料包的長度為16個位元組。如果我們用2個位元組的無符號整型(unsigned short)解壓,那麼我們就會得到7個心臟感測器的原始測量值。
我們還看到第二個位元組正在發生改變,我認為它只是測量期間的時差響應造成的。
Raw gyro: 01de49ffd9ff3c004cffd8ff3b004dffdcff4400 Raw gyro: 01df4cffd6ff44004dffd8ff40004cffd1ff4700 Raw gyro: 02e1103231323d3274328e329632af32c732cf32 Raw gyro: 01e34fffd7ff56004bffc7ff590049ffccff4c00 Raw gyro: 01e443ffccff43004effcdff40005bffd4ff4c00 Raw gyro: 01e558ffc9ff5f005effbfff66005fffb0ff5900 Raw gyro: 01e64cffacff60005cffa7ff410066ffc9ff4600 Raw gyro: 01e760ffdcff4b0051ffe4ff4f0034ffdeff5300 Raw gyro: 02e903365c36813663361036543688374139fe3a Raw gyro: 01eb4bffc3ff50004fffc1ff430047ffbbff4100 Raw gyro: 01ec3effb2ff3c0050ffbfff560047ffccff7300 Raw gyro: 01ed4fffe0ff78005cffebff8e0056fff6ff8300 Raw gyro: 01ee7efffbffa1008bff0f00bc00b1ff1900b800 Raw gyro: 01ef9bff0c00d10095fff3ffd600b7ff0800df00 Raw gyro: 02f12445314600479e473348aa481c499749244a Raw gyro: 01f3c3ff1600fe00beff1800f200a6ff0800e700 Raw gyro: 01f4a9fff8ffd300a7fff3ffd700a9fff1ffdf00 Raw gyro: 01f5b1fff8ffe800b4fff1fff700acfffcffef00 Raw gyro: 01f67ffff7ffc0006bfff4ffb00078ffe9ffb600 Raw gyro: 01f786ffecffc0006ffff0ffbc0060fff1ffc000 Raw gyro: 02f9ca4cbb4c784c964ca84c784c854c444c1b4c Raw gyro: 01fb7cff0f00bb007eff2700ae0083ff30009800 Raw gyro: 01fc79ff1800b00076ff0f00bc0068ff0900d900 Raw gyro: 01fd78ff07000c01f6fffbff19011c000b00f600 Raw gyro: 01fe4b001100d30054000700c3004300efffeb00 Raw gyro: 01ff1f00d0ff1701fbffe8ff1b01e3ffffff1101 Raw gyro: 0201214b014bec4ad04aba4acb4abe4aba4abd4a Raw gyro: 0103efffecfffc00e3fff3fff300defff3fffc00 Raw gyro: 0104e3fff0fff400e6ffefff0301dbffe9ff0c01 Raw gyro: 0105e3fff0ff0301e6ffe6fffc00dcffecfffc00 Raw gyro: 0106dffff0fff700dbffeefff600d6fff0fff400 Raw gyro: 0107dfffecffff00e1fff0ff0301defff3fffc00
至於解析陀螺儀的資料,就有點難了。但我的想法是解析該資料包的想法應該以與心臟資料類似的方式相似,以我的裝置為例,我對每個陀螺軸進行3次測量,這些測量值都是被簽名過的。
程式碼下載
你可以像在Github 上找到測試程式碼,其中還有使用示例。