enet-validator/README.md

124 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# enet-validator — e:cue SymphoLight ↔ Butler e:net 协议逆向与复现
对 e:cue SymphoLight 5.5 与 Butler S2 之间 UDP/31772 私有协议(e:net)的完整逆向:
**AECH 认领算法破解、DMX 帧混淆破解、RDM over e:net 解码**,并分别实现了
**设备端仿真**(虚拟 Butler)与**主机端仿真**(hostdemo 直接接管真机)。
## 目录
```
├── src/ Rust 源码(std only,无外部依赖)
│ ├── main.rs 子命令入口
│ ├── enet.rs e:net 帧模板 / SO_REUSEADDR 绑定
│ ├── tests.rs 虚拟 Butler 设备端(AECH 本地应答 + RDM 灯具仿真 + 解密日志)
│ ├── aech.rs AgiosElias.G 认领算法、DMX zPprv0TXRRW 混淆加解密、dmxdec/dmxsend
│ ├── hostdemo.rs 主机侧等效示例(真机接管:认领→RDM 发现→加密 DMX 控制)
│ └── dmxhash.rs 早期帧标签分析
├── samples/ 37 个真实抓包帧样本(hex)
├── docs/
│ ├── enet_protocol.md ★协议逆向文档(帧布局/算法/实证,最核心)
│ └── rust_verification_plan.md 验证计划
├── scripts/
│ ├── Verify-EnetProtocol.ps1 协议验证套件
│ ├── Verify-Rdm.ps1 RDM 验证
│ ├── enet_lib.ps1 PS 公共库
│ └── session/ 逆向过程中的会话脚本(抓包/分析/部署/推送)
└── tools/ DLL 反编译辅助工具(C#)
├── IlDump.cs / GetTable.cs / Scan.cs
```
## 构建
```
cargo build --release # std only, 无外部依赖
```
## 子命令(设备端仿真,跑在任意机器,绑 58 网段示例)
```
enet-validator device # 虚拟 Butler 主循环(192.168.58.7)
enet-validator discover|announce|heartbeat|euce|session|all
```
## 子命令(主机侧 / 离线分析)
```
enet-validator hostdemo <目标IP> [秒] # 主机侧等效:认领→RDM 发现→加密 DMX 控制
# 环境变量 HOSTDEMO_MODE=show 彩灯渐变常驻(推荐, 见下节)
# =quick 最小认领+统一会话环
# =claimonly 最小认领探针
# HOSTDEMO_PRE=<秒> 广播前奏(默认0; 45=SL式前奏, 实测有毒)
# HOSTDEMO_BIND=1 发 bind52×4 (实测有毒, 仅复现实验用)
# 注: secs=0 在默认模式=跳过DMX; 在 show 模式=永久运行
enet-validator dmxsend <目标IP> [秒] # 主机侧加密 DMX 播放(自证闭环)
enet-validator dmxdec <tsv> # DMX 帧解密验证(离线)
enet-validator dmxroll <tsv> # 滚动值分析(离线)
enet-validator aechprobe <tsv> <ip> # AECH 在线探测
```
## show 模式:地址 1-32 炫彩呼吸 + RDM 状态轮询
无需 SymphoLight 运行,独立接管 Butler,持续输出炫彩呼吸 DMX 并轮询设备状态。
```powershell
# 永久运行(按 Ctrl+C 停止)
$env:HOSTDEMO_MODE = "show"
.\target\release\enet-validator.exe hostdemo 192.168.123.1 0
# 或运行固定秒数
.\target\release\enet-validator.exe hostdemo 192.168.123.1 600
# 后台常驻(无窗口)
$env:HOSTDEMO_MODE = "show"
Start-Process -FilePath ".\target\release\enet-validator.exe" -ArgumentList "hostdemo 192.168.123.1 0" -WindowStyle Hidden
# 停止后台灯效
Get-Process enet-validator | Stop-Process -Force
```
- DMX:地址 1-32 彩虹呼吸渐变(HMKJ 32 通道灯具),**零模板纯自构造帧**(`build_dmx_frame`),**port1+port2 双口同时输出**(灯具接任一口均可控)
- RDM:每 700ms 轮询 3 台已知 UID,实时打印 `DEVICE_INFO` 与 `DMX_START_ADDRESS`,**纯自构造请求帧**(`build_rdm_frame2`)
- 认领帧同样纯自构造(`build_claim_frame`,不透明区填 0——Butler 不校验,已消融实证)
- 冷启动实测(2026-09-11 全系统断电重启):**最小认领(announce144 + claim)即可,无任何必需前奏**
- ⚠ 勿发 bind52 绑定帧与 45s 广播前奏——实测**有毒**(bind 以 unbind 收尾会让 Butler 拒答 AECH 数分钟)
- 运行无需任何抓包/replay 文件;DMX/RDM 帧全字段已破解(见 docs/enet_protocol_current.md)
## 已破解要点(详见 docs/enet_protocol.md)
- **AECH 认领**:`G(x) = x ^ TABLE[(x%32 + 1 + (x*13)%30) % 32]`(无密钥,表内嵌 DLL)
- **DMX 混淆**:`r=Random.Next()`;`out[i]=src[(i+rot)%512]^cnt[i]`,`rot=(B12^r)&511`
- **RDM**:标准 E1.20 内嵌 type=04 帧(0x3C 起,免 0xCC 起始字节,checksum 含隐含 0xCC)
- **1947 端口**:40B ASCII 许可令牌广播(`BlZRQphA…`,每 ~34s 一轮)
- 真机固件过滤:AECH 仅应答源 IP=192.168.123.113
## Ubuntu 主机侧验证(跨网段经 Windows 中继)
Ubuntu 机器(192.168.58.7)只有 58 网段,Butler 在 123 网段且 AECH 固件只认源 IP=192.168.123.113。
架构:`Ubuntu hostdemo → Windows udprelay(源伪装 .113)→ Butler`。已实测全链路(2026-09-11)。
```powershell
# ① Windows 侧启动中继(先启动;占用 UDP 31772,与 show 模式互斥,二选一)
.\target\release\enet-validator.exe udprelay 0.0.0.0:31772 192.168.123.1 192.168.123.113
```
```bash
# ② Ubuntu 侧(git pull && cargo build --release 后)
cd ~/enet-validator
HOSTDEMO_MODE=show HOSTDEMO_LISTEN=0.0.0.0:31772 \
nohup ./target/release/enet-validator hostdemo 192.168.58.107 0 > ~/show_ubuntu.log 2>&1 &
# 目标 IP = Windows 机器的 58 网段地址; HOSTDEMO_LISTEN = 本地实际绑定
# (帧内宣告 IP 由程序固定为 192.168.123.113, 与 socket 绑定解耦)
# 停止
pkill -f "enet-validator hostdemo"
```
实测结果:发现 217B ✓ → AERE 认领 PASS ✓ → RDM 发现 3 台灯具 ✓ → DMX 渐变上灯 ✓
## Ubuntu 虚拟 Butler 部署
```
scp -r enet-validator/ user@192.168.58.7:~/
ssh user@192.168.58.7 "cd ~/enet-validator && cargo build --release && ~/run_butler_local.sh"
```