freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

利用Frida对BLE设备逆向及动调
2024-11-20 17:15:27
所属地 上海

基本流程

  1. 逆向分析apk

Android 的 API 中通过 BLE 进行属性的写操作方法是 android.bluetooth.BluetoothGatt.writeCharacteristic,通过 writeSettingValue、android.bluetooth.BluetoothGatt 等关键字定位方法

  1. hook写方法,动态分析数据交换

编写可动态观察该方法数据的脚本,通过挂接处理BLE通信的Java方法,分析应用程序与BLE设备之间的数据交换

  1. gatttool工具发送控制数据到设备

实践

逆向分析小程序

1732105673_673dd5c9ed171c624e84a.png!small?1732105674926


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"

1732105755_673dd61bc3fc33d85caba.png!small?1732105757060

但是这样一个个去分析的话费时费力。。

由于微信小程序的 API 是通过 WxJsBridge 调用到 Java 层对应的 API 实现,所以不如去 hook JsBridge 相关的类,那么这样就可以直接拦截到整个 BLE 通信流量,通过关键词 JsBridge 定位到 AppBrandJsBridgeBinding 这个类,该类用于管理移动应用程序环境中的 JavaScript 运行时及其交互

"com.tencent.mm.appbrand.commonjni.AppBrandJsBridgeBinding"

1732105824_673dd660011d03e7cd89d.png!small?1732105825178

经分析,nativeInvokeCallbackHandler 函数是桥接本地代码与 JavaScript 环境的重要方法,用于触发回调,将 Java 层的事件或数据传递给 JavaScript 层,简言之该类就是将 Java中 处理后的数据传递到小程序 JS 中,所以直接 hook 动调整个 AppBrandJsBridgeBinding 类

Hook

编写 hook 脚本

1732089258_673d95aa6d4214a7479a7.png!small?1732089258978


# frida -U -p 21807 -l hook.js

1732089683_673d9753ebb62a005189b.jpg!small?1732089684522

达到目的,输出了写入的value数据、设备mac地址、服务及特征值,对应了 js 中wx.writeBLECharacteristicValue 方法传入的参数,那么已经成功截取通信数据

分析value值

继续分析 value 值的处理过程,通过第一个字符串 onBLECharacteristicValueChange 定位到了这四组数据所在包名为 xt0

1732106180_673dd7c49d2178f71d049.png!small?1732106181409

分析 xt0 包下的类,发现都是用于处理蓝牙模块相关的,发现 m0 类下是处理

1732106006_673dd716ddc30a630222c.png!small?1732106010924

往下分析,发现 bu0.m 方法中处理了上述四组数据

1732106076_673dd75c2ea21e06924a6.png!small?1732106077266

分析 bu0.m 方法表示蓝牙写特征写入操作,bu0 类封装了使用 Android 蓝牙 API 将数据写入 BLE 特征所需的详细信息和逻辑,f21302q 表示写入数据的类型,f21303r表示写入的数据,然后将 value 原始数据经过 base64 解码为原始字节,然后又经过了 fu0.b.a 方法的进一步处理,将最终处理的数据写入写特征

1732106122_673dd78a607899f384cd7.png!small?1732106123351

分析 fu0.b.a 方法,仅仅处理输入字节数组并确保不为空

1732106147_673dd7a3e1001882b6d24.png!small?1732106148782

使用 base64 在线解密工具,将其解密为原始字节码

1732090059_673d98cbd4c537bbf5bb8.png!small?1732090060417

最终得到的 CF0000CAC3000000000107 就是原始数据,和 nrf connect 上蓝牙写特征通信数据格式一样,然后就可以利用 gatt 工具将 解密后的 value 值写入设备 BLE 对应的服务及特征中来控制设备。

# 网络安全 # 漏洞分析 # BLE # Frida Hook
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录