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"
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
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.
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.
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:
tor.exe --hash-password “your_password_without_hyphens” | more
hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507
. Wenn Sie Ihr Passwort als "Passwort" akzeptieren, können Sie die obige Zeichenfolge kopieren.tor.exe -f .\torrc-defaults
telnet localhost 9151
autenticate “your_password_with_hyphens”
" ein. Wenn alles gut geht, sollten Sie "250 OK" sehen.SIGNAL NEWNYM
" ein und Sie erhalten eine neue Route, also neue IP. Wenn alles gut geht, sollten Sie "250 OK" sehen.setevents circ
" (Schaltungsereignisse) ein, um die Konsolenausgabe zu aktivierengetinfo circuit-status
" ein, um die aktuellen Stromkreise anzuzeigenSie 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