SmonSE/GhostBLE
GitHub: SmonSE/GhostBLE
一款运行在 M5Stack Cardputer 上的便携式 BLE 隐私扫描器,可发现附近蓝牙设备并深度分析其隐私暴露状况。
Stars: 0 | Forks: 0
# GhostBLE – BLE 隐私扫描器
GhostBLE 是一款专为 **M5Stack Cardputer** 构建的蓝牙低功耗 (BLE) 隐私扫描器。它能发现附近的 BLE 设备,分析其隐私状况,并标记潜在的安全隐患。非常适合对 BLE 隐私、设备指纹识别和无线侦察感兴趣的**安全研究人员、技术爱好者及教育工作者**使用。
内置显示屏上有一个名为 **Nibbles** 的可爱吉祥物,它会引导您完成扫描过程。
## 功能特性
- **被动 BLE 扫描** – 发现附近的 BLE 设备,显示信号强度 (RSSI) 和估算距离
- **设备信息提取** – 获取本地名称、广播的服务 UUID 和制造商特定数据
- **隐私启发式检测**
- **MAC 轮换检测** – 标记使用可解析私有地址 (RPA) 的设备
- **明文检测** – 标记泄露未加密标识符的设备
- **暴露分析** – 将设备按暴露等级(无、被动、主动、同意)分类,并给出隐私评分
- **GATT 连接尝试** – 可选连接设备并读取标准 BLE 服务(设备信息、电池、心率、温度、通用访问)
- **已知设备检测** – 通过 UUID 识别 Flipper Zero、CatHack/Apple Juice 和 LightBlue 设备
- **制造商识别** – 解码 Apple、Google、Samsung、Epson 等制造商的数据
- **多通道日志记录**
- 串口输出 (115200 波特率)
- SD 卡文件日志 (`/device_info.txt`)
- 通过 WiFi AP 和 WebSocket 实现的基于 Web 的实时日志
- **交互式 UI** – LCD 显示屏上的 Nibbles 吉祥物带有动态表情,会对扫描事件做出反应
## 硬件要求
- **M5Stack Cardputer** (主要目标平台)
- ESP32-S3,内置键盘、1.14 英寸 LCD 显示屏、扬声器和 USB-C
- **必须配备 microSD 卡** – 如果没有插入 SD 卡,设备将在启动时停止运行
## 依赖库
通过 Arduino IDE 库管理器或 PlatformIO 安装以下库:
| 库名 | 用途 |
|---------|---------|
| **M5Cardputer** | M5Stack Cardputer 的硬件抽象层 |
| **M5Unified** | 统一的 M5Stack API |
| **NimBLE-Arduino** | BLE 协议栈 (扫描, GATT 客户端) |
| **ESPAsyncWebServer** | 基于 Web 的日志查看器 |
| **AsyncTCP** | Web 服务器的异步 TCP 传输 |
| **SD** (内置) | SD 卡日志记录 |
| **SPI** (内置) | SPI 通信 |
## 构建与烧录
### Arduino IDE
1. 在 Arduino IDE (开发板管理器) 中安装 **M5Stack 开发板包**
2. 选择开发板:**M5Stack Cardputer**
3. 通过库管理器安装上述列出的库
4. 打开 `GhostBLE.ino`
5. 编译并上传
### 预编译二进制文件
预编译的固件位于 `build/m5stack.esp32.m5stack_cardputer/` 目录中:
- `GhostBLE.ino.merged.bin` – 完整固件镜像 (烧录至偏移量 0x0)
- `GhostBLE.ino.bootloader.bin` – 引导加载程序
- `GhostBLE.ino.partitions.bin` – 分区表
- `GhostBLE.ino.bin` – 应用程序二进制文件
使用 esptool 烧录合并后的二进制文件:
```
esptool.py --chip esp32s3 --port /dev/ttyUSB0 write_flash 0x0 build/m5stack.esp32.m5stack_cardputer/GhostBLE.ino.merged.bin
```
## 使用说明
### 控制方式
| 输入 | 动作 |
|-------|--------|
| **长按 BtnA** (1秒) | 开启/关闭 BLE 扫描 |
| **FN 键** | 开启/关闭 WiFi AP 和 Web 服务器 |
### 工作流程
1. **启动** – 插入 SD 卡并开机。Nibbles 会在显示屏上向您问好
2. **开始扫描** – 长按 BtnA 开始 BLE 扫描
3. **监控** – 观察显示屏上的设备计数,或连接到 Web 界面查看详细日志
4. **Web 界面** – 连接到 WiFi AP `ESP32-Log` (密码: `12345678`),然后在浏览器中打开 `192.168.4.1`
5. **查看日志** – 日志将保存到 SD 卡上的 `/device_info.txt`
### 显示屏
LCD 显示内容包括:
- Nibbles 吉祥物及其随情境变化的表情(扫描时开心,连接失败时难过,激活时很酷)
- 设备计数器:已连接目标、可疑设备、数据泄露设备
- WiFi 状态指示器
## 隐私启发式规则
| 检查项 | 标记 | 含义 |
|-------|------|---------|
| **Rotating (轮换)** | Yes | 设备使用 MAC 地址随机化 (RPA) – 良好的隐私实践 |
| **Cleartext (明文)** | Yes | 设备以明文广播个人信息 – 隐私风险 |
### MAC 地址轮换
- **轮换 (Rotating)**:设备使用定期更改的随机私有地址,防止被持续追踪
- **非轮换 (Not Rotating)**:设备使用静态或固定的 MAC 地址,可随时间被追踪
### 明文数据
- **明文 (Cleartext)**:广播载荷包含未加密的可读数据(设备名称、服务、标识符)
- **非明文 (Not Cleartext)**:广播数据已加密或混淆
### 重要性
- **MAC 地址轮换**有助于防止设备被持续追踪,从而增强隐私
- **明文广播**可能泄露敏感信息和元数据,而**加密/混淆广播**则提高了安全性和用户隐私
## 输出示例
```
MAC: d3:c9:9d:fa:d9:9a | Rotating: Yes | Cleartext: Yes
Trying to connect to address: d3:c9:9d:fa:d9:9a
Attribute discovery failed: d3:c9:9d:fa:d9:9a
Scan Summary:
- Spotted: 4
- Sniffed: 2
- Suspicious: 0
```
## 项目结构
```
GhostBLE/
├── GhostBLE.ino # Main sketch (setup/loop, WiFi, controls)
├── build/ # Pre-compiled binaries
└── src/
├── analyzer/ # Exposure analysis & risk scoring
├── config/ # Hardware config, known device UUIDs
├── GATTServices/ # BLE service readers (battery, device info, etc.)
├── globals/ # Global state variables
├── helper/ # BLE decoder, manufacturer lookup, UI drawing
├── images/ # Embedded sprite assets for Nibbles mascot
├── logger/ # Unified logging (Serial, WebSocket, SD card)
├── models/ # Data structures (DeviceInfo)
├── privacyCheck/ # MAC type detection, cleartext analysis
├── scanner/ # Core BLE scanning and GATT operations
├── sdCard/ # SD card file logging
└── target/ # Target device handling
```
## 贡献
欢迎提交 PR 和建议!这是一个以学习为导向的 BLE 项目,我们非常感谢您的想法。
## 许可证
MIT License
标签:BLE, ESP32-S3, GATT服务, M5Stack Cardputer, MAC地址轮换检测, RPA, SD卡记录, WebSocket, WiFi热点, 依赖分析, 信号强度RSSI, 制造商识别, 客户端加密, 嵌入式安全, 无线侦察, 物联网安全, 硬件黑客, 蓝牙低功耗, 设备指纹识别, 防御绕过, 隐私扫描器