Jeija/bluefluff
GitHub: Jeija/bluefluff
逆向工程Furby Connect智能玩具的蓝牙协议和更新格式,提供远程控制工具和完整技术文档。
Stars: 563 | Forks: 94
## 观看关于此项目的 [YouTube 视频](https://www.youtube.com/watch?v=FkblA_CxHgU)
# 你做了什么?
首先声明:我的 Furby Connect "Dee-Koh" 是安全的,在此过程中并未受到伤害。执行此类 hack **无需物理接触** Furby。本项目旨在逆向工程 / "hack" Furby Connect 的 Bluetooth Low Energy 协议、图形和音频格式,并最终找到在 Furby 上执行自定义代码的方法。
#### 目前我已实现的目标
* 理解了 Furby BLE 通信协议的大部分内容
* 在 Furby 的 LCD 眼睛中打开了一个秘密调试菜单
* 控制 Furby 的动作、天线颜色和 LCD 背光
* 通过设置饥饿度、疲劳度、健康度等等级来控制 Furby 的情绪
* 获取 Furby 传感器状态信息,包括天线摇杆、挠痒 / 抚摸传感器和加速度计
* 使用 Hasbro 的官方更新 "DLC" 文件或我修改过的版本更新 Furby
* 将我自己的音频内容插入到 DLC 文件中
#### 我尚未尝试的内容
* 在 Furby Connect 上获取代码执行权限
* 控制 Furby LCD 眼睛的内容。我知道这是可能的,并且在技术上应该很容易实现,但我还没能成功调出我自己的 LCD 动画。
* 利用 Furby 的睡眠面罩连接器注入自定义代码、LCD 图形或音频文件
# 为什么任何理智的人会这么做?
* 回答关于 Furby 生命的深层问题
* 因为我可以
* Furby Connect 太酷了,技术太先进了,不仅仅是一个儿童玩具
* 为想要在指定用例之外使用 Furby 的开发者和艺术家铺平道路。我想象过类似 IoT 版本的东西,可以管理你的照明和室温。有人感兴趣吗?
# 项目描述
## 免责声明
**此信息仅用于教育目的。使用所提供的数据,您同意独自承担损坏硬件的风险。以非授权方式与 Furby 交互可能会导致设备变砖,应用这些知识几乎肯定会使您的保修失效。详情请参阅 LICENSE.md。**
## 概述
Furby Connect 包含两个(或更多)微控制器,一个来自 **GeneralPlus**,似乎负责控制运动、LCD 眼睛和语音;另一个来自 **Nordic** Semiconductor,负责所有的 Bluetooth Low Energy(也称为 Bluetooth Smart)通信。我不确切知道是哪些型号,因为我不忍心拆开一个(而且它们也有点贵),但我假设里面有一个 GPL16XXXX 系列处理器。
Furby 可以使用独立控制进行交互,也可以在连接到 Android / iOS 应用 "Furby Connect World" 时进行交互,该应用完全控制 Furby 的运动和语音,并发送它从 Hasbro 在 Amazon AWS 的服务器上获取的更新。
本项目主要包括 Furby 协议的文档、其特性、琐事以及一些在破解 Furby 秘密时可能会派上用场的软件工具。在 `sleepmask` 目录中还有一个 Furby 睡眠面罩内部的 KiCad 原理图,后续可能会有更多原理图。但是,完全逆向工程 Furby 的所有电子元件并不是本项目的目标。
## 文档
本项目包含 Furby Connect 不同元素的逆向工程文档:
* [**Furby 的 Bluetooth**](doc/bluetooth.md):Furby Connect 使用 Bluetooth Low Energy 向 Furby Connect World 应用传输命令、传感器数据和更新。
* [**GeneralPlus bluetooth 命令 / 响应**](doc/generalplus.md):让 Furby 说话和做事、改变其天线颜色或情绪的命令,以及对这些命令的响应和传感器数据报告。
* [**动作序列**](doc/actions.md):关于动作的信息以及 Furby 数千种不同动作的有组织列表(目前尚不完整)。
* [**Nordic Bluetooth 命令 / 响应**](doc/nordic.md):Nordic Semiconductor 微处理器的命令和响应列表
* [**应用更新机制**](doc/connectworld.md):Android / iOS 应用在后台为 Furby 下载视频和更新。我捕获了应用的网络流量并进行了分析。
* [**名字**](doc/names.md):Furby 129 个可能名字的列表。
* [**DLC 文件**](doc/dlcformat.md):关于 Furby Connect 更新包及其内容(包含 LCD 动画和音频)的一些信息。
* [**如何刷入自己的 DLC**](doc/flashdlc.md):如何为 Furby 创建和刷入自己的更新
* [**在容器中运行 bluefluff**](doc/docker.md):在隔离的 docker 容器中运行此项目的快速简便方法,_无需_ 安装任何本地依赖项
## fluffd 和 fluffd-client
"fluffd" 的存在是为了让您更轻松地从 Linux、macOS、FreeBSD 或 Windows 计算机通过 BLE 与 Furby Connect 进行交互和控制。得益于其客户端-服务器模型,它也可以轻松地在像 Raspberry Pi 这样的设备上使用。fluffd 需要内置的 Bluetooth Low Energy(例如 Raspberry Pi 3 中集成的)或 USB Bluetooth 4.0(或更高版本)适配器。
"fluffd" 基于 [node.js](https://nodejs.org) 并在后台使用 [noble](https://github.com/sandeepmistry/noble)。您需要 **node.js 7.0 或更高版本** 才能运行 fluffd。
### 在 Linux 上安装
* 确保您已安装 [node.js](https://nodejs.org)
* 克隆此仓库并在命令行中导航到 `fluffd` 目录
* 确保您已安装 `udev` 开发文件。在基于 Debian 的发行版中,使用 `apt install libudev-dev` 以 root 身份 / 使用 sudo 安装 `libudev-dev`。
* 执行 `npm install` 以下载并安装所有依赖项
* 如果您不想以 root 身份 / 使用 sudo 运行 fluffd,请参阅 [noble 文档](https://github.com/sandeepmistry/noble#running-on-linux) 了解详情
### 在 macOS 上安装
* 确保您已安装 [node.js](https://nodejs.org)
* 克隆此仓库并在命令行中导航到 `fluffd` 目录
* 执行 `npm install` 以下载并安装所有依赖项
* 执行 `npm install xpc-connection` 以安装 node.js 的 XPC Connection 绑定。XPC 是 macOS 特有的,因此在其他平台上不需要。
### 启动 fluffd
确保蓝牙已启用且未被阻止,并且操作系统的蓝牙守护进程(例如 Linux 上的 BlueZ)正在运行。
在大多数 Linux 发行版上,您可以通过执行以下命令来实现这一点
```
rfkill unblock bluetooth
systemctl start bluetooth
```
使用以下命令启动 fluffd
```
node fluffd.js
```
这将扫描广播为 "Furby" 的设备并连接到它们。然后您可以使用 fluffd-client 或 fluffd 的 HTTP API 进行控制。
如果您只想查看 Furby 通过其 BLE GATT 层次结构公开的服务和特征,可以使用
```
node fluffd.js introspect
```
### 使用 fluffd-client 发送命令
fluffd exposes a simple HTTP API for sending commands on port 3872. You can now open `fluffd-client/index.html` in your favorite web browser to take control of Furby Connect. Most menu items should be self-explanatory. See [the DLC flashing documentation](doc/flashdlc.md) for information on DLC-related commands.
## 琐事
### Furby 的情绪
Furby 的情绪状态可以定义为以下属性的向量:
* Wellness (健康度)
* Fullness (饱腹感)
* Displeasedness (不悦度)
* Tiredness (疲劳度)
* Excitedness (兴奋度)
其中每个值都是 0 到 100 之间的整数。例如,当通过轻拍 Furby 的舌头喂食时,他的 Fullness 会增加 5,该值会随时间自动衰减。
### 个性
在我的探索过程中,我发现了以下 Furby Connect 个性的明确引用:
* DJ
* Princess (公主)
* Ninja (忍者)
* Pirate (海盗)
* Popstar (流行歌星)
* Cat (猫)
然而,由于这些个性似乎都无法通过以不同方式对待 Furby 来开放访问(就像 2012 版的 Furbies 那样),看起来它们会在稍后添加。
我的推测是 Hasbro 可能想为 Furby Connect 出售 "面具"。比喻上来说,"戴上面具" 意味着 "改变你的个性",这非常有道理。此外,我在应用中发现了对 "Mask" 的引用,这似乎不是睡眠面罩。最重要的是,在解剖睡眠面罩时,我发现了一个 PCB,上面有 [SO-8 IC 的空间](img/mask_front.png)(可能是 SPI EEPROM?)和 [背面的测试点](img/mask_back.png)。
### Furby 并不是真的在睡觉
入睡后,Furby 将继续广播他的 BLE 连接。这意味着即使戴着睡眠面罩,您也可以唤醒 Furby,或者在他看起来睡着时向他发送更新。只有在断开与应用的连接并睡眠几分钟后,他才会真正关机,但通过保持 BLE 连接,您也可以让他保持清醒直到电池耗尽。
### 缺失的名字
即使在 Furby Connect World 应用中列出了该名字,即使它应该存在于常规的可能的两个音节 Furby 名字模式中,您也不能将您的 Furby Connect 命名为 "Tay-Tah"。
### 应用程序
* 开发者对应用的代号似乎是 "fluff",他们对 Furby 和应用之间交互的称呼似乎是 "phygital"
* 该应用由 Exient(制作 Angry Birds Go! 和 bunch of other mobile games 的同一批人)使用其专有的 "XGS" 技术编写
* 开发者在编写像 "CAnalyticsManager::ReceiveFurbyFriendshipFromPooping(int)" 这样的函数时,肯定对自己的人生选择产生了严重的质疑
# 贡献
## 如何收集更多信息
以下是您可以尝试获取更多关于 Furby 内部工作细节的方法列表:
* [在 Android 设备上嗅探蓝牙流量](http://stackoverflow.com/questions/23877761/sniffing-logging-your-own-android-bluetooth-traffic)(或 iOS 设备)并使用 Wireshark 进行分析
* 使用 [mitmproxy](https://mitmproxy.org/) 拦截应用与其服务器的通信(详见 [应用更新机制]((doc/connectworld.md))
* 修改并刷入自定义 DLC 文件以了解其内容的含义
* 逆向工程 GeneralPlus A1800 编解码器,例如通过转换不同的样本文件(静音、正弦波……)并比较它们的输出
* 测量 Furby 冠部开口中的信号并理解其含义
* 找出 Furby 到底使用的是哪些微控制器。这可能意味着要拆开一个才能确定 :(
## TODO 列表
如果您有以下(或不同)主题的任何信息,我非常有兴趣听取您的意见:
* DLC 文件是如何结构的?我们如何控制 Furby 在其动作序列期间的运动?
* A1800 编解码器实际上是如何工作的?它似乎使用了一些 FFT 处理,但傅里叶系数是如何存储的?
* 理解更多的 Bluetooth 命令和响应及其所有参数
* 完整的动作序列列表。我特别对触发 "Too Hot Chili LCD" 动画的动作感兴趣,因为该动画是 DLC 文件的一部分。
* 睡眠面罩端口是做什么用的?我们可以从该端口中的 ROM 芯片执行代码吗?
* Furby Connect 上是否有固件更新功能,我们如何利用它来执行自己的代码?
标签:BLE, CSV导出, DLC文件修改, Furby Connect, Hasbro, IoT, LCD控制, MITM代理, Python脚本, 二进制分析, 云安全运维, 云资产清单, 代码执行, 传感器数据读取, 协议分析, 固件分析, 嵌入式系统, 智能玩具, 权限提升, 物联网安全, 硬件黑客, 自定义脚本, 蓝牙低能耗, 请求拦截, 调试菜单, 逆向工程, 音频注入, 黑客技术