using Tor as Proxy

前端 未结 5 1971
再見小時候
再見小時候 2020-11-28 04:31

I\'m trying to use Tor-Server as a proxy in HttpWebRequest, my code looks like this:

HttpWebRequest request;
HttpWebResponse response;

request          


        
相关标签:
5条回答
  • 2020-11-28 05:11

    If you have privoxy installed and running you can do

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

    Which will enable you to make requests using tor

    0 讨论(0)
  • 2020-11-28 05:14

    Yes like the other poster said, a socks client is needed. Some libraries are Starksoft Proxy, ProxySocket and ComponentSpace Socks Proxy. sockscap is a tool that intercepts and reroutes winsock calls, and privoxy is a local proxy that can tunnel your requests over socks. A couple different solutions.

    0 讨论(0)
  • 2020-11-28 05:23

    Tor is not an HTTP proxy. It's a SOCKS proxy. You can use an HTTP proxy that supports forwarding on SOCKS (like Privoxy) and connect to that via code instead.

    0 讨论(0)
  • 2020-11-28 05:27

    You need "extract" a stream from socks...

    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 讨论(0)
  • 2020-11-28 05:28

    Use the library "SocksWebProxy". You can use it with WebClient & WebRequest (Just assign a new SocksWebProxy to the *.Proxy attribute). No Need for Privoxy or similar service to translate http traffic to tor.

    https://github.com/Ogglas/SocksWebProxy

    I made some extensions to it as well by enabling the control port. Here is how you could have Tor running in the background without Tor Browser Bundle started and to control Tor we can use Telnet or send commands programmatically 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");
    }
    

    Steps to configure Tor:

    1. Copy torrc-defaults into the directory in which tor.exe is. Default directory if you are using Tor browser is: "~\Tor Browser\Browser\TorBrowser\Data\Tor"
    2. Open a cmd prompt window
    3. chdir to the directory where tor.exe is. Default directory if you are using Tor browser is: "~\Tor Browser\Browser\TorBrowser\Tor\"
    4. Generate a password for Tor control port access. tor.exe --hash-password “your_password_without_hyphens” | more
    5. Add your password password hash to torrc-defaults under ControlPort 9151. It should look something like this: hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507. If you accept your password to be "password" you can copy the string above.
    6. You can now access Tor control via Telnet once it is started. Now the code can run, just edit the path to where your Tor files are located in the program. Test modifying Tor via Telnet:
    7. Start tor with the following command: tor.exe -f .\torrc-defaults
    8. Open up another cmd prompt and type: telnet localhost 9151
    9. If all goes well you should see a completely black screen. Type "autenticate “your_password_with_hyphens”" If all goes well you should see "250 OK".
    10. Type "SIGNAL NEWNYM" and you will get a new route, ergo new IP. If all goes well you should see "250 OK".
    11. Type "setevents circ" (circuit events) to enable console output
    12. Type "getinfo circuit-status" to see current circuits
    0 讨论(0)
提交回复
热议问题