JiaoXianjun/BTLE
GitHub: JiaoXianjun/BTLE
BTLE 是一款基于软件定义无线电的蓝牙低功耗数据包嗅探与发射工具,用于 BLE 安全测试和协议开发。
Stars: 894 | Forks: 165
# BTLE 相关
BTLE 是一款免费开源的蓝牙低功耗(BLE)软件定义无线电软件套件,并包含[开放 BTLE 芯片设计](https://github.com/JiaoXianjun/BTLE/tree/master/open_btle_baseband_chip)。
它包括:
* BTLE 基带 [算法描述、Python 和 Verilog 实现、FPGA 与 SkyWater 130 PDK(OpenLane2 工作流)结果](https://github.com/JiaoXianjun/BTLE/tree/master/open_btle_baseband_chip)。
* 模拟器件 AD9361 + Xilinx Zynq FPGA 实现:[FPGA 蓝牙](https://github.com/JiaoXianjun/BTLE/tree/master/fpga)
* **btle_rx** - BLE 嗅探器。除了监听广播/固定信道外,它还能跟踪通信链路的跳频。
* **btle_tx** - 通用 BLE 数据包发送器。除了支持 BLE 标准外,它还支持原始比特模式以生成任意 GFSK 数据包。这样,您可以在芯片上市前测试非标准协议或正在讨论中的标准。
## 功能特性
* 物理层(PHY)和上层以软件(C 语言)实现。具备完全的软件定义无线电灵活性。
* BLE 标准 1Mbps GFSK PHY。
* 支持 Core_V4.0(第 2&3 章,PartB,Volume 6)中所有 ADV 和 DATA 信道的链路层数据包格式。
* 嗅探器能够自动解析和跟踪跳频模式,不限于广播信道或固定信道。
## 硬件支持
* [HackRF](https://github.com/mossmann/hackrf)
* [bladeRF](https://github.com/Nuand/bladeRF)
* [兼容版本的 HackRF 和 bladeRF 库](compatible_hackrf_bladerf_lib.txt)
## 构建与快速测试
运行本项目前,请确保您的 SDR 硬件环境(驱动/库)已正确设置。
```
git clone https://github.com/JiaoXianjun/BTLE.git
cd BTLE/host
mkdir build
cd build
cmake ../ (default. for HackRF)
cmake ../ -DUSE_BLADERF=1 (only for bladeRF)
make
./btle-tools/src/btle_rx
```
以上命令在信道 37 上进行嗅探。如果周围有 BLE 设备(手机/平板/笔记本电脑),您应该会在屏幕上看到许多数据包。
```
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r500
```
以上命令在 ADV 信道上发送发现数据包。您应该会在另一个 BLE 嗅探器应用(例如 LightBlue)中看到一个名为 "SDR/Bluetooth/Low/Energy" 的设备。
**为了在 HACKRF 上获得更快的操作序列**,请使用以下方法:
```
#define TRANSFER_COUNT 4
#define TRANSFER_BUFFER_SIZE 4096
```
在 hackrf/host/libhackrf/src/hackrf.c 中。然后重新编译 HACKRF 库并重新安装。别忘了重新编译 BTLE 以应用 HACKRF 库的更改。
**除了这些工具,[matlab](matlab) 目录包含算法评估和其他有用的脚本**
## btle_rx 用法
```
-h --help
```
打印所有参数/用法。
```
-c --chan
```
信道编号。默认值 37(ADV 信道之一)。有效值 0~39(所有 ADV 和 DATA 信道)。
```
-g --gain
```
接收增益,单位 dB。HACKRF rxvga 默认 6,有效范围 0 - 62。bladeRF 默认为最大接收增益 66dB(有效范围 0 - 66)。应非常仔细地调整增益,以确保在您的环境下获得最佳性能。建议从低增益开始测试,因为高增益通常会导致严重失真,使您一无所获。
```
-l --lnaGain
```
LNA 增益,单位 dB(仅 HackRF)。默认 32,有效范围 0 - 40。应非常仔细地调整增益,以确保在您的环境下获得最佳性能。
```
-b --amp
```
启用放大器(仅 HackRF)。默认关闭。
```
-a --access
```
接入地址。默认 8e89bed6,用于 ADV 信道 37、38、39。您应根据捕获的连接建立过程为数据信道指定正确的值。
```
-k --crcinit
```
默认 555555 用于 ADV 信道。您应根据捕获的连接建立过程为数据信道指定正确的值。
```
-v --verbose
```
详细模式。出现错误时打印更多信息。
```
-r --raw
```
原始模式。检测到接入地址后,打印接下来的原始 42 字节(不解扰,不解析)。
```
-f --freq_hz (need argument)
```
此频率(Hz)将覆盖信道设置(如果有人想在 BTLE 之外的频率上工作。更通用的用途)。
```
-m --access_mask (need argument)
```
如果此掩码中的某位为 1,则接入地址中的相应位将被纳入数据包存在决策(如果有人想用更短/更稀疏的唯一字进行数据包检测。更通用的用途)。
```
-o --hop
```
这将在 ADV 信道上捕获到 ADV_CONNECT_REQ 数据包中的链路建立信息后,开启数据信道跟踪(跳频)。
```
-s --filename
```
将数据包存储到 pcap 文件中。
## btle_tx 用法
```
btle_tx packet1 packet2 ... packetX ... rN
```
或
```
btle_tx packets.txt
```
packets.txt 是一个文本文件,包含命令行参数(packet1 packet2 ... rN)的文本。一个参数占一行。以 "#" 开头的行被视为注释。参见 [packets.txt 示例](host/btle-tools/src/packets.txt)。
```
packetX
```
是描述一个数据包的字符串。所有数据包组成一个数据包序列。
```
rN
```
表示该序列将被重复 N 次。如果未指定,序列将只发送一次。
packetX 字符串格式
```
channel_number-packet_type-field-value-field-value-...-Space-value
```
每个描述符字符串以 BTLE 信道编号(0~39)开头,后跟 packet_type(RAW/iBeacon/ADV_IND/ADV_DIRECT_IND 等。所有格式示例见 [**附录**](#appendix-packet-descriptor-examples-of-btle_tx-for-all-formats)),然后是特定于 packet_type 的字段-值对,最后是空格-值对(可选),其中的值指定在发送此数据包后等待多少毫秒。
**不要**在命令行数据包描述符中使用空格字符 " "。您**可以**在 txt 文件的数据包描述符中使用空格。
**不要**在每个字段内部使用 "-"。 "-" 是用于分隔数据包描述符中不同字段的特殊字符。
* **btle_tx 示例:[发现数据包](host/btle-tools/src/packets_discovery.txt)**
运行此命令前,请在您的 iPhone/设备上打开 LightBlue 应用(或其他 BLE 嗅探器):
```
./btle-tools/src/btle_tx ../btle-tools/src/packets_discovery.txt
```
您将在 LightBlue 应用中看到一个名为 "SDR Bluetooth Low Energy" 的设备。
对应的命令行:
```
./btle-tools/src/btle_tx 37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-LOCAL_NAME09-SDR/Bluetooth/Low/Energy r40
```
注意:因为命令行不支持空格 " ",所以空格 " " 被替换为 "/"。
* **btle_tx 示例:[连接建立](doc/TI-BLE-INTRODUCTION.pdf)**
```
btle_tx 37-ADV_IND-TxAdd-0-RxAdd-0-AdvA-90D7EBB19299-AdvData-0201050702031802180418-Space-1 37-CONNECT_REQ-TxAdd-0-RxAdd-0-InitA-001830EA965F-AdvA-90D7EBB19299-AA-60850A1B-CRCInit-A77B22-WinSize-02-WinOffset-000F-Interval-0050-Latency-0000-Timeout-07D0-ChM-1FFFFFFFFF-Hop-9-SCA-5-Space-1 9-LL_DATA-AA-60850A1B-LLID-1-NESN-0-SN-0-MD-0-DATA-XX-CRCInit-A77B22-Space-1
```
以上模拟了设备 1 和设备 2 之间的连接建立过程。对应的描述符文件 [BTLE/host/btle-tools/src/packets.txt](host/btle-tools/src/packets.txt)。
第 1 个数据包 —— 设备 1 在信道 37 上发送 ADV_IND 数据包。
第 2 个数据包 —— 设备 2(处于扫描状态)接收到设备 1 的 ADV 数据包后,向设备 1 发送 CONNECT_REQ 数据包以请求建立连接。在此请求数据包中,包含设备 2 的 MAC 地址(InitA)、目标 MAC 地址(设备 1 的 MAC 地址 AdvA)、将在后续数据信道发送中使用的接入地址(AA)、设备 1 后续发送数据包的 CRC 初始值、设备 1 使用的数据信道跳频信息(ChM 和 Hop)等。
第 3 个数据包 —— 设备 1 根据从设备 2 收到的连接请求信息,在信道 9(由跳频方案决定)上发送一个空的链路层数据 PDU。(字段 "DATA" 后的 "XX" 表示该字段无数据)。
数据包之间的间隔为 1 秒(1000ms)。将 TI 的数据包嗅探器调至信道 37,然后上述建立过程将被捕获。
* **btle_tx 示例:[iBeacon](doc/ibeacon.pdf)**
```
./btle-tools/src/btle_tx 37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100 r100
```
以上命令发送 iBeacon 数据包,并以 100ms 的时间间隔重复 100 次。对应的描述符文件 [BTLE/host/btle-tools/src/packets_ibeacon.txt](host/btle-tools/src/packets_ibeacon.txt)。您可以使用 BLE 嗅探器适配器查看该数据包。
数据包描述符字符串:
```
37-iBeacon-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5-Space-100
```
```
37
```
信道 37(BTLE 广播信道 37、38、39 之一)
```
iBeacon
```
表示 iBeacon 格式的数据包格式关键字。(实际上是 Core_V4.0.pdf 中的 ADV_IND 格式)
```
AdvA
```
广播地址(MAC 地址),设置为 010203040506(参见 Core_V4.0.pdf)
```
UUID
```
此处我们指定为 Estimote 的固定 UUID:B9407F30F5F8466EAFF925556B57FE6D
```
Major
```
iBeacon 格式的主编号。(此处为 0008)
```
Minor
```
iBeacon 格式的次编号。(此处为 0009)
```
Txpower
```
iBeacon 格式的发射功率参数(此处为 C5)
```
Space
```
在此数据包发送后将等待多少毫秒。(此处为 100ms)
## 演示
在此处查看与 TI 数据包嗅探器的对比:[http://sdr-x.github.io/BTLE-SNIFFER/](http://sdr-x.github.io/BTLE-SNIFFER/)
查看 btle_rx 视频演示 或 btle_rx 视频演示(国内)以及 btle_tx 视频演示 1 或 btle_tx 视频演示 2(国内)
# 附录:btle_tx 所有格式的数据包描述符示例
RAW 数据包:(所有比特将直接发送到 GFSK 调制器)
```
37-RAW-aad6be898e8dc3ce338c4cb1207730144f9474e0e15eedb378c3bc
```
广播信道数据包(以信道 37 为例):
```
37-IBEACON-AdvA-010203040506-UUID-B9407F30F5F8466EAFF925556B57FE6D-Major-0008-Minor-0009-TxPower-C5
37-ADV_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-ADV_DIRECT_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-InitA-0708090A0B0C
37-ADV_NONCONN_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-ADV_SCAN_IND-TxAdd-1-RxAdd-0-AdvA-010203040506-AdvData-00112233445566778899AABBCCDDEEFF
37-SCAN_REQ-TxAdd-1-RxAdd-0-ScanA-010203040506-AdvA-0708090A0B0C
37-SCAN_RSP-TxAdd-1-RxAdd-0-AdvA-010203040506-ScanRspData-00112233445566778899AABBCCDDEEFF
37-CONNECT_REQ-TxAdd-1-RxAdd-0-InitA-010203040506-AdvA-0708090A0B0C-AA-01020304-CRCInit-050607-WinSize-08-WinOffset-090A-Interval-0B0C-Latency-0D0E-Timeout-0F00-ChM-0102030405-Hop-3-SCA-4
```
数据信道数据包(以信道 9 为例):
```
9-LL_DATA-AA-60850A1B-LLID-1-NESN-0-SN-0-MD-0-DATA-XX-CRCInit-A77B22
9-LL_CONNECTION_UPDATE_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-WinSize-02-WinOffset-0e0F-Interval-0450-Latency-0607-Timeout-07D0-Instant-eeff-CRCInit-A77B22
9-LL_CHANNEL_MAP_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ChM-1FFFFFFFFF-Instant-0201-CRCInit-A77B22
9-LL_TERMINATE_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ErrorCode-12-CRCInit-A77B22
9-LL_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-Rand-0102030405060708-EDIV-090A-SKDm-0102030405060708-IVm-090A0B0C-CRCInit-A77B22
9-LL_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-SKDs-0102030405060708-IVs-01020304-CRCInit-A77B22
9-LL_START_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_START_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_UNKNOWN_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-UnknownType-01-CRCInit-A77B22
9-LL_FEATURE_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-FeatureSet-0102030405060708-CRCInit-A77B22
9-LL_FEATURE_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-FeatureSet-0102030405060708-CRCInit-A77B22
9-LL_PAUSE_ENC_REQ-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_PAUSE_ENC_RSP-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-CRCInit-A77B22
9-LL_VERSION_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-VersNr-01-CompId-0203-SubVersNr-0405-CRCInit-A77B22
9-LL_REJECT_IND-AA-60850A1B-LLID-3-NESN-0-SN-0-MD-0-ErrorCode-00-CRCInit-A77B22
```
发现数据包:(可在扫描应用中显示任何名称或服务,例如 LightBlue):
```
37-DISCOVERY-TxAdd-1-RxAdd-0-AdvA-010203040506-FLAGS-02-LOCAL_NAME09-CA-TXPOWER-03-SERVICE03-180D1810-SERVICE_DATA-180D40-MANUF_DATA-0001FF-CONN_INTERVAL-0006 (-SERVICE_SOLI14-1811)
FLAGS: 0x01 LE Limited Discoverable Mode; 0x02 LE General Discoverable Mode
SERVICE:
0x02 16-bit Service UUIDs More 16-bit UUIDs available
0x03 16-bit Service UUIDs Complete list of 16-bit UUIDs available
0x04 32-bit Service UUIDs More 3a2-bit UUIDs available
0x05 32-bit Service UUIDs Complete list of 32-bit UUIDs available
0x06 128-bit Service UUIDs More 128-bit UUIDs available
0x07 128-bit Service UUIDs Complete list of 128-bit UUIDs available
```
标签:bladeRF支持, BLE标准协议, C语言编程, DNS解析, FPGA实现, GFSK调制, HackRF支持, Verilog硬件描述语言, 代码生成, 信道跳频跟踪, 协议分析, 基带算法, 开源项目, 数据包发射, 无线安全测试, 无线电安全, 无线通信, 权限提升, 渗透测试工具, 物理层实现, 物联网安全, 硬件设计, 芯片设计开放, 蓝牙低功耗, 软件定义无线电, 逆向工具, 链路层协议, 防御绕过