14 Stimmen

Wie verwendet man das Tor-Kontrollprotokoll in C#?

Ich versuche, programmgesteuert Befehle an den Tor-Kontrollanschluss zu senden, damit dieser die Kette aktualisiert. Ich habe keine Beispiele in C# finden können und meine Lösung funktioniert nicht. Die Anfrage wird abgebrochen. Der Dienst läuft, und ich kann sehen, dass er auf dem Kontrollport lauscht.

public string Refresh()
{
    TcpClient client = new TcpClient("localhost", 9051);
    string response = string.Empty;
    string authenticate = MakeTcpRequest("AUTHENTICATE\r\n", client);
    if (authenticate.Equals("250"))
    {
        response = MakeTcpRequest("SIGNAL NEWNYM\r\n", 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;
}

Kann mir jemand sagen, was ich falsch mache?

Edita:

Dem Vorschlag von Hans folgend, den er jetzt aus irgendeinem Grund gelöscht hat, habe ich versucht, "AUTHENTICATE" zu senden \n " statt nur "AUTHENTICATE". Jetzt bekomme ich eine Fehlermeldung von Tor zurück: "551 Ungültige Zeichenkette. Du musst das Passwort in doppelte Anführungszeichen setzen." Wenigstens gibt es einen kleinen Fortschritt.

Ich habe dann versucht, "AUTHENTICATE \"\" zu senden. \n ", als ob es das wollte, aber es kommt zu einem Timeout, während es auf eine Antwort wartet.

Edita:

Der Befehl funktioniert problemlos im Windows-Telnet-Client. Ich muss nicht einmal die Anführungszeichen hinzufügen. Ich kann nicht herausfinden, was falsch ist. Vielleicht werden die doppelten Anführungszeichen beim Senden nicht richtig kodiert?

8voto

MvcCmsJon Punkte 589
    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();
    }

4voto

Edgar Punkte 4208

Wenn ich den Befehl AUTHENTICATE sende, liest der StreamReader die Antwort bis zum Ende, aber es gibt kein Ende, weil der Stream bei Erfolg offen bleibt. Also habe ich ihn so geändert, dass er in diesem Fall nur die erste Zeile der Antwort liest.

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;
}

1voto

Ogglas Punkte 48648

Nachstehend ein weiteres Beispiel, das ich selbst verwende. Außerdem habe ich Schritte für diejenigen hinzugefügt, die Tor so einrichten wollen, dass es Befehle über den Kontrollport annehmen kann.

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 zur Konfiguration von Tor:

  1. Kopieren Sie torrc-defaults in das Verzeichnis, in dem sich tor.exe befindet. Das Standardverzeichnis, wenn du den Tor-Browser benutzt, ist: "~ \Tor Browser \Browser\TorBrowser\Data\Tor "
  2. Öffnen Sie ein Fenster der cmd-Eingabeaufforderung
  3. chdir in das Verzeichnis, in dem sich tor.exe befindet. Das Standardverzeichnis, wenn du den Tor-Browser benutzt, ist: "~ \Tor Browser \Browser\TorBrowser\Tor\ "
  4. Erzeugen Sie ein Passwort für den Zugang zum Tor Control Port. tor.exe --hash-password “your_password_without_hyphens” | more
  5. Fügen Sie Ihren Passwort-Hash zu torrc-defaults unter ControlPort 9151 hinzu. Er sollte in etwa so aussehen: hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507 . Wenn Sie Ihr Passwort als "password" akzeptieren, können Sie die obige Zeichenfolge kopieren.
  6. Sie können jetzt über Telnet auf die Tor-Steuerung zugreifen, sobald diese gestartet ist. Jetzt kann der Code ausgeführt werden. Bearbeite einfach den Pfad, in dem sich deine Tor-Dateien im Programm befinden. Testen Sie die Änderung von Tor über Telnet:
  7. Starten Sie tor mit dem folgenden Befehl: tor.exe -f .\torrc-defaults
  8. Öffnen Sie eine weitere cmd-Eingabeaufforderung und geben Sie ein: telnet localhost 9151
  9. Wenn alles gut geht, sollten Sie einen komplett schwarzen Bildschirm sehen. Tippen Sie " autenticate “your_password_with_hyphens” " Wenn alles gut geht, sollten Sie "250 OK" sehen.
  10. Typ " SIGNAL NEWNYM "und Sie erhalten eine neue Route, ergo eine neue IP. Wenn alles gut geht, sollten Sie "250 OK" sehen.
  11. Typ " setevents circ " (Schaltkreisereignisse), um die Konsolenausgabe zu aktivieren
  12. Typ " getinfo circuit-status " um aktuelle Schaltungen zu sehen

0voto

Dantas Punkte 1

Wahrscheinlich verwenden Sie Vidalia, das ein Hash-Passwort für den Zugriff auf den Kontrollport generiert. Du musst die Tor-Konsolenanwendung verwenden und eine torrc-Datei konfigurieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X