14 Stimmen

Wie verwende ich das Tor-Control-Protokoll in C#?

Ich versuche, Befehle an den Tor-Steuerport programmgesteuert zu senden, um die Kette zu aktualisieren. Ich konnte keine Beispiele in C# finden, und meine Lösung funktioniert nicht. Die Anfrage läuft ab. Der Dienst läuft, und ich sehe, dass er auf dem Steuerport 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
    {
        // Nachricht senden
        StreamWriter streamWriter = new StreamWriter(client.GetStream());
        streamWriter.Write(message);
        streamWriter.Flush();

        // Antwort lesen
        StreamReader streamReader = new StreamReader(client.GetStream());
        proxyResponse = streamReader.ReadToEnd();
    }
    catch (Exception ex)
    {
        // Ignorieren
    }

    return proxyResponse;
}

Kann jemand sehen, was ich falsch mache?

Bearbeitet:

Nach Hans' Vorschlag, den er aus irgendeinem Grund jetzt gelöscht hat, habe ich versucht, "AUTHENTICATE\n" anstatt einfach "AUTHENTICATE" zu senden. Jetzt erhalte ich einen Fehler von Tor zurück: "551 Ungültige Angebotszeichenfolge. Sie müssen das Kennwort in doppelte Anführungszeichen setzen." Zumindest gibt es Fortschritte.

Dann habe ich versucht, "AUTHENTIFIZIEREN \"\"\n" zu senden, so wie es verlangt wird, aber es läuft ab, während es auf eine Antwort wartet.

Bearbeitet:

Der Befehl funktioniert im Windows-Telnet-Client einwandfrei. Ich muss nicht einmal die Anführungszeichen hinzufügen. Kann nicht herausfinden, was falsch ist. Vielleicht sind die doppelten Anführungszeichen nicht korrekt codiert, wenn sie gesendet werden?

8voto

MvcCmsJon Punkte 589
    public static void CheckIfBlocked(ref HtmlDocument htmlDoc, string ypURL, HtmlWeb hw)
    {
        if (htmlDoc.DocumentNode.InnerText.Contains("FORBIDDEN ACCESS!"))
        {
            Console.WriteLine("Wird blockiert");
            Utils.RefreshTor();
            htmlDoc = hw.Load(ypURL, "127.0.0.1", 8118, null, null);
            if (htmlDoc.DocumentNode.InnerText.Contains("FORBIDDEN ACCESS!"))
            {
                Console.WriteLine("Wird blockiert");
                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("Verbindung zum Server kann nicht hergestellt werden.");
            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("Neuen Benutzer dem Server signalisieren nicht möglich.");
                server.Shutdown(SocketShutdown.Both);
                server.Close();
                RefreshTor();
            }
        }
        else
        {
            Console.WriteLine("Authentifizierung am Server nicht möglich.");
            server.Shutdown(SocketShutdown.Both);
            server.Close();
            RefreshTor();
        }
        server.Shutdown(SocketShutdown.Both);
        server.Close();
    }

4voto

Edgar Punkte 4208

Wenn ich den AUTHENTICATE-Befehl sende, liest der StreamReader die Antwort bis zum Ende, aber es gibt kein Ende, weil bei Erfolg der Stream offen gehalten wird. Deshalb habe ich es geändert, nur die erste Zeile der Antwort in diesem Fall zu lesen.

public static string MakeTcpRequest(string message, TcpClient client, bool readToEnd)
{
    client.ReceiveTimeout = 20000;
    client.SendTimeout = 20000;
    string proxyResponse = string.Empty;

    try
    {
        // Nachricht senden
        using (StreamWriter streamWriter = new StreamWriter(client.GetStream()))
        {
            streamWriter.Write(message);
            streamWriter.Flush();
        }

        // Antwort lesen
        using (StreamReader streamReader = new StreamReader(client.GetStream()))
        {
            proxyResponse = readToEnd ? streamReader.ReadToEnd() : streamReader.ReadLine();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return proxyResponse;
}

0 Stimmen

Vielen Dank für Ihre Antwort. Ich habe ein C#-Projekt, das den erwähnten Code verwendet. Ich benutze den Tor-Browser und stelle eine Anfrage über die erste Tor-IP. Wenn ich Refresh aufrufe (wie im Code erwähnt), ändert sich die IP nicht und es scheint, als würde nur die erste IP verwendet, nachdem die IP geändert wurde. Was soll ich tun?

1voto

Ogglas Punkte 48648

Weitere benutzte Beispiel, das ich unten verwende. Habe auch Schritte hinzugefügt für diejenigen, die Tor einrichten möchten, das Befehle über den Steueranschluss akzeptiert.

Socket server = null;

//Authentifizierung mit Steuerpasswort
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 \"dein_passwort\"" + Environment.NewLine));
byte[] data = new byte[1024];
int receivedDataLength = server.Receive(data);
string stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength);

//Eine neue Identität anfordern
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("Neuer Benutzer konnte nicht an Server gesendet werden.");
    server.Shutdown(SocketShutdown.Both);
    server.Close();
}
else
{
    Console.WriteLine("SIGNAL NEWNYM erfolgreich gesendet");
}

Schritte zum Konfigurieren von Tor:

  1. Kopieren Sie torrc-defaults in das Verzeichnis, in dem sich die tor.exe befindet. Standardverzeichnis, wenn Sie den Tor-Browser verwenden, ist: "~\Tor Browser\Browser\TorBrowser\Data\Tor"
  2. Öffnen Sie ein cmd-Fenster
  3. Wechseln Sie in das Verzeichnis, in dem sich die tor.exe befindet. Standardverzeichnis, wenn Sie den Tor-Browser verwenden, ist: "~\Tor Browser\Browser\TorBrowser\Tor\"
  4. Generieren Sie ein Passwort für den Zugriff auf den Tor-Steueranschluss. tor.exe --hash-password “dein_passwort_ohne_bindestreiche” | more
  5. Fügen Sie den Hash des Passworts zu torrc-defaults unter ControlPort 9151 hinzu. Es sollte etwas wie folgt aussehen: hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507. Wenn Sie Ihr Passwort als "Passwort" akzeptieren, können Sie den oben genannten String kopieren.
  6. Sie können jetzt über Telnet auf die Tor-Steuerung zugreifen, sobald sie gestartet ist. Jetzt kann der Code ausgeführt werden, bearbeiten Sie einfach den Pfad zu Ihren Tor-Dateien im Programm. Testen Sie die Änderung von Tor über Telnet:
  7. Starten Sie tor mit dem folgenden Befehl: tor.exe -f .\torrc-defaults
  8. Öffnen Sie ein weiteres Cmd-Fenster und geben Sie ein: telnet localhost 9151
  9. Wenn alles gut geht, sollte ein komplett schwarzer Bildschirm angezeigt werden. Geben Sie "autenticate “dein_passwort_mit_bindestreichen”" ein. Wenn alles gut geht, sollten Sie "250 OK" sehen.
  10. Geben Sie "SIGNAL NEWNYM" ein, und Sie erhalten eine neue Route, also eine neue IP-Adresse. Wenn alles gut geht, sollten Sie "250 OK" sehen.
  11. Geben Sie "setevents circ" (Schaltungsevents) ein, um die Konsolenausgabe zu aktivieren
  12. Geben Sie "getinfo circuit-status" ein, um die aktuellen Schaltungen anzuzeigen

0voto

Dantas Punkte 1

Vielleicht verwenden Sie Vidalia, das ein gehashtes Passwort für den Zugriff auf den Steuerungsport generiert. Sie müssen 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