использование Tor в качестве прокси

Я пытаюсь использовать Tor-Server в качестве прокси-сервера в HttpWebRequest , мой код выглядит так:

 HttpWebRequest request; HttpWebResponse response; request = (HttpWebRequest)WebRequest.Create("http://www.google.com"); request.Proxy = new WebProxy("127.0.0.1:9051"); response = (HttpWebResponse)request.GetResponse(); response.Close(); 

он отлично работает с «обычными» прокси, но с Tor я получаю исключения во время вызова

GetResponse() with Status = ServerProtocolViolation. The message is (in German...):Message = "Der Server hat eine Protokollverletzung ausgeführt.. Section=ResponseStatusLine"

    Если у вас установлено и работает privoxy, вы можете сделать

     request.Proxy = new WebProxy("127.0.0.1:8118"); // default privoxy port 

    Это позволит вам делать запросы, используя

    Tor не является прокси-сервером HTTP. Это прокси-сервер SOCKS. Вы можете использовать прокси-сервер HTTP, который поддерживает пересылку на SOCKS (например, Privoxy) и подключается к нему с помощью кода.

    Да, как сказал другой плакат, нужен клиент для носков. Некоторые библиотеки – это прокси- сервер Starksoft Proxy , ProxySocket и компонентный прокси- сервер . sockscap – это инструмент, который перехватывает и перенаправляет вызовы winsock, а privoxy – это локальный прокси-сервер, который может туннелировать ваши запросы поверх носков. Несколько различных решений.

    Используйте библиотеку «SocksWebProxy». Вы можете использовать его с WebClient & WebRequest (просто назначьте новый SocksWebProxy атрибуту * .Proxy). Нет необходимости в Privoxy или аналогичной услуге для перевода трафика HTTP на tor.

    https://github.com/Ogglas/SocksWebProxy

    Я сделал некоторые расширения для него, включив порт управления. Вот как вы могли бы запустить Tor в фоновом режиме без пула Tor Browser Bundle и управлять Tor, мы можем использовать Telnet или отправлять команды программно через Socket.

     Socket server = null; //Authenticate using control password IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9151); server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); server.Connect(endPoint); server.Send(Encoding.ASCII.GetBytes("AUTHENTICATE \"your_password\"" + Environment.NewLine)); byte[] data = new byte[1024]; int receivedDataLength = server.Receive(data); string stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength); //Request a new Identity server.Send(Encoding.ASCII.GetBytes("SIGNAL NEWNYM" + Environment.NewLine)); data = new byte[1024]; receivedDataLength = server.Receive(data); stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength); if (!stringData.Contains("250")) { Console.WriteLine("Unable to signal new user to server."); server.Shutdown(SocketShutdown.Both); server.Close(); } else { Console.WriteLine("SIGNAL NEWNYM sent successfully"); } 

    Шаги для настройки Tor:

    1. Скопируйте torrc-defaults в каталог, в котором находится tor.exe. Каталог по умолчанию, если вы используете браузер Tor: «~ \ Tor Browser \ Browser \ TorBrowser \ Data \ Tor”
    2. Откройте окно подсказки cmd
    3. chdir в каталог, где находится tor.exe. Каталог по умолчанию, если вы используете браузер Tor: «~ \ Tor Browser \ Browser \ TorBrowser \ Tor \”
    4. Создайте пароль для доступа к управляющему порту Tor. tor.exe --hash-password “your_password_without_hyphens” | more
    5. Добавьте свой пароль password hash в torrc-defaults в ControlPort 9151. Он должен выглядеть примерно так: hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507 . Если вы принимаете свой пароль как «пароль», вы можете скопировать строку выше.
    6. Теперь вы можете получить доступ к управлению Tor через Telnet после его запуска. Теперь код может запускаться, просто отредактируйте путь к тому месту, где находятся файлы Tor в программе. Проверка модификации Tor через Telnet:
    7. Запустите tor с помощью следующей команды: tor.exe -f .\torrc-defaults
    8. Откройте другую подсказку cmd и введите: telnet localhost 9151
    9. Если все пойдет хорошо, вы увидите полностью черный экран. Введите « autenticate “your_password_with_hyphens” « Если все пойдет хорошо, вы должны увидеть «250 OK».
    10. Напечатайте « SIGNAL NEWNYM », и вы получите новый маршрут, ergo новый IP. Если все пойдет хорошо, вы должны увидеть «250 OK».
    11. Введите « setevents circ » (события схемы), чтобы включить вывод консоли
    12. Введите « getinfo circuit-status », чтобы увидеть текущие цепи

    Вам нужно «извлечь» stream из носков …

     Imports System.IO Imports System.Net Imports System.Net.Sockets Imports System.Text Imports System.Runtime.CompilerServices Public Class Form1 Sub Form1_Load() Handles Me.Load Dim Host As String = "google.com" Dim P As New SocksProxy("localhost", 64129) 'Set your socks proxy here Dim Stream As NetworkStream = P.GetStream(Host, 80) Dim buffer As Byte() = Download(Stream, Host, "") My.Computer.FileSystem.WriteAllBytes("C:\webpage.html", buffer, False) MsgBox("ok") End Sub Function Download(Stream As NetworkStream, Host As String, Resource As String) As Byte() Using writer = New StreamWriter(Stream) writer.Write(String.Format("GET /{2} HTTP/1.1{0}Host: {1}{0}{0}", vbCrLf, Host, Resource)) writer.Flush() Dim byteList As New List(Of Byte) Dim bufferSize As Integer = 4096 Dim buffer(bufferSize - 1) As Byte Do Dim bytesRead As Integer = Stream.Read(buffer, 0, bufferSize) byteList.AddRange(buffer.Take(bytesRead)) Loop While Stream.DataAvailable Return byteList.ToArray End Using End Function End Class Public Class SocksProxy Private _SocksHost As String Private _SocksPort As Integer Sub New(SocksHost As String, SocksPort As Integer) _SocksHost = SocksHost _SocksPort = SocksPort End Sub Function GetStream(HostDest As String, PortDest As Short) As NetworkStream Dim client As TcpClient = New TcpClient() client.Connect(_SocksHost, _SocksPort) Dim stream As NetworkStream = client.GetStream() 'Auth Dim buf = New Byte(299) {} buf(0) = &H5 buf(1) = &H1 buf(2) = &H0 stream.Write(buf, 0, 3) ReadExactSize(stream, buf, 0, 2) If buf(0) <> &H5 Then Throw New IOException("Invalid Socks Version") End If If buf(1) = &HFF Then Throw New IOException("Socks Server does not support no-auth") End If If buf(1) <> &H0 Then Throw New Exception("Socks Server did choose bogus auth") End If buf(0) = &H5 buf(1) = &H1 buf(2) = &H0 buf(3) = &H3 Dim domain = Encoding.ASCII.GetBytes(HostDest) buf(4) = CByte(domain.Length) Array.Copy(domain, 0, buf, 5, domain.Length) Dim port = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(CShort(PortDest))) buf(5 + domain.Length) = port(0) buf(6 + domain.Length) = port(1) stream.Write(buf, 0, domain.Length + 7) ' Reply ReadExactSize(stream, buf, 0, 4) If buf(0) <> &H5 Then Throw New IOException("Invalid Socks Version") End If If buf(1) <> &H0 Then Throw New IOException(String.Format("Socks Error {0:X}", buf(1))) End If Dim rdest = String.Empty Select Case buf(3) Case &H1 ' IPv4 ReadExactSize(stream, buf, 0, 4) Dim v4 = BitConverter.ToUInt32(buf, 0) rdest = New IPAddress(v4).ToString() Exit Select Case &H3 ' Domain name ReadExactSize(stream, buf, 0, 1) If buf(0) = &HFF Then Throw New IOException("Invalid Domain Name") End If ReadExactSize(stream, buf, 1, buf(0)) rdest = Encoding.ASCII.GetString(buf, 1, buf(0)) Exit Select Case &H4 ' IPv6 Dim octets = New Byte(15) {} ReadExactSize(stream, octets, 0, 16) rdest = New IPAddress(octets).ToString() Exit Select Case Else Throw New IOException("Invalid Address type") End Select ReadExactSize(stream, buf, 0, 2) Dim rport = CUShort(IPAddress.NetworkToHostOrder(CShort(BitConverter.ToUInt16(buf, 0)))) Return stream End Function Private Sub ReadExactSize(stream As NetworkStream, buffer As Byte(), offset As Integer, size As Integer) While size <> 0 Dim read = stream.Read(buffer, offset, size) If read < 0 Then Throw New IOException("Premature end") End If size -= read offset += read End While End Sub End Class 
    Interesting Posts

    Что такое исключение NullPointerException и как его исправить?

    Использование свойств Scala с реализованными методами в Java

    Студия Android – Не удалось найти целевой Android-18

    Лучший способ сравнить даты в Android

    Разделить коллекцию на `n` части с LINQ?

    Использование удаленного рабочего стола для подключения к другим компьютерам за одним IP-адресом

    Какая файловая система для совместного использования (чтение / запись) внешнего диска PC / Mac?

    Большая копия Win7 x64 Ошибка создания файла – Срок таймаута семафора истек

    Как проверить в Git по дате?

    Значение тега ориентации EXIF ​​всегда 0 для изображения, сделанного с помощью приложения для портретов с вертикальной камерой

    Неплохо ли использовать рефлексию в модульном тестировании?

    Используя оператор равенства == для сравнения двух строк для равенства в C

    Как перенаправить qDebug, qWarning, qCritical etc output?

    Замена символа в указанном индексе в строке?

    Как заставить Debian использовать размер физического сектора на жестком диске?

    Давайте будем гением компьютера.