我正在尝试在 c# 中开发一个袜子隧道应用程序,该应用程序能够通过使用添加和修改的标头请求(类似于Modify Header Firefox Addon)打开网站并通过代理(最好使用袜子)来隧道数据。请任何人都可以指定我可能需要的任何资源吗?或者任何可以执行相同功能的替代品,我可以构建的开源等等。谢谢!
ps:应用程序也应该能够打开https和其他常见的网络协议
一种方法是使用HttpSys
和创建本地代理服务器来处理环回127.0.0.1
地址上的请求。您将系统代理更改为此地址/端口并位于客户端和服务器之间。
这将允许您修改请求/响应数据包和标头。这里有一个C# 中这种方法的示例,我在下面对此进行了修改以显示它是如何工作的。
public class MyProxy
{
private readonly HttpListener listener;
public MyProxy()
{
listener = new HttpListener();
}
public void Start()
{
listener.Prefixes.Add("http://*:8888/");
listener.Prefixes.Add("https://*:8889/");
listener.Start();
Console.WriteLine("Proxy started, hit enter to stop");
listener.BeginGetContext(GetContextCallback, null);
Console.ReadLine();
listener.Stop();
}
public void GetContextCallback(IAsyncResult result)
{
var context = listener.EndGetContext(result);
listener.BeginGetContext(GetContextCallback, null);
var request = context.Request;
var response = context.Response;
var url = request.Url;
UriBuilder builder = new UriBuilder(url);
builder.Port = url.Port == 8888 ? 80 : 443;
url = builder.Uri;
WebRequest webRequest = WebRequest.Create(url);
webRequest.Proxy = GlobalProxySelection.GetEmptyWebProxy();
WebResponse webResponse = webRequest.GetResponse();
using (Stream reader = webResponse.GetResponseStream())
{
using (Stream writer = response.OutputStream)
{
reader.CopyTo(writer);
}
}
}
}
这种方法的缺点是它的级别很低,并且会影响用户机器上的所有流量,这可能是不可取的。您必须处理 SSL 请求,并且它还会影响任何现有的已配置代理。
另一种替代方法是使用Microsoft Internet Controls
COM 组件并扩展WebBrowser
类。这里有一个 SO question显示了这种方法。不幸的是WebBrowser
,.NET 命名空间中的版本没有实现请求响应对象。有趣的部分如下。
public class ExtendedWebBrowser : WebBrowser
{
...
void BeforeNavigate(object pDisp, ref object url, ref object flags,
ref object targetFrameName, ref object postData,
ref object headers, ref bool cancel)
{
if (!headers.Contains("X-RequestFlag")
{
headers += "X-RequestFlag: true\r\n";
// append custom header here
// cancel current request
cancel = true;
// re-request with amended details
Navigate((string)url, (string)targetFrameName, (byte[])postData,
(string)headers);
}
else
{
base.BeforeNavigate(...);
}
}
}