基本流程
- 逆向分析apk
Android 的 API 中通过 BLE 进行属性的写操作方法是 android.bluetooth.BluetoothGatt.writeCharacteristic,通过 writeSettingValue、android.bluetooth.BluetoothGatt 等关键字定位方法
hook写方法,动态分析数据交换
编写可动态观察该方法数据的脚本,通过挂接处理BLE通信的Java方法,分析应用程序与BLE设备之间的数据交换
gatttool工具发送控制数据到设备
实践
逆向分析小程序
e: 要写入的值,这个值通常是一个 ArrayBuffer 类型的数据,通过蓝牙发送给设备。
i: 代表蓝牙设备对象,其中包括 deviceId,用于识别蓝牙设备。
o: 这是服务 ID serviceId,表示蓝牙设备提供的某个服务。
c: 特征值 ID characteristicId,指定要写入数据的特征。
n: 附加的参数对象,可能包含关于数据类型的信息 unitTyp,并且根据类型做不同的处理。
通过蓝牙 (BLE) 写入特征值的函数,它调用 wx.writeBLECharacteristicValue 方法向指定的蓝牙设备发送数据,函数 writeBLECharacteristicValue 负责向蓝牙设备的特定服务 serviceId 和特征 characteristicId 写入一个 value 值
但是由于小程序是 JS 写的,并不能直接 hook。。。
思路
Frida 主要用于 Java 层的 hook 和 Netive 层的 hook,而小程序是用 JS 编写,无法直接进行 hook,但是微信小程序特有的 API 是由WxJsBridge 提供的,且 JsBridge 可以支持 JS 代码调用 Android 的 Java 代码,所以可通过 hook js api 对应的 java 代码可实现微信小程序的 api hook
逆向微信APK
一开始的思路是想着 wx.writeBLECharacteristicValue 在 Java 的 jsapi.bluetooth 包中有相关的代码,然后就通过关键词定位微信Java代码中与小程序 Js api 蓝牙模块对应的包名
"com.tencent.mm.plugin.appbrand.jsapi.bluetooth"
但是这样一个个去分析的话费时费力。。
由于微信小程序的 API 是通过 WxJsBridge 调用到 Java 层对应的 API 实现,所以不如去 hook JsBridge 相关的类,那么这样就可以直接拦截到整个 BLE 通信流量,通过关键词 JsBridge 定位到 AppBrandJsBridgeBinding 这个类,该类用于管理移动应用程序环境中的 JavaScript 运行时及其交互
"com.tencent.mm.appbrand.commonjni.AppBrandJsBridgeBinding"
经分析,nativeInvokeCallbackHandler 函数是桥接本地代码与 JavaScript 环境的重要方法,用于触发回调,将 Java 层的事件或数据传递给 JavaScript 层,简言之该类就是将 Java中 处理后的数据传递到小程序 JS 中,所以直接 hook 动调整个 AppBrandJsBridgeBinding 类
Hook
编写 hook 脚本
# frida -U -p 21807 -l hook.js
达到目的,输出了写入的value数据、设备mac地址、服务及特征值,对应了 js 中wx.writeBLECharacteristicValue 方法传入的参数,那么已经成功截取通信数据
分析value值
继续分析 value 值的处理过程,通过第一个字符串 onBLECharacteristicValueChange 定位到了这四组数据所在包名为 xt0
分析 xt0 包下的类,发现都是用于处理蓝牙模块相关的,发现 m0 类下是处理
往下分析,发现 bu0.m 方法中处理了上述四组数据
分析 bu0.m 方法表示蓝牙写特征写入操作,bu0 类封装了使用 Android 蓝牙 API 将数据写入 BLE 特征所需的详细信息和逻辑,f21302q 表示写入数据的类型,f21303r表示写入的数据,然后将 value 原始数据经过 base64 解码为原始字节,然后又经过了 fu0.b.a 方法的进一步处理,将最终处理的数据写入写特征
分析 fu0.b.a 方法,仅仅处理输入字节数组并确保不为空
使用 base64 在线解密工具,将其解密为原始字节码
最终得到的 CF0000CAC3000000000107 就是原始数据,和 nrf connect 上蓝牙写特征通信数据格式一样,然后就可以利用 gatt 工具将 解密后的 value 值写入设备 BLE 对应的服务及特征中来控制设备。