Jeija/bluefluff

GitHub: Jeija/bluefluff

逆向工程Furby Connect智能玩具的蓝牙协议和更新格式,提供远程控制工具和完整技术文档。

Stars: 563 | Forks: 94

Furby Connect's Eyes

## 观看关于此项目的 [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-client screenshot

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脚本, 二进制分析, 云安全运维, 云资产清单, 代码执行, 传感器数据读取, 协议分析, 固件分析, 嵌入式系统, 智能玩具, 权限提升, 物联网安全, 硬件黑客, 自定义脚本, 蓝牙低能耗, 请求拦截, 调试菜单, 逆向工程, 音频注入, 黑客技术