一個BLE智能手環的分析
首先確定手環的 MAC 地址,使用 APP 進行掃描連接,連接成功就會顯示設備的 MAC 地址:A4:C1:38:6A:1C:BF。

接下來解除綁定,使用 TI 的 packet sniffer 進行藍牙數據包的捕獲,插入 CC2540 后選擇好類型,開始捕獲后再查找手環進行綁定。
因為 BLE 會隨機在 37、38、39 三個信道中選擇一個,而 packet sniffer 只能監聽一個信道,所以可能需要多試幾次才能捕獲到,其中 M->S 表示是手機發送給手環,S->M 是手環發送給手機。

有些可疑的包標記一下,這兩個都包含了當前的步數 100,即 0x64,且都是從手機端發送一個請求之后從手環發回來的。


在捕獲的最后階段,我摁下了幾次查找手環的命令,這應該是查找手環的震動效果。

但是此時通過 gatttool 或者 nRFconnect 進行發送是不成功的,因為手環需要進行綁定才能通信,接下來使用 AndroidKiller 抓取 APP 的日志進行分析,查看 APP 是如何與手環進行通信的。
打開 AndroidKiller 后連接手機,在 Android 中已找到設備中就可以看到手機了,然后點擊日志。

點擊開始進行日志的捕獲。

這里進行 BLE 的連接。

BLE 連接成功,此時雖然連接成功但是仍然沒有綁定設備。

向手環發送了一條指令:430000dc,猜測是用來進行綁定,可以先記錄下來,后邊通過 gatttool 進行驗證。

獲取手環電量指令:27000074

獲取步數、卡路里、距離等指令:2001000070
獲取心率等指令:21010000c6
(這里只是根據值大致推測了一下,并沒有逆向APP查看每個字段的范圍)

獲取體溫數據指令:2c01000078(我還沒測過體溫,所以沒啥數據)

查找手環指令:1008000000000001000000c00000000000000000,效果是三次長時間的震動。

手環還支持將 APP 收到的消息推送到手環上顯示,打開該功能后給手環支持的 APP 發送消息,手環就會顯示收到的消息。

查看一下這個過程的日志,可以發現如下信息:首先是 0a020000020e,告訴手環要推送消息。

然后是發送人的昵稱:test,這里的指令為 0a050001746573743a

這里是發送的消息,1234,指令為 0a05000231323334

最后是指令 0a0100030e 表示消息都發送完了,手環可以顯示了。

除了前后兩條指令,消息部分指令中間一部分可以很明顯知道是 ASCII 的十六進制,但是整條指令的構成需要對 APP 進行逆向分析,通過日志前面的 tag 可以知道這是在 CmdHelper.java 中實現的,使用 jadx 打開 APP,找到CmdHelper,位置在 com->runmifit.android->util->ble->CmdHelper,找到 setMessage2。
可以看到他接收的參數是一個整形一個字符串,根據日志的上下文可以推測是 IntelligentNotificationService傳給他的參數,定位到 com->runmifit.android->sevice->IntelligentNotificationService,發現只有兩個地方調用了 setMessage2,一個傳 1 一個傳 2。

此時再回來看一下 setMessage2 中參數 i 的用途,猜測這個是用來區分是發送人昵稱還是消息的字段。

setMessage2 函數主要作用是構造一個 bArr2 數組給 spliteData 函數,這里主要看以下 bArr2 的構成。

這里的 i2 是之前計算的長度,它加了5個字節作為構造出的指令的長度,bArr2[0] = 10;。
開頭是固定的 0a,然后兩個是用來存放長度+1 的,然后是區分昵稱還是消息的字段,接著把消息拼接上,最后是一個 completeCheckCode,往上面翻一下定位到該函數。

他只是把傳進去的數組挨個遍歷加起來然后乘上 86 再加上 90,得到的結果取末尾一字節,作為一個校驗。因為昵稱和消息內容都是用 setMessage2 函數生成的,所以構成方法一致。
至此,消息指令的構成就分析完了,試著來構造一個消息:sec 發送的 hacked。
sec 的 ascii 碼分別是73 65 63,長度是 3+1=4,計算最后的校驗位 0a+04+01+73+65+63=14A 即十進制的 330,330*86+90=28470,也就是 6F36,取末尾一字節 36。

所以昵稱的指令為:0a04000173656336,同理消息的指令為:0a0700026861636b6564fc
接下來使用 gatttool 進行驗證,需要藍牙適配器支持 ble 通信,使用命令 hciconfig hci0 up 將藍牙適配器激活。

gatttool -I -b A4:C1:38:6A:1C:BF 進入交互模式,其中 -I 表示進入交互模式,-b 指定 MAC 地址,進入后使用 connect 進行連接,輸入 help 可以查看幫助。

輸入 characteristics 查看所有的特征,我們要使用的句柄是 0x11。

首先發送 430000dc 進行綁定,然后就可以發送其他的指令。例如獲取手環步數、查找手環讓手環震動、獲取手環心率等,我們先給手環推送一下之前分析的消息,測試一下判斷的是否正確。

可以看到我們自定義的消息成功被推送到了手環上并顯示出來。
另外既然是通過 BLE 通信的,那么打開消息通知和關閉消息通知肯定也是有對應的指令的,通過 APP 日志也可以找出來。
附:
021000320500010001010001ff000000000000e2 打開消息推送
021000320500010001010000ff0000000000008c 關閉消息推送