C# .NET本机应用程序等效于修改头Firefox插件
我试图在c#中开发一个socks隧道应用程序,它能够通过使用添加和修改的头请求(类似于)打开网站,并通过代理(socks更好)隧道数据。请指定我可能需要的资源?或者任何可以执行相同功能的替代方案,或者我可以构建的开源软件,等等。谢谢C# .NET本机应用程序等效于修改头Firefox插件,c#,.net,proxy,header,tunneling,C#,.net,Proxy,Header,Tunneling,我试图在c#中开发一个socks隧道应用程序,它能够通过使用添加和修改的头请求(类似于)打开网站,并通过代理(socks更好)隧道数据。请指定我可能需要的资源?或者任何可以执行相同功能的替代方案,或者我可以构建的开源软件,等等。谢谢 ps:应用程序还应该能够打开https和其他常见网络协议,一种方法是使用HttpSys并创建本地代理服务器来处理环回127.0.0.1地址上的请求。您需要将系统代理更改为此地址/端口,并位于客户端和服务器之间 这将允许您修改请求/响应数据包和头。这种方法在C#中有一
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请求,并且它还将影响任何现有配置的代理
另一种替代方法是使用MicrosoftInternetControls
COM组件并扩展WebBrowser
类。有一个这样的例子说明了方法。不幸的是,.NET命名空间中的WebBrowser
版本没有实现请求-响应对象。下面是有趣的部分
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(...);
}
}
}
非常感谢你写得很好的回答。实际上,我希望应用程序影响所有流量,但我不知道如何尝试ssl请求并通过同一个代理返回它。我希望有一些代码资源接近于此。您需要使用您自己的(自签名?)证书作为受信任的CA安装。这允许客户端向您的代理发出SSL请求,然后您可以解密,因为您知道私钥。然后像往常一样使用.NET WebRequest API通过SSL将请求发送到实际地址。我在Internet上查看了一个示例,但没有看到。你能帮我拿一个吗?感谢下面的示例演示了如何使用
SslStream
绑定到SSL并读取内容-这样您就可以使用本地SSL代理。当您请求真正的内容(在上下文请求中使用Url)时,您只需要像平常一样使用WebRequest/WebResponse
对象,SSL就发生在幕后。任何问题都可能引发新问题。希望能有所帮助。实际上很抱歉,在使用WebRequest
发出实际请求之前,您需要映射端口。e、 代理8888是端口80,8889是443。您还需要确保设置webRequest.Proxy=GlobalProxySelection.GetEmptyWebProxy()代码>