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"
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
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.
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.
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:
tor.exe --hash-password “your_password_without_hyphens” | more
hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507
. Si vous acceptez que votre mot de passe soit "mot de passe", vous pouvez copier la chaîne ci-dessus.tor.exe -f .\torrc-defaults
telnet localhost 9151
autenticate “your_password_with_hyphens”
" Si tout se passe bien, vous devriez voir "250 OK".SIGNAL NEWNYM
" et vous obtiendrez un nouvel itinéraire, ergo new IP. Si tout se passe bien, vous devriez voir "250 OK".setevents circ
" (événements de circuit) pour activer la sortie de la consolegetinfo circuit-status
" pour voir les circuits actuelsVous 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