it-swarm.com.de

tor als Proxy verwenden

Ich versuche, Tor-Server als Proxy in HttpWebRequest zu verwenden, mein Code sieht folgendermaßen aus:

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();

es funktioniert perfekt mit "normalen" Proxies, aber mit Tor bekomme ich beim Telefonieren Ausnahmen 

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

32
Lay

Wenn Sie privoxy installiert haben und ausführen, können Sie dies tun 

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

So können Sie Anfragen mit tor machen

34

Tor ist nicht ein HTTP-Proxy. Es ist ein SOCKS-Proxy. Sie können einen HTTP-Proxy verwenden, der die Weiterleitung auf SOCKS (wie Privoxy) unterstützt, und stattdessen eine Verbindung über Code herstellen.

22
Mehrdad Afshari

Ja, wie das andere Poster gesagt hat, wird ein Sockenclient benötigt. Einige Bibliotheken sind Starksoft Proxy , ProxySocket und ComponentSpace Socks Proxy . sockscap ist ein Tool, das Winsock-Aufrufe abfängt und umleitet, und privoxy ist ein lokaler Proxy, der Ihre Anfragen über Socken tunneln kann. Ein paar verschiedene Lösungen.

8
jspcal

Verwenden Sie die Bibliothek "SocksWebProxy". Sie können es mit WebClient & WebRequest verwenden (Weisen Sie einfach dem Attribut * .Proxy einen neuen SocksWebProxy zu). Es ist kein Privoxy- oder ähnlicher Dienst erforderlich, um den HTTP-Datenverkehr in tor umzuwandeln.

https://github.com/Ogglas/SocksWebProxy

Ich habe auch einige Erweiterungen vorgenommen, indem ich den Kontrollport aktiviert habe. So können Sie Tor im Hintergrund laufen lassen, ohne dass Tor Browser Bundle gestartet ist. Um Tor zu steuern, können Sie Telnet verwenden oder Befehle programmgesteuert über Socket senden.

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");
}

Schritte zum Konfigurieren von Tor:

  1. Kopieren Sie torrc-defaults in das Verzeichnis, in dem sich tor.exe befindet. Das Standardverzeichnis für den Tor-Browser lautet: "~\Tor Browser\Browser\TorBrowser\Data\Tor"
  2. Öffnen Sie ein Cmd-Eingabeaufforderungsfenster
  3. chdir in das Verzeichnis, in dem sich tor.exe befindet. Wenn Sie den Tor-Browser verwenden, lautet das Standardverzeichnis: "~\Tor Browser\Browser\TorBrowser\Tor \"
  4. Generieren Sie ein Passwort für den Tor Control Port-Zugriff. tor.exe --hash-password “your_password_without_hyphens” | more
  5. Fügen Sie unter ControlPort 9151 Ihren Passwort-Passwort-Hash zu torrc-defaults hinzu. Er sollte ungefähr so ​​aussehen: hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507. Wenn Sie Ihr Passwort als "Passwort" akzeptieren, können Sie die obige Zeichenfolge kopieren.
  6. Sie können jetzt über Telnet auf die Tor-Steuerung zugreifen, sobald sie gestartet ist. Nun kann der Code ausgeführt werden. Bearbeiten Sie einfach den Pfad, in dem sich Ihre Tor-Dateien im Programm befinden. Test, der Tor über Telnet ändert:
  7. Starten Sie tor mit dem folgenden Befehl: tor.exe -f .\torrc-defaults
  8. Öffnen Sie eine weitere Eingabeaufforderung und geben Sie Folgendes ein: telnet localhost 9151
  9. Wenn alles gut geht, sollten Sie einen vollständig schwarzen Bildschirm sehen. Geben Sie "autenticate “your_password_with_hyphens”" ein. Wenn alles gut geht, sollten Sie "250 OK" sehen.
  10. Geben Sie "SIGNAL NEWNYM" ein und Sie erhalten eine neue Route, also neue IP. Wenn alles gut geht, sollten Sie "250 OK" sehen.
  11. Geben Sie "setevents circ" (Schaltungsereignisse) ein, um die Konsolenausgabe zu aktivieren
  12. Geben Sie "getinfo circuit-status" ein, um die aktuellen Stromkreise anzuzeigen
4
Ogglas

Sie müssen einen Stream aus Socken extrahieren ...

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