Wand-Enhancer 技术拆解:本地增强 Wand 客户端的 4 种实战
【免费下载链接】Wand-EnhancerAdvanced UX and interoperability extension for Wand (WeMod) app项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer
Wand-Enhancer 是一款完全离线的桌面补丁器,通过改写 Wand(WeMod)客户端内部的应用包,解锁 Pro 状态、禁用更新、F12 调试、手机远程面板 4 类能力。适合想看懂并掌控自己客户端的开发者与进阶用户。
补丁流水线四步跑通:备份、解包、正则替换、回包
读完这一节你带走什么:补丁到底改了哪些文件、为什么工具能随时还原到原样。
入口在WandEnhancer/Core/Enhancer.cs,Patch()的主流程可以读作四步流水线:
// 简化版主流程(真实代码见 WandEnhancer/Core/Enhancer.cs) public void Patch() { Common.TryKillProcess(weModConfig.BrandName); // 关闭客户端,释放文件锁 File.Copy(_asarPath, _backupPath); // 首次运行生成 app.asar.backup AsarExtractor.ExtractAll(_asarPath, _unpackedPath); // 解包 asar PatchAsar(); // 正则匹配压缩 JS,替换目标函数 InjectRemotePanelFiles(); // 写入远程面板资产 new AsarCreator(_unpackedPath, _asarPath, opts).CreatePackageWithOptions(); // 回包 AttachProxyDll(); // 在安装目录放置 version.dll 代理 }Asar 打包格式(Electron 把应用 JS 资源装进单个二进制包的格式)是关键:Wand 的前端全部位于resources/app.asar里的压缩 bundle。Wand-Enhancer 用自研的AsarSharp/AsarExtractor.cs与AsarSharp/AsarCreator.cs完成解包和回包,不依赖第三方命令行工具。
正则替换的核心在WandEnhancer/Core/EnhancerConfig.cs,每个补丁条目由四部分组成:
SearchHints:快速标记,先用子串命中文件,避免全文扫描Target:正则,定位压缩 JS 中的精确函数PatchFactory:按匹配结果动态生成替换代码Resolver:处理压缩后this.#xxxx私有字段改名,从匹配里取出真实字段名
SingleMatch还承担哨兵职责:同一正则命中多处就立刻报"版本不支持",而不是硬改。目录定位逻辑在WandEnhancer/Utils/Extensions.cs:先扫%LOCALAPPDATA%下的 Wand / WeMod 品牌目录,按修改时间取app-*里最新的有效安装;找不到再从正在运行的进程反查 exe 路径。定位成功后主界面会显示路径与就绪状态,点 Patch 即执行上述流水线:
运行时关键:version.dll 代理 DLL 关闭 ASAR 完整性校验
读完这一节你带走什么:改过的 asar 为什么不会让 Wand 启动失败,以及全工具唯一的"运行时"修改发生在哪。
Electron 有一套叫Fuse(烧录在可执行文件里的安全开关数组)的机制,Wand 开启了 asar 完整性校验的 Fuse:一旦检测到app.asar被动过就拒绝正常工作。
Wand-Enhancer 的答案是tools/asar-fuses-bypass/这个 C 小工程:编译出一个叫version.dll的代理 DLL 放进安装根目录,让 Windows 优先加载它。它在library.c里把 16 个版本查询 API(如GetFileVersionInfoA、VerQueryValueW)原样转发给系统真实的C:\Windows\System32\version.dll,同时在DllMain里做一件正事——在fuses.c中扫描主模块内存里的 32 字节 Fuse 哨兵,找到索引 4 的校验字节并翻转:
// tools/asar-fuses-bypass/fuses.c(节选) unsigned char* fuse = &wire->fuses[FUSE_ASAR_INTEGRITY_VALIDATION]; // 索引 4 VirtualProtect(fuse, 1, PAGE_READWRITE, &prot); *fuse = FUSE_STATE_REMOVED; // '1' -> 'r'(REMOVED) VirtualProtect(fuse, 1, prot, &prot);这是纯内存修改,每次进程启动都会执行,不落盘、不改可执行文件本体,所以磁盘上的签名检查不受影响。主界面的恢复备份操作会同时删掉version.dll,让客户端彻底回到初始状态。
场景实战:F12 打开 DevTools,手机接入远程面板
读完这一节你带走什么:两条可复现的操作路径,分别对应调试客户端和手机远控两种诉求。
开发者:构建源码并用 F12 检查客户端
你是修改器工具开发者,想直接检查 Wand 的 DOM 与网络请求来验证接口假设。整个过程完全本地:
git clone https://gitcode.com/GitHub_Trending/we/Wand-Enhancer cd Wand-Enhancer build.cmd🔧 前置依赖:CMake、Node.js + pnpm、Visual Studio 2022(含 MSBuild 与 C++ 工作负载)、.NET Framework 4.8 构建工具;按README.md说明,build.cmd会按顺序装依赖并构建整个解决方案。
构建完成后运行 Wand-Enhancer 产出的WandEnhancer.exe,路径未自动识别就手动浏览到安装目录,补丁弹窗里只勾选DevToolsOnF12。这个向量的锚点是 Electron 主进程的<app>.whenReady().then(调用处,给每个窗口挂before-input-event钩子;代码注释明确解释为什么不改渲染进程的按键监听——那个分发点的压缩标识符每次发版都变,主进程锚点则稳定。补丁完成后在 Wand 窗口按 F12 即可弹出 DevTools,之后客户端更新也不影响这个钩子。
进阶用户:用 Remote Web Panel 把修改器装进手机
你直播时想躺着调游戏参数。在补丁弹窗勾选RemoteWebPanelPreview并应用,工具会完成三件事:把web-panel/dist构建产物以remote-panel/写进包内、注入bridge.cjs桥接主进程启动链、把你的脚本拷入渲染进程。启动 Wand 后悬停顶栏 Connect 按钮,用手机扫 QR,浏览器里就是完整的修改器界面,端口固定3223。
# 若自行修改了 web-panel 源码,先重新构建(桥接与默认脚本都出自这里) cd web-panel pnpm run build想注入自己的 JS 时,把.js放进可执行文件旁的renderer-scripts/文件夹(也支持在补丁弹窗里直接选择文件)。脚本在 Wand 渲染进程内运行,拥有完整 DOM 访问权,且可能被加载多次,一次性初始化要用全局标志位包住,README.md里有完整的 hello.js 示例。
方案对比:4 个补丁向量该怎么勾
读完这一节你带走什么:按目标选向量组合,以及每个向量的维护代价差异。
| 补丁向量 | 作用 | 实现方式 | 开启后状态 | 版本更新成本 |
|---|---|---|---|---|
| ActivatePro | 标记订阅为年付有效 | 改写 4 个账户相关 JS 函数 | 客户端显示 Pro | 高:新版需重推正则 |
| DisableUpdates | 关闭更新检查 | 替换ACTION_CHECK_FOR_UPDATE处理器 | 不再提示更新 | 低 |
| DevToolsOnF12 | F12 打开开发者工具 | 主进程before-input-event钩子 | 按 F12 即开 | 低:主进程锚点稳定 |
| RemoteWebPanelPreview | 注入手机远程面板 + 桥 | ASAR 改写 + 文件注入 +bridge.cjs | 手机可远控 | 高:5 个补丁条目 |
怎么选:只想用干净客户端就勾 DisableUpdates;要研究内部就加 DevToolsOnF12;要手机远控必须开 RemoteWebPanelPreview(自定义脚本也依赖它)。
踩坑速查:补丁失败、文件被锁、面板打不开
读完这一节你带走什么:三个最高频报错的自诊路径。
⚠️报错 "Failed to apply patches: ... The version may not be supported"现象:日志列出某个向量名并提示版本不支持。根因:Wand 更新后压缩 JS 变了,EnhancerConfig.cs里的Target正则失配。解法:查看安装目录下版本号(形如app-10.x.0),等新版本适配;Wand-Enhancer 有意不做部分补丁——任一向量失配就整体报错,避免留下半改状态。AGENTS.md明确要求对着新版 bundle 重推正则,不要信任旧解包目录。
💡"Backup file is locked. Please close the WeMod and try again"现象:恢复备份点不动。根因:app.asar.backup被仍在运行的 Wand 进程占用。解法:彻底关闭 Wand 后再点一次;恢复操作会同步删除version.dll,客户端回到出厂状态。
⚠️手机扫了 QR 但页面打不开现象:浏览器一直转圈或超时。根因:不在同一局域网、路由器开启了客户端隔离,或 Windows 防火墙拦了3223。解法:确认同 Wi-Fi;在防火墙放行 TCP3223入站;若网络类型被标记为Public,改为Private。
💡 附加提醒:不要手动删除app.asar.backup,主界面靠它判断"已补丁"并禁用补丁按钮,手动删掉后界面状态会错乱。
延伸阅读
- WandEnhancer/Core/EnhancerConfig.cs — 全部补丁向量的正则与替换模板,理解"每个版本要改哪些函数"的入口
- WandEnhancer/Core/Enhancer.cs — 备份、解包、打补丁、回包的完整实现,整个工具最好的一张地图
- tools/asar-fuses-bypass/fuses.c — 如何在内存里定位 Electron Fuse 并翻转单个字节
- web-panel/protocol/web-contract.json — 远程面板端口与协议版本的共享契约,动桥接代码前先读它
- AGENTS.md — 项目的"流水线不变量"清单,写清了哪些改动被禁止、为什么
【免费下载链接】Wand-EnhancerAdvanced UX and interoperability extension for Wand (WeMod) app项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考