tft每日頭條

 > 圖文

 > 小米手環2連上手機不能使用

小米手環2連上手機不能使用

圖文 更新时间:2025-02-02 21:09:31

本文筆者翻譯自hacker博客,原文地址(略)

小米手環2連上手機不能使用(小米手環2傳輸協議被破解)1

這個故事源于我在Facebook一個帖子,帖子中讨論了運動健身追蹤器都缺乏API接口的問題,還有為啥不用它幫助數據專家為做一個炫酷的東西。

帖子發出之後,我的好基友Volodymyr Shymanskyy就響應來幫助我,并在github上找了Leo Soares項目,為我的健身追蹤器小米手環2找了一些代碼。他嘗試運行它,但是連接出現了一些鍊接問題,所以他花了幾個小時修複了他。之後,他提交了個commit,并給了我鍊接。

那滿足了我的初步需求,已經相當OK了。那代碼可以連接到手環,發布通知,并獲取一次拍攝心髒測量。但這對我來說還有點不夠,因為我想從傳感器獲得實時原始數據,以便在我的數據科學實驗中使用(想要做一個健身運動預測器)。

正文才開始......

在此之前,我沒有任何使用藍牙設備的經驗,所以首先我試着了解了所有這些東西是如何組織和工作的。事實證明,也沒啥難得。

每個藍牙設備都會啟動幾個的服務,每個服務都有特征,并且一些特征具有描述符(如果特征有多個參數或工作類型(閱讀|通知))。某些特性隻有讀/寫訪問權限,比如當前時間,電池狀态或修訂信息。其中一些更複雜并且通過請求/通知循環工作,例如實時心率監視器和授權。基本上,你需要知道這一切的,才能開始使用它。

您還需要兩個應用程序來幫助調試藍牙設備:Wireshark和BLE debugger。你還需要需要訪問安卓手機開發者選項(對不起,對于iOS家夥我還不知道如何做到這點)。

首先,您需要從手機應用程序中取消小米手環2的配對。

現在讓我們看看手環有什麼服務和特征。讓我們打開BLE debugger,開始掃描,你會看到類似這樣的東西:

小米手環2連上手機不能使用(小米手環2傳輸協議被破解)2

将設備的MAC地址保存下,後續操作會用到它。

現在讓我們連接上它,看看它跑了什麼服務和特征。

小米手環2連上手機不能使用(小米手環2傳輸協議被破解)3

以上兩個簡單的操作中,我們已經獲得了一些有用的設備信息。

另一種方法是使用控制台工具hcitool和gatttool。

Scan:

sudo hcitool lescan

連接并獲取服務和描述符:

sudo gatttool -b YOUR_MAC -I -t random

> connect

> primary

> Char-Desc

在某些情況下,BLE棧可能會出現故障,您可以打開/關閉藍牙或運行以下命令:

sudo hciconfig hci0 reset

數據嗅探

為了我們的手機<->基帶通信中嗅探數據,我們需要啟用藍牙在開發設置記錄日志。要做到這一點,您需要先打開安卓手機上的開發人員設置。

以下是操作的詳細步驟:

在Android 4.1及更低版本上,開發者選項屏幕默認可用。在Android 4.2及更高版本中,您必須按如下所示啟用此屏幕:

1.打開手機設置

2.(僅适用于Android 8.0或更高版本)選擇系統

3.滾動到底部并選擇關于手機

4.滾動到底部并點擊Build number 7次。

5.返回到上一屏幕以查找底部附近的開發人員選項

現在打開開發設置并找到"啟用Bleutooth HCI snoop log"并啟用它。這樣,所有藍牙通信都會被被記錄。然後你需要找到名為btsnoop_hci.log的文件(在我手機中(Android 7.0)它位于/mtklog/btlog/btsnoop_hci.log)

認證

現在我們還要要執行一下步驟來獲取有關認證(配對)如何工作的一些信息。

