如何在C#中使用Tor控制协议?
我正在尝试以编程方式将命令发送到Tor控制端口以使其刷新链。 我无法在C#中找到任何示例,我的解决方案无法正常工作。 请求超时。 我有服务正在运行,我可以看到它在控制端口上监听。
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; }
谁能发现我做错了什么?
编辑:
根据Hans的建议,他现在因某种原因删除了,我试图发送“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 NEWNYMrn")); 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的步骤:
- 将torrc-defaults复制到tor.exe所在的目录中。 如果您使用Tor浏览器,则默认目录为:“〜 Tor Browser Browser TorBrowser Data Tor”
- 打开cmd提示窗口
- chdir到tor.exe所在的目录。 如果您使用Tor浏览器,则默认目录为:“〜 Tor Browser Browser TorBrowser Tor ”
- 为Tor控制端口访问生成密码。
tor.exe --hash-password “your_password_without_hyphens” | more
- 将您的密码密码哈希添加到ControlPort 9151下的torrc-defaults。它应如下所示:
hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507
。 如果您接受密码为“密码”,则可以复制上面的字符串。 - 现在,您可以在启动后通过Telnet访问Tor控件。 现在代码可以运行,只需编辑Tor文件在程序中所在的路径。 通过Telnet测试修改Tor:
- 使用以下命令启动tor:
tor.exe -f .torrc-defaults
- 打开另一个cmd提示符并键入:
telnet localhost 9151
- 如果一切顺利,你应该看到一个完全黑屏。 输入“
autenticate “your_password_with_hyphens”
”如果一切顺利,你应该看到“250 OK”。 - 输入“
SIGNAL NEWNYM
”,您将获得一条新路线,即新的IP。 如果一切顺利,你应该看到“250 OK”。 - 输入“
setevents circ
”(电路事件)以启用控制台输出 - 输入“
getinfo circuit-status
”以查看当前电路
可能您使用Vidalia生成用于控制端口访问的哈希密码。 您需要使用Tor控制台应用程序并配置torrc文件。
上述就是C#学习教程:如何在C#中使用Tor控制协议?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1019485.html