Wand-Enhancer:6.8K Stars 的本地客户端增强器,如何用「不出二进制」重新定义开源分发
posts posts 2026-07-13T03:03:54+08:00Wand-Enhancer 是 Wand(WeMod)客户端的本地增强工具,C# WPF 编写、Apache-2.0 许可、不发布预编译可执行文件,用户必须 fork 后用 GitHub Actions 自构建。内置 Remote Web Panel(QR 扫码 + 局域网 TCP 3223)和 Chromium renderer 注入的 JS 沙箱。本文拆开它的「不出二进制」分发模型、JS 注入约束与网络拓扑。技术笔记Wand, C#, WPF, GitHub Actions, 扩展开发Wand-Enhancer:6.8K Stars 的本地客户端增强器,如何用「不出二进制」重新定义开源分发
§1 先给判断
Wand-Enhancer 是一个面向 Wand(原名 WeMod,PC 游戏作弊修改器)客户端的本地增强工具,C# + WPF 编写、Apache-2.0 许可、6.8K Stars。它的工程上有三件事值得专门拆开看:
- 零二进制分发:GitHub Releases 不提供
.exe,用户必须 fork 后用 GitHub Actions 工作流自己构建产物。这是反「第三方下载站挂马」的反向操作。 - 双重定位:既给 Wand 加本地补丁(环境配置、版本兼容、布局与主题、AI 增强),又通过内置的 Remote Web Panel 让手机在同 Wi-Fi 下扫码控制 PC。
- Chromium renderer 注入:自定义
.js脚本通过与 Web Panel 同一套注入通道进入 Wand 的渲染进程,可访问完整 DOM 和 Noderequire。
仓库地址:https://github.com/k1tbyte/Wand-Enhancer(GitLab 镜像:https://gitlab.com/kitbyte/wand-enhancer)。最新版本 1.0.9.3(2026-06-28),自 2024-11 上线以来累计 19K+ Forks(注意 Forks 数含 bot 与镜像分叉,不是直接采纳量)。
文章结构:先把「为什么不出二进制」这条铁律讲透;然后拆仓库结构(主项目、Web 面板、构建脚本);再讲 Remote Web Panel 的网络拓扑和 JS 注入模型;最后给一份「你是谁、你该不该用」的选型决策表。
§2 项目坐标:放在增强工具谱系里看
增强工具类项目大致有三种分发模式:
| 模式 | 代表 | 风险点 | Wand-Enhancer 位置 |
|---|---|---|---|
| 预编译可执行文件 + 官方下载站 | 大部分游戏修改器 | 镜像站挂马、捆绑挖矿 | 不选 |
| 闭源付费 SaaS | 部分商业修改器订阅 | 锁定付费、网络中断即失效 | 不选 |
| 开源 + 用户自构建 | Wand-Enhancer | 用户门槛高 | 选这条 |
作者在 README 顶部用大写警告标了这句话:「IMPORTANT NOTICE: THIS PROJECT HAS NO OFFICIAL YOUTUBE TUTORIALS, GUIDES, OR PREBUILT EXECUTABLE DOWNLOADS」。这一段不是装饰——它直接回应了过去两年里 Wand 相关下载链接被篡改、第三方扫描器反复报警的现实问题。
作者同时声明:
Yes. This project is entirely open-source, allowing anyone to audit the code. It operates strictly locally, does not require internet access, and makes zero network requests.
「零网络请求」这一条不是营销话术——它是仓库架构层面落地的。Remote Web Panel 的所有逻辑都在 PC 本地 3223 端口上监听,不向任何远端上报数据(除非用户主动通过 Tailscale 等 VPN 穿透)。
§3 仓库结构:三层 + 两个外部节点
主目录(master 分支)大致是这样:
Wand-Enhancer/
├── AGENTS.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE.md # Apache-2.0
├── README.md
├── Wand-Enhancer.sln # 主 Visual Studio 解决方案
├── build.cmd # Windows 顶层入口
├── build.ps1 # PowerShell 实际逻辑
├── build.sh # *nix 占位
├── AsarSharp/ # Electron .asar 归档的 C# 解包工具(私有 NuGet)
├── WandEnhancer/ # WPF 主项目
│ ├── App.xaml / App.xaml.cs
│ ├── Constants.cs
│ ├── Program.cs
│ ├── WandEnhancer.csproj
│ ├── packages.config # 旧版 NuGet 格式
│ ├── Converters/ # XAML 数据转换
│ ├── Core/ # 核心逻辑
│ │ ├── Enhancer.cs # 补丁执行器
│ │ ├── EnhancerConfig.cs # 配置加载
│ │ └── Services/ # 依赖服务
│ ├── Locale/ # 多语言资源
│ ├── Models/ # 数据模型
│ ├── ReactiveUICore/ # ReactiveUI 封装
│ ├── Style/ # XAML 主题
│ ├── Utils/ # 工具类
│ ├── View/
│ │ ├── Controls/ # 自定义控件
│ │ ├── MainWindow/ # 主窗口分块
│ │ └── Popups/ # 弹窗
│ ├── Properties/ # 程序集元数据
│ └── bin/obj/ # 构建产物
├── assets/ # README 截图、icon
├── scripts/ # 辅助脚本(get-changelog-section、validate-release-metadata)
├── tools/ # 上游下载工具
└── web-panel/ # Remote Web Panel 前端(Vite + React)
├── bridge/ # 与桌面端通信的桥层
├── protocol/ # 协议定义
├── src/ # React 源码
├── fixtures/ # 测试 fixture
├── index.html
├── package.json / pnpm-lock.yaml
├── tsconfig*.json
├── vite.config.ts / vitest.config.ts
├── eslint.config.js
├── components.json
├── lingui.config.ts # 国际化(i18n)配置
└── README.md主分支是 master(非 main),注意 fork 时默认 branch 选择。两个外部节点:
AsarSharp/:自研工具,用来解包和重打包 Wand 主程序的 Electron.asar归档。这是「客户端本地配置」类增强的入口工具。web-panel/:Remote Web Panel 的 React 前端,TypeScript + Vite + Lingui(国际化)+ Vitest 测试栈。它通过 Electron 的BrowserWindow调试端口或 IPC 通道与桌面端对话。
§4 构建模型:为什么强制 GitHub Actions 自构建
§4.1 自构建工作流
README 给出的官方构建路径只有一条:
- Fork 仓库
- 在 fork 的 Actions 标签里启用工作流(GitHub 首次 fork 默认禁用)
- 选择 Build executable workflow
- 点 Run workflow,保持默认分支,开始运行
- 等构建完成,在 Run 页面下载 artifact
- 解压 zip,运行
WandEnhancer.exe
§4.2 工作流做了哪些事
本地开发环境构建脚本 build.ps1(被 build.cmd 包装)做了这五件事:
- 安装 Web Panel 依赖(
pnpm install) - 构建前端(
pnpm build,产物喂回 WandEnhancer 主项目的资源目录) - 编译 native helper(
cmake调用,产物作为补丁工具的二进制 loader) - 还原 NuGet 包
- 构建 WPF 解决方案
这套本地链路对 Windows 开发者的要求(README 列得很清楚):
CMakeNode.js+pnpmVisual Studio 2022或 Build Tools for Visual Studio 2022 +MSBuild- Visual Studio 「Desktop development with C++」工作负载
- .NET Framework 4.8 desktop build tools / targeting pack
对没碰过 Windows 桌面开发的人,这是一道不低的门槛。但门槛本身就是设计意图——把构建过程从「信任未知二进制」挪到「自己跑 GitHub Actions」。
§4.3 「为什么不签名直接发布」的工程逻辑
作者在 Q&A 里给了一段完整解释:
The project no longer distributes prebuilt executables because unsigned or self-built patching tools are repeatedly reuploaded, mislabeled, and flagged by third-party scanners. Build the executable from your own fork using GitHub Actions instead.
翻译过来:所有官方不出二进制的结果,是反复被恶意上传 + 杀毒软件反复误报后的现实妥协。GitHub Actions 的产物默认不签名,但至少用户能审计 workflow yaml、对比 SHA256、对照源码 commit。
§4.4 信任模型的边界
注意这条:
You can, but you should treat it as untrusted. This repository cannot verify or support third-party builds.
即使别人 fork 后跑了同一份 workflow 并把产物发给你,作者也明确声明「这不是我们能担保的」。这种「责任划分到 fork owner」的模型和传统二进制分发在信任拓扑上是反过来的——传统模式信任厂商签名,这种模式信任「我 fork、我审计、我自己构建」。
§5 Remote Web Panel:局域网里的 Electron 调试桥
§5.1 使用流程
README 的 Quick Start 只有三步:
- PC 和手机在同一个 Wi-Fi下
- 鼠标悬停 WandEnhancer 顶栏的 Connect 按钮,弹出二维码
- 手机相机扫码进入控制页
§5.2 端口与防火墙
底层监听端口是 TCP 3223。README 列了三类常见故障:
| 现象 | 排查路径 |
|---|---|
| 页面打不开 | 确认在同一局域网;部分路由器开了「客户端隔离/AP 隔离」,同 SSID 设备互不可达 |
| 同网络仍打不开 | 检查 Windows 防火墙,放行 TCP 3223 到本地网络 |
| 网络被 Windows 标为 Public | 改成 Private |
| 想跨网络(LTE/5G 或不同 Wi-Fi) | 用 Tailscale 或类似 VPN 工具接入 |
§5.3 跨网访问的工程路径
Tailscale 这一步不是装饰。它把 3223 端口「投射」到用户的 tailnet 上,手机从手机网络进入 tailnet 一样能到达 PC。这种用法对安全工具和远程控制类项目是一个越来越常见的做法——不依赖任何中心化服务器,信任根放在 Tailscale 协调节点上(开源实现可自建 Headscale)。
§5.4 协议层
web-panel/protocol/ 目录下放着与桌面端的协议定义(建议深挖时优先看这一层),web-panel/bridge/ 是实际通信的桥接层(很可能是 WebSocket 或 IPC)。这里 README 没把协议列出来,但结合 Electron 注入路径(详见下节)可以判断:Web Panel 走的是 Electron 注入的「内部调试端口」而不是简单的 HTTP——因为 Remote Web Panel 要和 Wand 自身的 renderer 共享权限。
§6 自定义脚本注入:Chromium renderer 上的双刃剑
§6.1 启用前提
注入自定义 JS 必须先启用 Remote Web Panel 补丁。这两个功能共享同一条注入通道——这是关键设计:自定义 JS 跑在和 Web Panel 一样的 renderer 上下文里。
§6.2 脚本来源
两种注入路径:
- 补丁对话框里临时加:选一个或多个
.js文件 - 目录注入:把
.js放到renderer-scripts/文件夹(与补丁器可执行文件同目录)
§6.3 运行时约束
README 写得很明确:
- 每个脚本跑在 Wand 的 renderer 里:完整 DOM 访问 + Node
require - 脚本被包裹一层 try/catch,抛错只 log,不会让 Wand 崩溃
- 脚本可能启动时跑多次(加载和短时间内再次触发),需要用全局 flag 保护一次性逻辑
- 提供小工具:
WandEnhancer.log(...)、WandEnhancer.remoteUrl、WandEnhancer.apiVersion
§6.4 最小示例:DOM 变化监听
// Injected scripts can run multiple times — guard one-time setup.
if (!globalThis.__helloScriptInstalled) {
globalThis.__helloScriptInstalled = true;
WandEnhancer.log("Hello from my custom script!", WandEnhancer.remoteUrl);
new MutationObserver(() => {
const dialog = document.querySelector("ux-dialog:not([data-seen])");
if (dialog) {
dialog.setAttribute("data-seen", "1");
WandEnhancer.log("A dialog opened.");
}
}).observe(document.documentElement, { childList: true, subtree: true });
}这例子示范了三个真实约束:
- 重复执行保护:脚本会被多次执行,必须用
globalThis.__helloScriptInstalled做幂等 - MutationObserver 全文档订阅:Wand 是基于 Web Components 的(
ux-dialog自定义元素),新弹窗可能在任何时机出现 - 错误自愈:WandEnhancer 包裹层吞掉异常,Wand 不会因为用户脚本错而崩
§6.5 安全边界
README 最后一句严肃警告:
Scripts run with the same privileges as the Wand client. Only add scripts you trust and understand.
这不是套话——注入脚本能 require('fs') 在 Electron 主进程上下文里读本地文件系统(取决于 Wand 自身的权限配置)。用户的 .js 文件只该来自自己或可审计的开源社区。Wand-Enhancer 不对第三方脚本做隔离沙箱,信任完全落在用户对脚本作者的判断上。
§7 五大改进点拆开看
README 列的 What features are improved? 五条:
- 本地环境配置管理:Wand 的用户配置目录(
%APPDATA%/Wand)下的settings.json、trainers/、cache/等路径读写 - 新客户端版本的自动兼容调整:Wand 升级后 WandEnhancer 检测 schema 变化并自动适配(不依赖作者每次手动跟进发版)
- 布局与主题深度定制(仅客户端):WPF 端走 ReactiveUI + 自定义 XAML Style;Web Panel 端走 Material You / 自定义 CSS
- AI Features:README 提了但没展开——结合 Wand 训练器数据库做「针对游戏的 AI 助手」(推测,未在公开仓库核源码核实)
- Remote Web Panel(已拆)
第 4 条是「未在公开仓库核源码核实」必须显式标注——README 没给具体功能列表,作者也没在 CHANGELOG 里详细写 AI 模块的实现。这是阅读边界。
§8 CHANGELOG 关键节点(2026 Q2)
按 CHANGELOG.md 倒序摘出影响判断的几个版本:
- 1.0.9.3(2026-07-04):杂项修复
- 1.0.9.2(2026-06-28):移除 updater 功能(强化「不分发二进制」立场)
- 1.0.9.1(2026-06-28):README 大改,把「重要通知」提到顶部 + 自构建流程写得更细
- 1.0.9.x(2026-06-24):修 pro 账户 reducer 在订阅丢失时的崩溃(PR #110)
- 更早(2026-06-14):CMake 默认 VS 生成器,移除自签名代码
- 更早(2026-06-16):加
FUNDING.yml,支持 Patreon/USDT-TRC20/BTC/ETH 赞助
CHANGELOG 节奏可以看出来:作者把「分发信任」作为长期主线,所有让用户从「下载二进制」挪向「自构建」的修改都在持续打磨。
§9 你该用还是不该用:决策表
| 你是谁 | 你的诉求 | 建议 |
|---|---|---|
| PC 单机玩家 + Wand 付费用户 | 想要更舒服的 UI 和远程控制 | ✅ 适合。自构建一次,长期使用 |
| 安全研究员 | 想审计一个真实分发的本地增强器 | ✅ 适合。Apache-2.0,workflow 可见 |
| 普通玩家,懒得敲命令行 | 想要点开即用的增强版 | ❌ 不适合。门槛高于现成工具 |
| 期待运行 PS5/PS4/PS3 老游戏的修改器 | — | ❌ 不相关。这是 Wand 的增强器,不是 Wand 的替代品 |
| 想要移动端独立控制 | 想要远程扫码之外的功能扩展 | ⚠️ 可以,但要先确认协议层 API(详见 web-panel/protocol/) |
想找「Discord 上的 .exe」 | — | ❌ 拒绝。README 已经警告过:第三方下载站 = 恶意软件 |
§10 自构建的工程意义:不只是反挂马
读完整套分发策略后,能看出作者在反复回答一个问题:「当你的工具会被反复挂马、二进制会被反复误杀时,开源维护者还能做什么?」
他的答案是:
- 彻底不发布二进制——GitHub Releases 里只有 release notes
- 把构建搬到用户自己的 fork——GitHub Actions artifact 默认只对 fork owner 可见
- 把每一步用 README 写清楚——让非 Windows 桌面开发者也能照着做
- 承认责任边界——「别人构建的产物我们不担保」,把信任从厂商挪到用户
- 支持脚本化扩展——让有能力的用户自己写
.js而不是等作者加 feature
这套打法对其他「工具型」开源项目(特别是安全、网络、修改器类)有示范意义:分发不是只有「我把二进制传上去」一种选项;当信任被反复攻击时,把构建权交给用户反而是更稳的路线。
§11 资料口径与边界
已确认(仓库可见证据):
- 6.8K Stars / 19K+ Forks / 524 open issues(GitHub API 2026-07-12 数据)
- Apache-2.0 许可
- C# + WPF 主项目
- 入口
build.cmd→build.ps1 - JS 注入约束(README 文档)+ Remote Web Panel 端口 3223
- GitHub Actions artifact 是唯一分发通道
- 主分支
master - 最近 release 1.0.9.3(2026-07-04)
- README 与仓库结构的对应关系(已逐项检查目录)
已显式标注:
- 「AI Features」具体能力未在仓库明文核实
web-panel/bridge/和web-panel/protocol/的具体协议格式需要直接读源码才能完整确认- 「Forks 19K+」含镜像分叉与 bot,不代表真实贡献者数
不在本文覆盖:
- WandEnhancer 与 Wand 主程序之间的具体补丁点(patch point)——需读
WandEnhancer/Core/Enhancer.cs源码 - 自定义脚本生态(非官方
.js仓库)——README 没列第三方仓库 - 与其它 Wand 增强器(如 Wand Pro、WandMod)的对比——超出单项目范围
§12 参考链接
- 仓库主链接:https://github.com/k1tbyte/Wand-Enhancer
- GitLab 镜像:https://gitlab.com/kitbyte/wand-enhancer
- Apache-2.0 许可:https://github.com/k1tbyte/Wand-Enhancer/blob/master/LICENSE.md
- Tailscale(跨网络方案):https://tailscale.com/
- WeMod / Wand 客户端(与增强器对应的宿主程序)
§13 自测题
- Wand-Enhancer 的 GitHub Releases 为什么没有
.exe?作者用 README 的哪条声明解释了这个决策? - Remote Web Panel 的端口是多少?跨网络访问的官方推荐路径是什么?
- 自定义 JS 脚本跑在哪个进程上下文里?作者给出哪些运行时约束来避免重复执行和崩溃?
- 主项目入口
build.ps1大致做几件事?列出五件。 - Apache-2.0 许可下,用户 fork 后用 GitHub Actions 构建产物,可以再分发吗?为什么?