Go to file
tonycao 0a183e449c hostdemo: full parameter sweep + periodic RDM status polling in session_loop
After zero-pre-baked discovery, session_loop now sweeps each fixture
(DEVICE_INFO with E1.20 PD decode + raw hex, DMX_START_ADDRESS,
DEVICE_LABEL / MODEL_DESCRIPTION / SOFTWARE_VERSION / MANUFACTURER_LABEL)
with a 2-round retry for the flaky RDM window arm, prints a per-fixture
parameter summary, then enters a 6s status-poll cycle: one compact line
per fixture per cycle, address/footprint changes reported as alarms, and
playback follows a changed DMX address automatically.  Duplicate uplinks
from the flag=00/01 pair copies are deduped; the playback address list
is kept per-UID (no more duplicate control-address entries).
2026-09-14 21:04:45 +08:00
docs docs: Butler behavior findings (bind refusal state, toxic prelude, ident-before-AECH); README run/stop commands 2026-09-11 17:20:44 +08:00
emu-probes device: remove 150ms discovery delay (SL 5.5 scan ignores delayed replies); add emu-probes 2026-09-12 09:10:27 +08:00
samples feat: show mode for standalone 1-32 rainbow DMX + RDM status polling 2026-09-11 12:03:43 +08:00
scripts docs+scripts: enet_protocol.md, verification plan, PS verify suite, session analysis scripts, DLL tools, README 2026-09-11 01:08:47 +08:00
src hostdemo: full parameter sweep + periodic RDM status polling in session_loop 2026-09-14 21:04:45 +08:00
tools docs+scripts: enet_protocol.md, verification plan, PS verify suite, session analysis scripts, DLL tools, README 2026-09-11 01:08:47 +08:00
.gitignore feat: show mode for standalone 1-32 rainbow DMX + RDM status polling 2026-09-11 12:03:43 +08:00
Cargo.lock feat: show mode for standalone 1-32 rainbow DMX + RDM status polling 2026-09-11 12:03:43 +08:00
Cargo.toml feat: show mode for standalone 1-32 rainbow DMX + RDM status polling 2026-09-11 12:03:43 +08:00
README.md docs: Ubuntu host-side verification via Windows udprelay - verified end-to-end 2026-09-11 19:10:28 +08:00
validation_report.json feat: show mode for standalone 1-32 rainbow DMX + RDM status polling 2026-09-11 12:03:43 +08:00

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 并轮询设备状态。

# 永久运行(按 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)。

# ① Windows 侧启动中继(先启动;占用 UDP 31772,与 show 模式互斥,二选一)
.\target\release\enet-validator.exe udprelay 0.0.0.0:31772 192.168.123.1 192.168.123.113
# ② 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"