Comment utiliser le protocole de contrôle Tor en C#?
j'essaie d'envoyer des commandes au port de contrôle de Tor par programmation pour le rafraîchir. Je n'ai pas pu trouver d'exemples dans C#, et ma solution ne fonctionne pas. La demande de fois. J'ai le service en marche, et je peux le voir écouter sur le port de contrôle.
public string Refresh()
{
TcpClient client = new TcpClient("localhost", 9051);
string response = string.Empty;
string authenticate = MakeTcpRequest("AUTHENTICATErn", client);
if (authenticate.Equals("250"))
{
response = MakeTcpRequest("SIGNAL NEWNYMrn", client);
}
client.Close();
return response;
}
public string MakeTcpRequest(string message, TcpClient client)
{
client.ReceiveTimeout = 20000;
client.SendTimeout = 20000;
string proxyResponse = string.Empty;
try
{
// Send message
StreamWriter streamWriter = new StreamWriter(client.GetStream());
streamWriter.Write(message);
streamWriter.Flush();
// Read response
StreamReader streamReader = new StreamReader(client.GetStream());
proxyResponse = streamReader.ReadToEnd();
}
catch (Exception ex)
{
// Ignore
}
return proxyResponse;
}
quelqu'un peut-il voir ce que je fais mal?
Edit:
suite à la suggestion de Hans, qu'il a supprimé pour une raison quelconque, j'ai essayé d'envoyer "authentifiern" au lieu de simplement "s'AUTHENTIFIER". Maintenant je reçois une erreur de Tor: "551 chaîne de citation invalide. Vous devez mettre le mot de passe entre guillemets."Au moins, il y a du progrès.
j'ai alors essayé d'envoyer "AUTHENTICATE ""n", Comme il le veut, mais il temps dehors en attendant une réponse.
Edit:
la commande fonctionne très bien dans le client Telnet Windows. Je n'ai même pas à ajouter les guillemets. Peut pas comprendre ce qui est faux. Peut-être que les doubles citations ne sont pas codé correctement lorsqu'ils sont envoyés?
4 réponses
public static void CheckIfBlocked(ref HtmlDocument htmlDoc, string ypURL, HtmlWeb hw)
{
if (htmlDoc.DocumentNode.InnerText.Contains("FORBIDDEN ACCESS!"))
{
Console.WriteLine("Getting Blocked");
Utils.RefreshTor();
htmlDoc = hw.Load(ypURL, "127.0.0.1", 8118, null, null);
if (htmlDoc.DocumentNode.InnerText.Contains("FORBIDDEN ACCESS!"))
{
Console.WriteLine("Getting Blocked");
Utils.RefreshTor();
}
}
}
public static void RefreshTor()
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9051);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
server.Connect(ip);
}
catch (SocketException e)
{
Console.WriteLine("Unable to connect to server.");
RefreshTor();
return;
}
server.Send(Encoding.ASCII.GetBytes("AUTHENTICATE \"butt\"\n"));
byte[] data = new byte[1024];
int receivedDataLength = server.Receive(data);
string stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength);
if (stringData.Contains("250"))
{
server.Send(Encoding.ASCII.GetBytes("SIGNAL NEWNYM\r\n"));
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();
RefreshTor();
}
}
else
{
Console.WriteLine("Unable to authenticate to server.");
server.Shutdown(SocketShutdown.Both);
server.Close();
RefreshTor();
}
server.Shutdown(SocketShutdown.Both);
server.Close();
}
quand j'envoie la commande AUTHENTICATE, le StreamReader lit la réponse à la fin, mais il n'y a pas de fin parce que sur le succès le flux est maintenu ouvert. Alors je l'ai changé de ne lire que la première ligne de la réponse dans ce cas.
public static string MakeTcpRequest(string message, TcpClient client, bool readToEnd)
{
client.ReceiveTimeout = 20000;
client.SendTimeout = 20000;
string proxyResponse = string.Empty;
try
{
// Send message
using (StreamWriter streamWriter = new StreamWriter(client.GetStream()))
{
streamWriter.Write(message);
streamWriter.Flush();
}
// Read response
using (StreamReader streamReader = new StreamReader(client.GetStream()))
{
proxyResponse = readToEnd ? streamReader.ReadToEnd() : streamReader.ReadLine();
}
}
catch (Exception ex)
{
throw ex;
}
return proxyResponse;
}
a ajouté un autre exemple que je me sers moi-même ci-dessous. A également ajouté des étapes pour ceux qui voudraient configurer Tor qui peuvent accepter des commandes via le port de contrôle.
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");
}
les Étapes pour configurer Tor:
- copier torrc-par défaut dans le répertoire dans lequel tor.l'exe l'est. Répertoire par défaut si vous utilisez le navigateur Tor est: "~\Tor Browser\Browser\Torbrowser\Data\Tor"
- Ouvrir une fenêtre d'invite de cmd
- chdir au répertoire où tor.l'exe l'est. Répertoire par défaut si vous utilisez le navigateur Tor est: "~\Tor Browser\Browser\Tor\Tor\"
- générer un mot de passe pour L'accès au port de contrôle de Tor.
tor.exe --hash-password “your_password_without_hyphens” | more
- Ajouter votre mot de passe hash du mot de passe de fichier torrc-les réglages par défaut sous ControlPort 9151. Il devrait ressembler à quelque chose comme ceci:
hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507
. Si vous acceptez que votre mot de passe soit "password", vous pouvez copier la chaîne ci-dessus. - vous pouvez maintenant accéder au contrôle de Tor via Telnet une fois qu'il est démarré. Maintenant le code peut s'exécuter, il suffit d'éditer le chemin vers l'emplacement de vos fichiers Tor dans le programme. Test de la modification de Tor via Telnet:
- Démarrer tor avec la commande suivante:
tor.exe -f .\torrc-defaults
- ouvrez une autre invite cmd et tapez:
telnet localhost 9151
- si tout va bien, vous devriez voir un écran complètement noir. Tapez"
autenticate “your_password_with_hyphens”
" Si tout va bien, vous devriez voir "250 OK". - Tapez "
SIGNAL NEWNYM
" et vous obtiendrez une nouvelle route, ergo nouvelle IP. Si tout va bien, vous devriez voir "250 OK". - Type "
setevents circ
" (événements du circuit) pour activer la sortie de la console - Tapez "
getinfo circuit-status
" pour voir les circuits de courant
vous utilisez probablement Vidalia qui génère un mot de passe hashé pour contrôler l'accès au port. Vous devez utiliser Tor console app et configurer un fichier torrc.