Skip to content

1783157448/ProcessProxy

Repository files navigation

ProcessProxy

ProcessProxy 是一个基于 WPF + .NET 8 + sing-box 的 Windows 桌面进程代理工具。 image

它的核心目标不是做系统全局代理,而是让你只为指定进程启用代理:你可以手动添加进程名、选择可执行文件,或通过准星拖拽捕获窗口所属进程,然后将这些进程及其子进程的网络流量定向到指定代理节点。

本项目适合以下场景:

  • 只希望某些应用走代理,而不是整个系统都走代理
  • 需要对桌面程序进行按进程分流
  • 希望可视化管理代理节点、进程列表、流量和日志
  • 希望基于 sing-box 实现本地 TUN + 规则路由的桌面化封装

项目特性

  • 按进程代理
    • 仅将选中的进程路由到代理
    • 非目标流量默认直连
  • 子进程自动跟踪
    • 监控主进程后,会自动识别并处理其子进程
  • 多种添加进程方式
    • 手动输入进程名
    • 选择 .exe 文件
    • 准星拖拽捕获窗口对应进程
  • 多协议代理节点支持
    • Socks5
    • HTTP
    • Shadowsocks
    • VMess
    • VLESS
    • Trojan
    • Hysteria2
  • 节点导入能力
    • 支持单条或多条分享链接导入
    • 支持通过订阅 URL 拉取并解析节点
  • 节点延迟测试
    • 支持单节点测试
    • 支持全部节点批量测试
  • 日志与流量监控
    • 查看 sing-box 输出日志
    • 实时显示总上传 / 总下载
    • 显示各目标进程的发送 / 接收流量
  • 设置项支持
    • 开机自启
    • 反检测开关
    • 随机窗口标题
    • 随机 TUN 子网
    • 随机 API 端口
    • DNS 泄漏保护
  • 桌面体验优化
    • 托盘驻留
    • 最小化隐藏到系统托盘
    • 托盘菜单可快速启停代理与退出程序

项目定位

ProcessProxy 的定位是一个 Windows 本地桌面进程代理前端

它负责:

  • 管理代理节点
  • 管理需要走代理的目标进程
  • 生成 sing-box 配置
  • 启动 / 重载 / 停止 sing-box
  • 展示日志与流量数据
  • 持久化保存节点、进程和基础配置

不负责

  • 提供代理服务端
  • 实现代理协议本身
  • 做系统级全局 VPN 管理界面
  • 替代 sing-box 核心能力

换句话说,这个项目本质上是:

一个将 sing-box、WPF UI、进程监控、节点管理、规则生成整合在一起的桌面工具。


技术栈

客户端与框架

  • .NET 8
  • WPF
  • CommunityToolkit.Mvvm
  • HandyControl

数据与依赖注入

  • Microsoft.EntityFrameworkCore.Sqlite
  • Microsoft.Extensions.DependencyInjection

系统能力

  • System.Management
    • 用于基于 WMI 监听进程启动 / 退出
  • Windows Forms NotifyIcon
    • 用于系统托盘图标与菜单
  • user32.dll
    • 用于通过屏幕坐标捕获窗口对应进程

代理核心

  • sing-box
    • 项目通过外部进程方式启动 driver/sing-box.exe
    • 使用 TUN 入站、DNS 规则、进程名路由和 Clash API 统计接口

运行原理

整体流程

  1. 程序启动后初始化依赖注入容器
  2. 从 SQLite 数据库加载代理节点与已保存的进程条目
  3. 用户选择代理节点,并添加要代理的目标进程
  4. 启用代理时,程序根据当前节点与进程列表生成 sing-box-config.json
  5. 启动 sing-box.exe 并加载该配置
  6. 通过定时器周期读取 sing-box 提供的流量与连接信息
  7. 当被监控进程或子进程变化时,自动触发配置重载

路由行为

当前配置生成逻辑具有以下特点:

  • 启用 tun 入站
  • 对 DNS 请求执行 hijack-dns
  • ProcessProxy.exesing-box.exe 自身强制直连
  • 被选中的进程名通过 proxy 出站转发
  • 私网 IP 走 direct
  • 其余流量最终走 direct

这意味着:

  • 只有你显式加入列表的目标进程会走代理
  • 程序本身和 sing-box 不会被自己的规则再次代理
  • 这不是系统全局代理模式

支持的代理类型

手动添加支持

  • Socks5
  • HTTP
  • Shadowsocks
  • VMess
  • VLESS
  • Trojan
  • Hysteria2

分享链接解析支持

当前分享链接解析器支持以下协议:

  • ss://
  • vmess://
  • vless://
  • trojan://
  • hy2://
  • hysteria2://
  • socks5://
  • socks://

订阅导入支持

  • 支持输入 http://https:// 订阅地址
  • 程序会先拉取远程内容
  • 优先尝试 Base64 解码
  • 然后按多行分享链接进行解析

当前限制

  • http:// / https:// 形式的内容在导入逻辑中默认被识别为订阅地址,而不是 HTTP 代理分享链接
  • 节点延迟测试使用的是 TCP 连接耗时,并不是完整代理握手后的真实性能测试

核心功能说明

1. 进程管理

支持三种方式添加代理目标进程:

  • 按进程名添加
    • 例如输入 chrome,内部会规范化为 chrome.exe
  • 按文件选择添加
    • 通过文件选择器选择一个 .exe
  • 准星拖拽捕获
    • 拖动准星到目标窗口上,自动识别该窗口所属进程

进程条目会显示:

  • PID
  • 进程名
  • 窗口标题
  • 代理状态
  • 发送流量
  • 接收流量
  • 主进程 / 子进程标识

2. 子进程自动跟踪

程序会通过 WMI 监听进程启动与退出事件。

当你监控某个主进程后:

  • 新启动的子进程会自动识别
  • 子进程会自动加入列表
  • 若当前代理已开启,会触发 sing-box 重载,使新子进程也立即受代理规则影响

3. 代理节点管理

可以在节点管理窗口中执行:

  • 新增节点
  • 编辑节点
  • 删除节点
  • 导入分享链接或订阅
  • 单个节点延迟测试
  • 全部节点延迟测试

4. 设置管理

设置窗口支持以下选项:

  • 开机自启
    • 写入 HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
  • 反检测总开关
  • 随机窗口标题
  • 随机 TUN 子网
  • 随机 API 端口
  • DNS 泄漏保护

需要注意的是:

  • 随机窗口标题、随机 TUN 子网、随机 API 端口、DNS 泄漏保护在代码中都受 反检测总开关 控制
  • 如果未开启反检测总开关,即使子选项为启用状态,也不会真正应用

5. 日志与托盘

  • 主界面底部可打开日志窗口
  • 日志窗口会周期性刷新 sing-box 输出
  • 程序最小化后会隐藏到系统托盘
  • 托盘菜单支持:
    • 显示主窗口
    • 启用 / 停用代理
    • 退出程序

项目结构

ProcessProxy/
├─ App.xaml                         # WPF 应用资源入口
├─ App.xaml.cs                      # 应用启动与依赖注入注册
├─ MainWindow.xaml                  # 主窗口界面
├─ MainWindow.xaml.cs               # 主窗口交互、托盘、窗口行为
├─ ProcessProxy.csproj              # 项目文件
├─ AssemblyInfo.cs                  # WPF 主题资源配置
├─ Controls/
│  ├─ CrosshairControl.xaml         # 准星控件界面
│  └─ CrosshairControl.xaml.cs      # 准星捕获逻辑
├─ Data/
│  └─ AppDbContext.cs               # EF Core Sqlite 上下文
├─ Helpers/
│  ├─ NullToVisibilityConverter.cs  # 绑定转换器
│  └─ TrafficFormatter.cs           # 流量格式化工具
├─ Models/
│  ├─ AppSetting.cs                 # 应用设置实体
│  ├─ ProcessEntry.cs               # 持久化进程条目实体
│  ├─ ProcessItem.cs                # 主界面进程项模型
│  ├─ ProxyInfo.cs                  # 代理节点实体
│  └─ ProxyType.cs                  # 代理类型枚举
├─ Services/
│  ├─ AntiDetectionService.cs       # 反检测辅助逻辑
│  ├─ AppConfigService.cs           # config.json 读写
│  ├─ AutoStartService.cs           # 开机自启注册表操作
│  ├─ LatencyTestService.cs         # TCP 延迟测试
│  ├─ ProcessService.cs             # 进程捕获、WMI 监听、子进程追踪
│  ├─ ProxyRepository.cs            # 数据访问封装
│  ├─ ShareLinkParser.cs            # 分享链接解析器
│  ├─ SingBoxConfig.cs              # sing-box 配置生成器
│  ├─ SingBoxService.cs             # sing-box 生命周期管理与 API 通信
│  └─ SubscriptionService.cs        # 订阅拉取与解析
├─ ViewModels/
│  ├─ LogViewModel.cs               # 日志窗口 VM
│  ├─ MainViewModel.cs              # 主界面核心业务 VM
│  ├─ ProxyInfoViewModel.cs         # 代理节点 VM
│  ├─ ProxyManageViewModel.cs       # 节点管理 VM
│  └─ SettingsViewModel.cs          # 设置窗口 VM
├─ Views/
│  ├─ InputDialog.xaml              # 输入弹窗
│  ├─ LogWindow.xaml                # 日志窗口
│  ├─ ProxyManageWindow.xaml        # 节点管理窗口
│  └─ SettingsWindow.xaml           # 设置窗口
└─ driver/
   └─ sing-box.exe                  # 代理核心可执行文件

架构说明

启动层

App.xaml.cs 负责注册以下核心服务:

  • AppDbContext
  • ProxyRepository
  • SingBoxService
  • ProcessService
  • AppConfigService
  • MainViewModel
  • MainWindow

项目使用 Microsoft.Extensions.DependencyInjection 做简单的桌面应用依赖注入。

视图模型层

  • MainViewModel
    • 主界面核心协调者
    • 负责进程列表、代理状态、流量、日志联动
  • ProxyManageViewModel
    • 节点管理、导入、测试延迟
  • SettingsViewModel
    • 应用设置读写
  • LogViewModel
    • 日志缓冲与 UI 刷新

服务层

  • ProcessService
    • 进程识别、WMI 监听、子进程追踪
  • SingBoxService
    • 负责外部进程启动、停止、重载、流量与连接数据读取
  • SingBoxConfig
    • 根据节点和进程列表生成配置 JSON
  • ProxyRepository
    • 封装数据库持久化
  • SubscriptionService / ShareLinkParser
    • 负责订阅与节点导入

数据层

SQLite 数据库在运行时自动创建,包含以下表:

  • Proxies
    • 保存代理节点
  • ProcessEntries
    • 保存用户添加的进程名条目
  • AppSettings
    • 保存例如 SelectedProxyId 这类简单键值配置

开发环境要求

必需环境

  • Windows 10 或 Windows 11
  • .NET 8 SDK
  • 可用的 sing-box.exe

建议环境

  • Visual Studio 2022 或 JetBrains Rider
  • x64 环境运行
  • 以管理员权限运行程序(尤其是在 TUN 无法正常工作时)

关于管理员权限

本项目使用 sing-boxtun 入站能力。

在实际 Windows 环境中,TUN/路由相关能力通常对权限较敏感,因此:

  • 如果你发现代理无法启用
  • sing-box 无法成功创建 TUN / 路由
  • 或流量没有进入规则

请优先尝试:

  • 以管理员身份运行程序

当前项目中没有显式的管理员清单文件强制提权,因此是否需要管理员权限取决于实际系统环境与 sing-box 行为。


快速开始

1. 克隆仓库

git clone <your-repo-url>

2. 还原依赖

dotnet restore

3. 编译项目

dotnet build -c Release

4. 运行项目

dotnet run

5. 发布

如果你想生成发布目录,可以使用:

dotnet publish -c Release -r win-x64 --self-contained false

如果你计划把程序直接分发给其他人,请确认发布目录中包含 driver/sing-box.exe


使用说明

基本使用流程

  1. 打开程序
  2. 点击 管理 打开节点管理窗口
  3. 手动添加节点,或导入分享链接 / 订阅
  4. 在主界面选择一个代理节点
  5. 添加要代理的目标进程
  6. 打开 启用代理 开关
  7. 观察主界面状态栏、日志窗口和各进程流量数据

导入节点

你可以在节点管理窗口中输入:

  • 一条分享链接
  • 多条换行分隔的分享链接
  • 一个订阅 URL

添加目标进程

支持以下方式:

  • 直接输入进程名,例如:chrome
  • 选择目标 .exe
  • 将准星拖到目标窗口上

启动代理后会发生什么

  • 程序会扫描当前主进程的子进程树
  • 生成新的 sing-box-config.json
  • 启动 sing-box.exe
  • 启动 1 秒定时器刷新流量信息
  • 如果进程列表发生变化,会自动重载代理配置

停止代理后会发生什么

  • 停止 sing-box
  • 清空当前代理状态标记
  • 停止流量刷新
  • 状态栏更新为“代理已停用”

配置文件与运行时数据

这些文件位于程序运行目录(即 AppDomain.CurrentDomain.BaseDirectory),通常是:

  • 调试运行时:bin/Debug/net8.0-windows/
  • 发布运行时:发布输出目录

1. config.json

用于保存用户设置:

  • AutoStart
  • AntiDetection
  • RandomWindowTitle
  • RandomTunSubnet
  • RandomApiPort
  • DnsLeakProtection

2. processproxy.db

SQLite 数据库,用于保存:

  • 代理节点
  • 进程条目
  • 应用内部键值设置

3. sing-box-config.json

运行时生成的 sing-box 配置文件。

它不是手写维护文件,而是由程序根据:

  • 当前选中的代理节点
  • 当前需要代理的进程名
  • 当前设置项

自动生成。

4. driver/sing-box.exe

程序依赖的外部代理核心。

如果该文件不存在,程序将无法成功启动代理,并会在日志中输出类似“sing-box.exe 未找到”的信息。

5. app.ico(可选)

托盘初始化时会优先尝试读取运行目录下的 app.ico

  • 如果存在,则使用该图标
  • 如果不存在,则回退为系统默认应用图标

sing-box 配置生成说明

本项目不是直接维护固定的静态 sing-box 配置,而是通过 Services/SingBoxConfig.cs 动态生成。

当前生成内容包括

  • log
  • experimental.clash_api
  • dns
  • inbounds(TUN)
  • outbounds
  • route

DNS 规则

默认生成两个 DNS 服务器:

  • 8.8.8.8,通过 proxy 转发
  • 223.5.5.5,本地直连

当启用 DNS 泄漏保护时:

  • final DNS 服务器会指向 dns-remote

否则:

  • final DNS 服务器会指向 dns-direct

反检测相关

当启用反检测并打开相应选项后:

  • API 端口会随机化
  • TUN 地址会随机化
  • 主窗口标题会随机化
  • 可选择让 DNS 默认优先走远端解析

另外,当启用随机 TUN / 随机 API 端口时,程序还会:

  • 复制一份随机命名的 sing-box.exe
  • 使用该随机文件名启动
  • 停止时删除该临时副本

公开仓库前建议

如果你准备将本项目公开到 Git 仓库,建议重点检查以下内容:

1. 不要提交个人节点数据

建议不要提交包含你个人代理节点信息的运行时文件,例如:

  • processproxy.db
  • config.json
  • sing-box-config.json
  • 发布目录中的运行产物

虽然当前 .gitignore 已忽略常见 bin/obj/ 等目录,但你仍应确认本地是否还有额外私有数据文件未被提交。

2. 审核第三方二进制分发策略

当前仓库中存在:

  • driver/sing-box.exe

如果你打算公开仓库或分发发行版,请你自行确认:

  • 是否允许直接随仓库分发该二进制
  • 是否需要在仓库中补充第三方许可证说明
  • 是否更适合在 README 中说明“用户自行放入 driver/sing-box.exe

3. 增加许可证文件

当前项目根目录中未发现现成的 LICENSE 文件。

如果要公开发布,建议补充合适的开源许可证,例如:

  • MIT
  • Apache-2.0
  • GPL-3.0

具体选择取决于你的开源策略以及第三方依赖的兼容性要求。

4. 建议补充内容

为了让公开仓库更完整,建议后续再补充:

  • 软件截图
  • 版本发布记录
  • 许可证文件
  • 常见问题(FAQ)
  • 已知问题与路线图

已知限制

  • 仅支持 Windows
  • 依赖 sing-box.exe 外部可执行文件
  • TUN 模式在部分环境下可能需要管理员权限
  • 当前没有内置自动更新、安装器或服务化部署逻辑
  • 延迟测试仅为 TCP 连接耗时,不代表真实代理吞吐或完整握手性能
  • HTTP/HTTPS 形式的文本导入主要作为订阅地址处理,不是完整的 HTTP 节点分享链接解析方案
  • 当前未看到自动化测试工程,项目主要以桌面应用逻辑为主

适合继续扩展的方向

如果你后续准备继续完善项目,比较自然的扩展方向包括:

  • 增加更多协议 / 传输配置项
  • 增加节点分组、标签、搜索与排序
  • 增加系统代理联动或 PAC 支持
  • 增加导出 / 导入本地配置文件
  • 增加日志级别切换
  • 增加发布脚本与安装包
  • 增加自动检测 sing-box 版本与更新能力
  • 增加截图、文档站点和 GitHub Release 流程

依赖清单

项目当前直接引用的 NuGet 包包括:

  • CommunityToolkit.Mvvm 8.4.0
  • HandyControl 3.5.1
  • Microsoft.EntityFrameworkCore.Sqlite 8.0.13
  • Microsoft.Extensions.DependencyInjection 10.0.5
  • System.Management 10.0.5

此外还引用:

  • Microsoft.WindowsDesktop.App.WindowsForms

适用人群

这个项目比较适合以下开发者或使用者:

  • 需要做 Windows 桌面按进程分流的人
  • 希望将 sing-box 能力封装为 GUI 工具的人
  • 想学习 WPF + MVVM + DI + SQLite + 外部进程协作方式的人
  • 想做一个可视化的本地代理前端的人

致谢

本项目基于以下生态能力构建:

感谢这些项目提供的基础能力。


说明

本 README 基于当前仓库代码结构与实现整理而成,内容尽量与现有实现保持一致。

如果后续你继续扩展:

  • UI
  • 配置项
  • 协议支持
  • 发布方式
  • 存储结构

建议同步更新本 README,以保证公开仓库的可读性与可维护性。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages