ZeroDesk 是一个面向 Windows 的开源 P2P 远程桌面控制软件原型,目标是提供零自建服务器成本、端到端加密、低交互延迟和精细权限控制。
当前仓库已经提供一套可编译的 MVP 实现:
- C++17 + DXGI Desktop Duplication 屏幕采集库
- RAW_BGRA 脏区编码链路,以及 Windows Media Foundation 的 H.264 / H.265 / AV1 编解码链路
- Rust 侧手动连接串交换、STUN、公网候选收集与 ICE-like 建链
- X25519 + ChaCha20-Poly1305 会话加密
- egui 控制端与被控端界面
- 键鼠权限控制与实时状态同步
- Cloudflare Workers / Wrangler Dev 可选信令服务接入
- TURN relay 回退、Agent 系统托盘常驻、Viewer 动态码率自适应、Agent / Viewer 侧日志按日轮转落盘
为了保证仓库在纯开源依赖和默认 Windows 环境下可编译,本仓库保留 RAW_BGRA 路径作为兜底,同时已经接入基于 Windows Media Foundation 的多码流编码与解码。若系统装有对应驱动提供的硬件 MFT,H.264 / H.265 / AV1 会优先使用硬件编码路径;否则自动回退到软件 H.264 或 RAW_BGRA。Agent 还支持在本地采集侧选择自动、DXGI 或 Windows.Graphics.Capture 后端,Viewer 侧支持根据 RTT 与丢包自动调节目标码率。
ZeroDesk/
├── core-capture/ # C++ 屏幕采集、脏区编码、输入注入、预览程序
├── core-net/ # Rust 网络、加密、手动信令、UDP 传输
├── core-protocol/ # Rust Protobuf 协议定义
├── agent/ # Rust 被控端 GUI
├── viewer/ # Rust 控制端 GUI
├── signaling/ # Cloudflare Workers 信令服务示例
├── scripts/ # 构建脚本
├── Cargo.toml # Cargo workspace
├── CMakeLists.txt # C++ 根工程
└── LICENSE # MIT 许可证
flowchart LR
Viewer[Viewer\nRust + egui] -->|手动连接串 / 可选信令| CoreNetViewer[core-net]
Agent[Agent\nRust + egui] -->|FFI| Capture[core_capture.dll\nC++ / DXGI]
Viewer -->|键鼠事件| CoreNetViewer
CoreNetViewer <-->|加密 UDP / ICE-like| CoreNetAgent[core-net]
CoreNetAgent -->|视频帧| Agent
Capture -->|全帧 / 脏区帧| CoreNetAgent
Viewer -->|渲染| Decoder[Viewer Decoder]
Decoder -->|贴图| Viewer
- DXGI Desktop Duplication 采集桌面帧,读取脏矩形与移动矩形。
- C++ 本地预览程序 zerodesk_preview.exe,可直接镜像当前桌面。
- Rust STUN 客户端,可向公共 STUN 获取 srflx 候选。
- Base64 手动交换连接串,内含设备指纹、公钥与候选地址。
- X25519 会话密钥交换,ChaCha20-Poly1305 数据包加密。
- 自定义 UDP 传输层,包含视频分片、控制消息可靠重传、心跳 RTT。
- 被控端权限控制:查看屏幕、键盘、鼠标可单独开关。
- 控制端支持 RAW_BGRA 脏区合成,以及 H.264 / H.265 / AV1 解码,并可回传键鼠事件。
- Agent / Viewer 可接入同一 WebSocket 信令房间,自动收发连接串。
- 收到对端连接串后可自动发起建链,并在失败后自动重建本地 Peer。
- Agent / Viewer 现在可直接在 GUI 中填写 TURN 服务器、用户名和密码,并在生成连接串时收集 TURN relay 候选。
- Agent 支持系统托盘常驻,关闭主窗口时可隐藏到托盘并从托盘菜单恢复。
- Agent 支持自动、DXGI Desktop Duplication 与 Windows.Graphics.Capture 三种采集后端;WGC 既可整屏采集,也可选择单个窗口作为采集目标。
- Viewer 支持动态码率自适应,会根据 RTT 与丢包在设定上下限内自动调整目标码率。
- Windows 10/11
- Visual Studio 2022 + Windows SDK
- Rust stable toolchain
- CMake 3.24+
- 推荐编译器路径:D:/vs2022/vs2022.exe/VC/Tools/MSVC/14.44.35207/bin/Hostx86/x86/cl.exe
scripts\build_release.bat该脚本会生成一个便携分发目录:
dist\ZeroDesk-portable-release
cmake -S . -B build -G "Visual Studio 17 2022" -A x64
cmake --build build --config Debug
cargo test -p core-protocol -p core-net
cargo check -p viewer -p agent编译完成后,关键产物位于:
- build/core-capture/Debug/core_capture.dll
- build/core-capture/Debug/zerodesk_preview.exe
- target/debug/agent.exe
- target/debug/viewer.exe
安装脚本位于:
- installer/ZeroDesk.iss
直接运行:
build\core-capture\Debug\zerodesk_preview.exe程序会打开一个本地预览窗口,实时显示当前桌面。
- 启动 agent.exe。
- 复制 Agent 窗口中的本地连接串到 Viewer。
- 启动 viewer.exe。
- 将 Viewer 的本地连接串粘贴回 Agent。
- 两端分别点击建立连接 / 接受连接。
- 连接成功后,Viewer 会显示远程桌面并按权限发送键鼠事件。
- 在 signaling 目录部署 Worker,或者本地运行 wrangler dev。
- 启动 agent.exe 与 viewer.exe。
- 在两端界面的“可选信令房间”中填写同一个地址与房间号。
- 两端点击“连接信令并发布”。
- 程序会自动收到对端连接串,并在启用自动建链时直接建立连接。
本地调试时,默认地址可以直接使用:
http://127.0.0.1:8787
当前应用内同时支持两种方式:
- 手动交换连接串。
- 通过 Cloudflare Workers / Wrangler Dev WebSocket 房间自动交换连接串。
仓库中的 signaling 目录提供的 Worker 只转发候选、公钥与连接串,不参与媒体数据传输。
- 持久身份:Ed25519 设备身份,首次启动时生成并落盘。
- 会话密钥:每次连接生成临时 X25519 密钥对。
- 加密算法:ChaCha20-Poly1305,按 UDP 数据包级别加密。
- 指纹核对:界面显示短码与指纹,供用户人工确认。
Agent 与 Viewer 会把日志写入本地目录:
%LOCALAPPDATA%\ZeroDesk\logs
日志文件按日轮转,默认文件名为:
- agent.log
- viewer.log
- 当前仓库仍以 Windows Media Foundation 为默认视频编码实现;NVIDIA NVENC、AMD AMF、Intel QSV 的专用 SDK 编码器尚未独立接入。
- H.265 / AV1 依赖系统安装的 Windows Media Foundation 解码器和对应硬件/驱动能力;若本机缺失相关组件,会回退到其他可用码流。
- 窗口级 WGC 采集依赖目标窗口保持可见且未销毁;若窗口最小化、切换到受保护内容或关闭,会导致采集失败并需要重新选择目标。
- Ctrl+Alt+Del、UAC 安全桌面等场景仍受 Windows 权限与桌面隔离限制。
本仓库已经通过以下验证命令:
cargo test -p core-protocol -p core-net
cargo check --workspace同时已通过 CMake 构建验证:
cmake --build build --config DebugC++ 采集层已通过 CMake 构建验证:
cmake --build build --config Debug本项目使用 MIT License,详见 LICENSE。