You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何开发可重定向指定EXE发出的GET请求的独立程序?

实现特定EXE的HTTP请求重定向独立工具

核心思路

  • 搭建本地HTTP代理服务器,精准拦截目标EXE发出的HTTP请求
  • 匹配指定GET请求的URL,将其重定向到自定义目标地址
  • 避免影响系统全局代理,仅针对目标程序生效

具体实现方案(C# + .NET)

1. 项目初始化

创建.NET Framework 4.8的WinForms项目(生成EXE更便捷),通过NuGet安装Titanium.Web.Proxy库——这是一个轻量易用的HTTP代理开发库。

2. 核心代码实现

以下是带界面交互的核心逻辑,可直接嵌入WinForms窗体:

using Titanium.Web.Proxy;
using Titanium.Web.Proxy.Models;
using System;
using System.Windows.Forms;
using System.Diagnostics;

public partial class RedirectToolForm : Form
{
    private ProxyServer _proxy;
    private int _proxyPort = 8888;

    public RedirectToolForm()
    {
        InitializeComponent();
        InitProxy();
    }

    private void InitProxy()
    {
        _proxy = new ProxyServer();
        var endPoint = new ExplicitProxyEndPoint(System.Net.IPAddress.Loopback, _proxyPort, true);
        _proxy.AddEndPoint(endPoint);
        _proxy.BeforeRequest += OnRequestIntercept;
    }

    private async void OnRequestIntercept(object sender, SessionEventArgs e)
    {
        // 跳过非GET请求
        if (!e.HttpClient.Request.Method.Equals("GET", StringComparison.OrdinalIgnoreCase)) return;

        // 获取请求来源进程
        try
        {
            var process = Process.GetProcessById(e.HttpClient.Request.ProcessId);
            var targetExe = txtTargetExe.Text.Trim();
            var originalUrl = txtOriginalUrl.Text.Trim();
            var redirectUrl = txtRedirectUrl.Text.Trim();

            // 匹配目标EXE和请求URL
            if (!string.IsNullOrEmpty(targetExe) && process.MainModule.FileName.Equals(targetExe, StringComparison.OrdinalIgnoreCase) &&
                e.HttpClient.Request.RequestUri.AbsoluteUri.Equals(originalUrl, StringComparison.OrdinalIgnoreCase))
            {
                // 执行重定向
                e.Redirect(redirectUrl);
            }
        }
        catch { } // 忽略进程获取失败的情况
    }

    private void btnStart_Click(object sender, EventArgs e)
    {
        if (string.IsNullOrWhiteSpace(txtTargetExe.Text) || string.IsNullOrWhiteSpace(txtOriginalUrl.Text) || string.IsNullOrWhiteSpace(txtRedirectUrl.Text))
        {
            MessageBox.Show("请填写完整参数");
            return;
        }

        try
        {
            _proxy.Start();
            btnStart.Enabled = false;
            btnStop.Enabled = true;
            MessageBox.Show($"代理已启动,端口:{_proxyPort}\n请确保目标EXE使用代理 127.0.0.1:{_proxyPort}");
        }
        catch (Exception ex)
        {
            MessageBox.Show($"启动失败:{ex.Message}");
        }
    }

    private void btnStop_Click(object sender, EventArgs e)
    {
        _proxy.Stop();
        btnStart.Enabled = true;
        btnStop.Enabled = false;
        MessageBox.Show("代理已停止");
    }
}

3. 代理配置技巧

  • 简易方案:修改目标EXE的快捷方式,在目标路径后添加参数 --proxy-server=127.0.0.1:8888(需目标程序支持命令行代理参数)
  • 进阶方案:通过Win32 API修改目标进程的WinINet代理设置,无需用户手动配置,适合对易用性要求高的场景

4. 打包分发

在项目属性的“生成”选项中,设置输出为单文件EXE,或使用ILMerge工具合并依赖库,生成独立可执行文件,直接发给朋友即可。

替代方案(Python + mitmproxy)

如果熟悉Python,也可以用mitmproxy实现拦截逻辑,再用PyInstaller打包成EXE:

  1. 安装依赖:pip install mitmproxy psutil
  2. 编写拦截脚本redirect_script.py:
from mitmproxy import http
import psutil

def request(flow: http.HTTPFlow) -> None:
    target_exe = "D:\\Path\\To\\Target.exe"  # 可改成从命令行或配置文件读取
    original_url = "https://example.com/original"
    redirect_url = "https://your-target.com/new"

    try:
        pid = flow.client_conn.server_conn.pid
        process = psutil.Process(pid)
        if process.exe() == target_exe and flow.request.method == "GET" and flow.request.url == original_url:
            flow.request.url = redirect_url
    except:
        pass
  1. 打包成EXE:pyinstaller --onefile --add-data "C:\Python\Lib\site-packages\mitmproxy;mitmproxy" redirect_script.py

内容的提问来源于stack exchange,提问作者dunia ka papa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:20:21