1.打開藍牙和HCI日志。

2.将您的設備與小米安卓程序配對。

3.關閉藍牙。

4. 下載btsnoop_hci.log到你的電腦。

5.用Wireshark打開它。

6.找到第一個處理0x0055的ATT協議請求

你會看到如圖的界面:

小米手環2連上手機不能使用(小米手環2傳輸協議被破解)4

這是驗證步驟:

配對設備

主要服務UUID

0000fee1-0000&ndash;1000&ndash;8000&ndash;00805f9b34fb

認證特征 (Char) UUID

00000009&ndash;0000&ndash;3512&ndash;2118&ndash;0009af100700

通知描述符 (Des) 處理

0x2902 (所有的過程都一樣)

1.通過向Des發送2個字節請求 \x01\x00來設置auth通知(以獲得響應)。

2.用命令将16字節的加密密鑰發送給Char,并附加2字節\x01\x00 KEY

3.通過發送2個字節\x02\x00到Char來向設備請求帶有命令的随機密鑰。

4.從設備響應中獲取随機密鑰(最後的16個字節)。

5.使用我們的16字節密鑰,用AES/ECB/ NoPadding(來自Crypto.Cipher import AES)對此随機數進行加密,并将其發送回Char(\x03\x00 編碼數據

認證

1.通過發送2個字節\x02 \x00到Char來向設備請求帶有命令的随機密鑰。

2.從設備響應中獲取随機密鑰(最後16個字節)。

3.使用我們的16字節密鑰和使用AES / ECB / NoPadding(來自Crypto.Cipher import AES)對此随機數進行加密,并将其發送回Char(\ x03 \ x00 編碼數據)

實時數據

這在認證過程中稍微複雜一些,因為我沒有看到在這個過程中犯了一個錯誤:)并且因為這個心率監視器在15秒後關閉。

硬件服務(HRDW)UUID

0000fee0-0000-1000-8000-00805f9b34fb

心髒監護儀服務(HMS)UUID

0000180d-0000-1000-8000-00805f9b34fb

心率測量特征(HRM)UUID

00002a37-0000-1000-8000-00805f9b34fb

心髒監護儀控制特性(HMC)UUID

00002a39-0000-1000-8000-00805f9b34fb

傳感器特性(SENS)UUID

00000001-0000-3512-2118-0009af100700

通知描述符(DES)句柄

0x2902(所有過程都一樣)

1.關閉當前監聽的測量。

2. 通過向HMC發送請求\x15\x02\x00進行一次性測量。

3. 通過向HMC發送請求\x15\x01\x00進行連續測量。

4.通過向SENS發送命令到\x01\x03\x19來啟用陀螺儀和心髒原始數據

5.通過向HRM寫入DES \x01\ x00啟用通知

6.通過向HMC發送請求\x15\x01\x01來啟動連續的心髒測量

7.發送命令到SENS \x02(不知道為什麼需要這指令)

8.然後,在每12秒收到一次通知時,需要将\x16 ping發送到HCM

解析數據

這是最枯燥部分,因為基本上你需要找出如何解包來自設備的打包數據。

它的一部分可以從日志中解析出來,有些不能。

小米手環2連上手機不能使用(小米手環2傳輸協議被破解)5

這是當前時間的設備的響應

找到合适的數據包和編碼可能需要一些時間。就我的例子而言,我需要找到相鄰的數據包中相似的字節出現次數,有些重複的數據包。

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個字節的無符号短數據解壓縮,那麼我們可以得到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次測量,數據包長度為20個字節。因此,12 x,y,z測量不會覆蓋所有包,但3将會保留前2個字節(與之前的包相同)。所以我這樣試了,過不然工作是正常的。

代碼

代碼,你可以找到我的github倉庫(creotiv/MiBand2)下載案例的代碼。這很簡單,老司機自己去搜索好了,在此就不多贅述。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关圖文资讯推荐

热门圖文资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved