今天在 GitHub Trending 上看到一个有意思的项目:Wand-Enhancer,一个专注于本地客户端配置管理与用户体验增强的开源工具,通过修改本地 Electron 应用实现布局定制、远程控制面板等高级功能。

一、项目概述

Wand-Enhancer 是由 k1tbyte 开发的开源互操作性工具,旨在扩展本地客户端配置并改善 Wand 应用的用户体验。项目采用 Apache-2.0 许可证,核心特性包括:

  • 本地环境配置管理:无需联网即可管理和调整客户端配置
  • 自动化兼容性调整:适配新版本客户端,减少手动迁移成本
  • 布局与主题定制:客户端侧的高级界面自定义
  • AI 功能增强:集成 AI 能力扩展应用功能
  • 远程 Web 面板:通过局域网 HTTP/WebSocket 服务器实现移动端远程控制

项目定位与安全设计

项目明确不发布预编译二进制文件,用户必须从自己的 Fork 通过 GitHub Actions 构建可执行文件。这一设计决策源于安全考量——项目作者发现大量诈骗者将恶意软件伪装成该项目教程进行传播,因此采用"仅源码分发 + 自行构建"模式保障用户安全。

二、技术原理

2.1 整体架构

Wand-Enhancer 采用三层架构设计:

┌─────────────────────────────────────────────┐
│           WPF GUI Application                │
│   (.NET Framework 4.8 + C#)                  │
│   - Patcher Dialog                           │
│   - Remote Web Panel Toggle                  │
└───────────────────┬─────────────────────────┘
                    │
┌───────────────────▼─────────────────────────┐
│         Native Helper (C++)                  │
│   - CMake 构建                               │
│   - ASAR Integrity Patching                  │
└───────────────────┬─────────────────────────┘
                    │
┌───────────────────▼─────────────────────────┐
│      Remote Web Panel (Node.js + pnpm)       │
│   - HTTP/WebSocket Server (Port 3223)        │
│   - Frontend (React/Vue)                     │
└─────────────────────────────────────────────┘

2.2 核心技术:Electron ASAR 完整性修补

Wand 应用基于 Electron 框架构建,Electron 使用 ASAR 归档格式打包应用代码。Wand-Enhancer 通过修改 version.dll 代理,在 Wand 进程内部修改 Electron 的 ASAR-integrity fuse 字节:

// 伪代码示例:ASAR 完整性检查绕过
// 实际实现位于 Native Helper (C++)

#include <Windows.h>
#include <fstream>

void PatchASARIntegrity(const std::wstring& asarPath) {
    // ASAR header 中的 fuse 字节偏移
    const size_t FUSE_OFFSET = 0x08;
    const byte FUSE_ENABLED = 0x01;
    const byte FUSE_DISABLED = 0x00;
    
    std::fstream asar(asarPath, std::ios::in | std::ios::out | std::ios::binary);
    
    // 读取 fuse 状态
    asar.seekg(FUSE_OFFSET);
    byte fuseValue;
    asar.read(reinterpret_cast<char*>(&fuseValue), 1);
    
    // 禁用完整性检查
    if (fuseValue == FUSE_ENABLED) {
        asar.seekp(FUSE_OFFSET);
        asar.write(reinterpret_cast<char*>(&FUSE_DISABLED), 1);
    }
    
    asar.close();
}

这一修改允许注入自定义 JavaScript 代码到客户端渲染进程,实现界面定制和功能扩展。

2.3 .NET Patcher 实现原理

Patcher 工具使用 .NET Framework 4.8 构建,核心流程:

  1. 用户选择 Wand 安装路径
  2. 验证应用完整性:检查 app.asar 文件存在性
  3. 应用补丁
    • 注入 version.dll 代理到安装目录
    • 修改 Electron fuse 字节
    • 可选:注入自定义 JavaScript 脚本到 renderer-scripts/
  4. 启用 Remote Web Panel:启动局域网 HTTP 服务器
// Patcher 核心逻辑示意
public class WandPatcher
{
    public void ApplyPatch(string wandPath, PatchOptions options)
    {
        var asarPath = Path.Combine(wandPath, "resources", "app.asar");
        
        // 验证 ASAR 存在
        if (!File.Exists(asarPath))
            throw new FileNotFoundException("app.asar not found");
        
        // 复制 version.dll 代理
        var versionDll = Path.Combine(wandPath, "version.dll");
        File.Copy(options.VersionDllSource, versionDll, overwrite: true);
        
        // 处理自定义脚本注入
        if (options.EnableWebPanel && options.CustomScripts.Any())
        {
            InjectCustomScripts(asarPath, options.CustomScripts);
        }
        
        // 记录日志
        Log.Info($"Patch applied successfully to {wandPath}");
    }
}

2.4 自定义脚本注入机制

用户可通过两种方式注入 JavaScript:

  1. Patch Dialog 中添加 .js 文件
  2. 放置到 renderer-scripts/ 目录

注入脚本运行在 Wand 的渲染进程,拥有完整的 DOM 和 Node.js require 访问权限:

// 示例:监听并处理对话框
if (!globalThis.__dialogHandlerInstalled) {
  globalThis.__dialogHandlerInstalled = true;

  WandEnhancer.log("Dialog handler initialized");

  new MutationObserver(() => {
    const dialog = document.querySelector("ux-dialog:not([data-seen])");
    if (dialog) {
      dialog.setAttribute("data-seen", "1");
      WandEnhancer.log("Dialog detected and marked");
      // 自定义处理逻辑
    }
  }).observe(document.documentElement, { childList: true, subtree: true });
}

关键设计点:

  • 脚本可能执行多次,需用全局标志防护单次操作
  • WandEnhancer helper 提供日志输出、远程面板 URL、API 版本等信息
  • 错误被捕获并记录,不会导致 Wand 崩溃

三、安装与快速开始

3.1 构建前置条件

从源码构建需要以下环境:

  • CMake:构建 Native Helper
  • Node.js + pnpm:Web Panel 前端依赖
  • Visual Studio 2022Build Tools for Visual Studio 2022
    • 工作负载:Desktop development with C++
  • .NET Framework 4.8:桌面构建工具 / 目标包

3.2 从 Fork 构建(推荐)

步骤 1:Fork 仓库

访问 https://github.com/k1tbyte/Wand-Enhancer,点击右上角 “Fork” 创建个人副本。

步骤 2:启用 GitHub Actions

进入你 Fork 的仓库 → “Actions” 标签 → 启用 Workflows。

步骤 3:运行构建工作流

选择 “Build executable” 工作流 → “Run workflow” → 保持默认分支 → 启动构建。

步骤 4:下载构建产物

等待构建完成(通常 5-10 分钟),进入完成的 Run → 下载 Artifact(ZIP 压缩包)。

步骤 5:解压并运行

提取 WandEnhancer.exe,按照向导选择 Wand 安装路径并应用补丁。

3.3 本地源码构建

# 克隆仓库
git clone https://github.com/k1tbyte/Wand-Enhancer.git
cd Wand-Enhancer

# 安装依赖(自动执行)
# - pnpm install(Web Panel)
# - CMake build(Native Helper)
# - MSBuild(WPF Solution)
build.cmd

构建脚本会自动完成所有依赖安装和编译步骤,最终输出 WandEnhancer.exe

四、使用方法与实战

4.1 基础使用流程

  1. 启动 WandEnhancer.exe
  2. 选择 Wand 安装路径(通常为 C:\Users\<用户名>\AppData\Local\Programs\Wand
  3. 配置补丁选项
    • 启用/禁用 Remote Web Panel
    • 添加自定义 JavaScript 脚本
  4. 点击 “Patch” 等待完成
  5. 重启 Wand 应用

4.2 远程 Web 面板配置

局域网访问:

  1. 确保 PC 和手机处于同一 Wi-Fi 网络
  2. 在 WandEnhancer 中悬停 “Connect” 按钮
  3. 使用手机扫描 QR 码访问控制面板

远程访问(跨网络):

  • 使用 Tailscale 等 VPN 工具建立虚拟局域网
  • 在 Tailscale 网络中访问 PC 的 IP:3223

安全注意事项:

  • 面板使用 HTTP 明文传输,无配对码保护
  • 仅在受信任的局域网或 VPN 中使用
  • 切勿将端口 3223 直接暴露到公网

4.3 自定义脚本注入实战

场景:自动隐藏特定 UI 元素

// renderer-scripts/hide-annoying-banner.js
if (!globalThis.__bannerHiderInstalled) {
  globalThis.__bannerHiderInstalled = true;

  const style = document.createElement('style');
  style.textContent = `
    .annoying-banner-class {
      display: none !important;
    }
  `;
  document.head.appendChild(style);

  WandEnhancer.log("Banner hider script loaded");
}

场景:拦截并修改 API 请求

// renderer-scripts/api-interceptor.js
if (!globalThis.__apiInterceptorInstalled) {
  globalThis.__apiInterceptorInstalled = true;

  const originalFetch = window.fetch;
  window.fetch = async (...args) => {
    const [url, options] = args;
    
    // 修改特定请求
    if (url.includes('/api/trainer')) {
      WandEnhancer.log(`Intercepted trainer API: ${url}`);
      // 可添加自定义 headers 或修改 body
    }
    
    return originalFetch(...args);
  };
}

4.4 故障排查

Windows Defender 警告:

  • GitHub Actions 构建的产物未签名,可能触发 SmartScreen 警告
  • 解决方案:在 Windows 安全中心添加排除项,或确认来源后点击"仍要运行"

远程面板无法访问:

  1. 检查 PC 和手机是否在同一网络
  2. 确认路由器未启用 AP 隔离(Guest Wi-Fi 常见)
  3. Windows 防火墙允许入站 TCP 3223 端口
  4. 将网络配置从"公用"改为"专用"

五、常见问题与解决方案

Q1: 为什么没有预编译的 .exe 下载?

原因: 项目作者发现大量诈骗者使用该项目的名义传播恶意软件,因此采用"仅源码分发 + 用户自行构建"策略。

解决方案: 从你的 Fork 的 GitHub Actions 构建产物下载,确保代码来源可信。

Q2: 构建失败,缺少 .NET Framework 4.8?

解决方案: 安装 .NET Framework 4.8 Developer Pack,包含目标包和构建工具。

Q3: Patch 后 Wand 无法启动?

可能原因:

  • Wand 版本更新导致兼容性问题
  • ASAR 文件损坏

解决方案:

  1. 重新安装 Wand 官方版本
  2. 等待 WandEnhancer 更新适配新版本
  3. 检查项目 Issues 是否有相关讨论

Q4: 自定义脚本不生效?

排查步骤:

  1. 确认脚本使用 .js 扩展名
  2. 检查语法错误(使用浏览器开发者工具测试)
  3. 确认 Remote Web Panel 已启用(脚本依赖相同的注入机制)
  4. 添加 WandEnhancer.log() 调试输出

Q5: 如何获取项目更新通知?

在 GitHub 仓库中选择 Watch → Custom → Releases,当有新版本发布时接收邮件通知。

六、技术价值与启发

Wand-Enhancer 项目展示了几个值得关注的技术方向:

  1. Electron 应用逆向与扩展:通过修改 ASAR fuse 字节实现客户端功能增强,这一技术可应用于其他 Electron 应用的本地化定制。

  2. 安全分发模式:“仅源码 + GitHub Actions 构建"模式有效防止第三方恶意分发,值得开源项目借鉴。

  3. 插件化架构设计:自定义脚本注入机制提供了灵活的扩展能力,用户无需修改核心代码即可实现定制功能。

  4. 远程控制面板:局域网 HTTP + WebSocket 服务器的实现模式,可扩展到其他桌面应用的远程管理场景。

项目地址:https://github.com/k1tbyte/Wand-Enhancer

⚠️ 免责声明: 本工具仅用于学习和研究目的,请勿用于违反软件许可协议或相关法律法规的场景。使用前请务必阅读项目的 Legal Disclaimer。