deadboy18/Ocrustar-USB-IR
GitHub: deadboy18/Ocrustar-USB-IR
对Ocrustar/ElkSmart USB红外发射器的完整协议逆向工程与开源Python驱动,解决了三个关键编码bug,使设备可脱离官方App独立完成红外信号的学习与发射。
Stars: 0 | Forks: 0
# 逆向工程 Ocrustar USB 红外发射器
**关于 Ocrustar 智能 IR 红外发射器 (VID `045C` / PID `02AA`) 的完整协议分析与开源驱动**
` 的使用是关键的发现,它解释了为什么 Python 的 `heapq` 会生成错误的树。
### 第 3 步:Native 库分析
使用 **Ghidra** 对 `libelksmart.so` / `libkksdk.so`(ARM,32 位)库进行静态分析。识别出的关键函数:
1. **脉冲压缩** — 接收原始 IR 时序数组,并提取两个最频繁的脉冲对作为字典条目进行压缩的函数
2. **LEB128 编码器** — 可变长度整数编码,但带有一个关键的转折点:所有值在编码前都除以 16(这是一个在任何地方都没有记录的预缩放步骤)
3. **Huffman 编码器** — 使用优先级队列构建完整的 Huffman 树,应用于压缩后的脉冲流
4. **字节混淆** — 每个协议字节在传输前都会进行位反转和取反操作
5. **校验和** — 按 62 字节帧应用的特定校验和算法
Kookong SDK 的 native 库(`libkksdk.so`)还包含用于 API 负载加密的 16 字节加密密钥 `Kf9j8Si15EKM9h4u`,尽管其加密算法本身是自定义的(非标准 AES)。
### 第 4 步:流量捕获与关联
在通过静态分析部分了解协议后,使用了带有 USBPcap 插件(Windows)和 `usbmon`(Linux)的 **Wireshark** 来捕获 USB 流量。通过应用发送已知的 IR 信号(具有可预测位模式的 NEC 协议命令),并将生成的 USB 数据包与预期的编码输出进行关联。
这一步确认了每个编码阶段,并揭示了准确的帧格式,包括频率编码和负载长度字段。
**在 Windows 上设置 USBPcap:**
```
# 从 https://desowin.org/usbpcap/ 安装 USBPcap 并重启
# 识别您的 USB root hub:
USBPcapCMD.exe
# 开始 capture(选择带有 SMART 设备的 hub):
USBPcapCMD.exe -d \\.\USBPcap1 -A -o capture.pcapng
# 在另一个终端中,运行脚本:
python ocrustar.py --send-test
# 使用 Ctrl+C 停止 capture,在 Wireshark 中打开
# 有用的 filters:usb.transfer_type == 3 (bulk), usb.data_len > 0
```
## 协议规范
### USB 传输层
所有通信均使用端点 `0x01`(OUT,主机→设备)和 `0x81`(IN,设备→主机)上的批量传输。最大传输大小为 64 字节。
大型负载被分割成 63 字节的帧:62 字节数据 + 1 字节校验和。最后一个帧可以更短,并且省略校验和。
### 握手序列
每个会话都以三步握手开始:
```
Host → Device: FC FC FC FC (4 bytes: "hello")
Device → Host: FC FC FC FC XX YY (6 bytes: "hello + device type")
Host → Device: FA FA FA FA (4 bytes: "acknowledged")
```
设备响应中的 `XX YY` 字节标识了硬件变体:
| XX | YY | 设备类型 | 编码 |
|---|---|---|---|
| `0x02` | `0xAA` | D226 / D571 | 脉冲压缩 + Huffman |
| `0x70` | `0x01` | D552 | 仅脉冲压缩 |
D226 是较新、更常见的变体。D552 是较旧的版本,跳过了 Huffman 阶段。
**重要提示**:握手必须在约 1 秒内完成。如果设备在 200 毫秒内未响应 `FC FC FC FC`,请最多重试 3 次。在第一次尝试之前刷新 USB 端点可防止过期数据干扰握手。
`FA FA FA FA` 确认是**强制性的**。跳过它(正如某些第三方实现所做的那样)会使设备处于未就绪状态,在此状态下它会接受但忽略传输命令。
### 设备识别
握手响应字节 `XX YY` 对应于 USB PID(`02 AA` → `0x02AA`)。这并非巧合——固件将其自身的 PID 作为身份令牌回显。
如果响应的前 4 个字节是 `FA FA FA FA` 而不是 `FC FC FC FC`,则字节 4–5 包含的是固件版本数据,而不是设备类型。
### IR 传输
握手之后,IR 信号将作为带有固定头部的编码负载发送:
```
FF FF FF FF [freq_hi] [freq_mid] [freq_lo] [len_hi] [len_lo] [payload...]
```
- **`FF FF FF FF`** — 前导码(4 字节)
- **频率** — 3 字节,经混淆处理,编码为 `(carrier_hz + 0x7FFFF)`,按 `[bits 15:8] [bits 23:16] [bits 7:0]` 拆分到各字节中
- **负载长度** — 2 字节,经混淆处理,大端序
- **负载** — 编码后的 IR 信号(见[编码管道](#the-encoding-pipeline))
头部(频率和长度字段)中的每个字节都经过了**混淆**:先位反转,再按位取反。
设备成功时响应 `FF FF FF FF`(将前导码作为 ACK 回显)。
### IR 学习
学习模式用于捕获来自物理遥控器的 IR 信号:
```
Host → Device: FE FE FE FE ("start learning")
Device → Host: FE FE FE FE [len_hi] [len_lo] [raw_data...]
Host → Device: FD FD FD FD ("stop learning")
```
当检测到 IR 信号时,设备会做出响应。`len` 字段指示接下来要接收的原始数据的总字节数。数据可能在多次 USB 传输中到达——持续累积直到收集到 `len` 个字节。
原始数据的解码方式:
1. 对于每个满足 `b < 0xFF` 的字节 `b`:时序值 = `b × 16 + carry`
2. 对于每个满足 `b == 0xFF` 的字节 `b`:累加 `carry += 0xFF0`(4080µs 溢出标记)
这会产生一个以微秒为单位的时序值数组(交替的标记/间隔)。进位机制允许编码大于 4064µs(254 × 16)的值。
### 序列号查询
可以通过以下方式获取设备序列号:
```
Host → Device: FB FB FB FB
Device → Host: FB FB FB FB [serial_data...]
```
如果响应恰好为 15 个字节,则序列号解码为:6 个 ASCII 字符(字节 4–9),随后是 3 个整数值(字节 10–12)、1 个 ASCII 字符(字节 13)和 1 个整数(字节 14),并拼接成一个字符串。
## 编码管道
这是协议的核心,也是大部分逆向工程精力的投入之处。该管道将原始 IR 时序数组(以微秒为单位)转换为设备所期望的压缩负载。
```
Raw timings (µs)
│
▼
┌─────────────────────┐
│ Pulse Compression │ Dictionary encode top-2 pairs ("WAVZip")
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Huffman Encoding │ D226 only (skipped for D552)
└──────────┬──────────┘
│
▼
┌─────────────────────┐
│ Framing + Checksum │ 62-byte chunks, mangled header
└──────────┬──────────┘
│
▼
USB bulk writes (2ms interval)
```
The Ocrustar USB IR Blaster — a $6 dongle that speaks a surprisingly complex protocol
Zadig — select the SMART device and replace the driver with WinUSB
IR LED firing — the purple glow is invisible to the naked eye but shows up on phone cameras
标签:APK反编译, BLE协议, ElkSmart, Huffman编码, Kookong SDK, Ocrustar, PID 02AA, Python驱动, USB协议, VID 045C, 云API文档, 云资产清单, 信号分析, 开源硬件, 智能家居, 物联网安全, 硬件分析, 红外遥控, 逆向工具, 逆向工程