Приложение .NET Native эквивалент Modify Headers Firefox Addon

Я пытаюсь разработать приложение для туннелирования socks на C #, которое может открывать веб-сайт, используя запросы добавления и изменения заголовков (что-то похожее на Modify Header Firefox Addon) и туннелируют данные через прокси (предпочтительно socks). Кто-нибудь может указать какие-либо ресурсы, которые мне могут понадобиться для этого? Или любая альтернатива, которая может выполнять ту же функцию, может быть с открытым исходным кодом, на котором я могу построить и т. Д. Спасибо!

ps: приложения также должны иметь возможность открывать https и другие распространенные сетевые протоколы


person Chibueze Opata    schedule 30.08.2011    source источник


Ответы (1)


Один из способов - использовать 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. Здесь есть такой вопрос, который показывает подход. К сожалению, версия 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(...);
         }
    }
}
person TheCodeKing    schedule 03.09.2011
comment
Большое спасибо за хорошо написанный ответ. Я действительно хочу, чтобы приложение влияло на весь трафик, но я не знаю, как проверять ssl-запросы и возвращать их через тот же прокси. Я ожидал некоторого ресурса кода, близкого к этому. - person Chibueze Opata; 04.09.2011
comment
Вам нужно будет использовать свой собственный (самоподписанный?) Сертификат, установленный в качестве доверенного центра сертификации. Это позволяет клиенту делать SSL-запросы к вашему прокси-серверу, которые вы затем можете расшифровать, зная закрытый ключ. Затем вы отправляете запрос на реальный адрес через SSL, как обычно, с помощью API .NET WebRequest. - person TheCodeKing; 04.09.2011
comment
Я поискал в Интернете пример, но не нашел. Не могли бы вы мне помочь с одним? Спасибо - person Chibueze Opata; 04.09.2011
comment
С каким битом вам нужна помощь? Может, стоит задать новый вопрос? - person TheCodeKing; 04.09.2011
comment
Спасибо. Я знаю, как создавать самозаверяющие сертификаты, но ничего не знаю о том, как отправить запрос на реальный адрес через SSL. И твой ответ в порядке, просто хочу посмотреть, получу ли я что-нибудь еще. Спасибо - person Chibueze Opata; 06.09.2011
comment
Здесь есть пример , показывающий, как подключиться к SSL и читать контент с помощью SslStream - это так что у вас может быть локальный прокси SSL. К тому времени, когда вы запрашиваете реальный контент (используйте URL-адрес в запросе контекста), вам просто нужно использовать WebRequest/WebResponse объектов как обычно, SSL выполняется за кулисами. Любые проблемы могут начать новый вопрос. Надеюсь, это поможет. - person TheCodeKing; 07.09.2011
comment
На самом деле извините, вам нужно сопоставить порты, прежде чем делать фактический запрос с помощью WebRequest. например прокси 8888 - это порт 80, 8889 - это 443. Вам также необходимо убедиться, что вы установили webRequest.Proxy=GlobalProxySelection.GetEmptyWebProxy(); - person TheCodeKing; 07.09.2011