web-dev-qa-db-fra.com

en utilisant Tor comme proxy

J'essaie d'utiliser Tor-Server comme proxy dans HttpWebRequest, mon code ressemble à ceci:

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

cela fonctionne parfaitement avec les mandataires "normaux" mais avec Tor, je reçois des exceptions lors de l'appel

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

32
Lay

Si vous avez privoxy installé et en cours d'exécution, vous pouvez le faire 

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

Ce qui vous permettra de faire des requêtes en utilisant tor

34

Tor est pas un proxy HTTP. C'est un proxy SOCKS. Vous pouvez utiliser un proxy HTTP prenant en charge le transfert sur SOCKS (comme Privoxy) et vous y connecter via un code.

22
Mehrdad Afshari

Oui, comme l'a dit l'autre affiche, un client de chaussettes est nécessaire. Certaines bibliothèques sont Starksoft Proxy , ProxySocket et ComponentSpace Socks Proxy . sockscap est un outil qui intercepte et redirige les appels de winsock, et privoxy est un proxy local qui peut canaliser vos demandes sur des chaussettes. Quelques solutions différentes.

8
jspcal

Utilisez la bibliothèque "SocksWebProxy". Vous pouvez l'utiliser avec WebClient & WebRequest (affectez simplement un nouveau SocksWebProxy à l'attribut * .Proxy). Pas besoin de Privoxy ou d'un service similaire pour traduire le trafic http en tor.

https://github.com/Ogglas/SocksWebProxy

J'ai également fait quelques extensions en activant le port de contrôle. Voici comment vous pouvez faire fonctionner Tor en arrière-plan sans le Tor Browser Bundle et pour contrôler Tor, nous pouvons utiliser Telnet ou envoyer des commandes par programme via 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");
}

Étapes pour configurer Tor:

  1. Copiez torrc-default dans le répertoire dans lequel se trouve tor.exe. Le répertoire par défaut si vous utilisez le navigateur Tor est: "~\Navigateur Tor\Navigateur\TorBrowser\Data\Tor"
  2. Ouvrir une fenêtre d'invite cmd
  3. chdir dans le répertoire où se trouve tor.exe. Le répertoire par défaut si vous utilisez le navigateur Tor est: "~\Navigateur Tor\Navigateur\TorBrowser\Tor \"
  4. Générez un mot de passe pour accéder au port de contrôle Tor. tor.exe --hash-password “your_password_without_hyphens” | more
  5. Ajoutez votre mot de passe hash à torrc-default par défaut sous ControlPort 9151. Il devrait ressembler à ceci: hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507. Si vous acceptez que votre mot de passe soit "mot de passe", vous pouvez copier la chaîne ci-dessus.
  6. Vous pouvez maintenant accéder au contrôle Tor via Telnet une fois démarré. Maintenant que le code peut être exécuté, il suffit de modifier le chemin d'accès à l'emplacement de vos fichiers Tor dans le programme . Testez la modification de Tor via Telnet:
  7. Démarrez avec la commande suivante: tor.exe -f .\torrc-defaults
  8. Ouvrez une autre invite de commande et tapez: telnet localhost 9151
  9. Si tout se passe bien, vous devriez voir un écran complètement noir. Tapez "autenticate “your_password_with_hyphens”" Si tout se passe bien, vous devriez voir "250 OK".
  10. Tapez "SIGNAL NEWNYM" et vous obtiendrez un nouvel itinéraire, ergo new IP. Si tout se passe bien, vous devriez voir "250 OK".
  11. Tapez "setevents circ" (événements de circuit) pour activer la sortie de la console
  12. Tapez "getinfo circuit-status" pour voir les circuits actuels
4
Ogglas

Vous devez "extraire" un flux de chaussettes ...

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
0