如何开发可重定向指定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:
- 安装依赖:
pip install mitmproxy psutil - 编写拦截脚本
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
- 打包成EXE:
pyinstaller --onefile --add-data "C:\Python\Lib\site-packages\mitmproxy;mitmproxy" redirect_script.py
内容的提问来源于stack exchange,提问作者dunia ka papa
相关产品推荐
相关产品推荐

