簡體   English   中英

如何在C#中使用Tor控制協議?

[英]How to use Tor control protocol in C#?

我正在嘗試以編程方式將命令發送到Tor控制端口以使其刷新鏈。 我無法在C#中找到任何示例,我的解決方案無法正常工作。 請求超時。 我運行了服務,我可以看到它在控制端口上監聽。

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

誰能發現我做錯了什么?

編輯:

根據漢斯的建議,他現在已經刪除了某些原因,我試圖發送“AUTHENTICATE \\ n”而不僅僅是“AUTHENTICATE”。 現在我從Tor回來了一個錯誤:“551無效的引用字符串。你需要把密碼放在雙引號中。” 至少有一些進展。

然后我嘗試發送“AUTHENTICATE \\”\\“\\ n”,就像它想要的那樣,但它在等待響應時超時。

編輯:

該命令在Windows Telnet客戶端中正常工作。 我甚至不必添加引號。 無法弄清楚出了什么問題。 也許雙引號在發送時沒有正確編碼?

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

當我發送AUTHENTICATE命令時,StreamReader正在讀取結束的響應,但是沒有結束,因為成功時流保持打開狀態。 因此我將其更改為僅在此情況下讀取響應的第一行。

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

添加了另一個我在下面使用自己的例子。 還為那些想要設置可通過控制端口接受命令的Tor的用戶添加了步驟。

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

配置Tor的步驟:

  1. 將torrc-defaults復制到tor.exe所在的目錄中。 如果您使用Tor瀏覽器,則默認目錄為:“〜\\ Tor Browser \\ Browser \\ TorBrowser \\ Data \\ Tor”
  2. 打開cmd提示窗口
  3. chdir到tor.exe所在的目錄。 如果您使用Tor瀏覽器,默認目錄是:“〜\\ Tor Browser \\ Browser \\ TorBrowser \\ Tor \\”
  4. 為Tor控制端口訪問生成密碼。 tor.exe --hash-password “your_password_without_hyphens” | more
  5. 將您的密碼密碼哈希添加到ControlPort 9151下的torrc-defaults。它應如下所示: hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507 如果您接受密碼為“密碼”,則可以復制上面的字符串。
  6. 現在,您可以在啟動后通過Telnet訪問Tor控件。 現在代碼可以運行,只需編輯Tor文件在程序中所在的路徑。 通過Telnet測試修改Tor:
  7. 使用以下命令啟動tor: tor.exe -f .\\torrc-defaults
  8. 打開另一個cmd提示符並鍵入: telnet localhost 9151
  9. 如果一切順利,你應該看到一個完全黑屏。 輸入“ autenticate “your_password_with_hyphens” ”如果一切順利,你應該看到“250 OK”。
  10. 輸入“ SIGNAL NEWNYM ”,您將獲得一條新路線,即新的IP。 如果一切順利,你應該看到“250 OK”。
  11. 輸入“ setevents circ ”(電路事件)以啟用控制台輸出
  12. 輸入“ getinfo circuit-status ”以查看當前電路

可能您使用Vidalia生成用於控制端口訪問的哈希密碼。 您需要使用Tor控制台應用程序並配置torrc文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM