2010-04-30 20 views
14

मैं श्रृंखला को रीफ्रेश करने के लिए प्रोग्रामर रूप से टोर कंट्रोल पोर्ट को कमांड भेजने की कोशिश कर रहा हूं। मैं सी # में कोई उदाहरण नहीं ढूंढ पा रहा हूं, और मेरा समाधान काम नहीं कर रहा है। अनुरोध का समय समाप्त हो गया। मेरे पास सेवा चल रही है, और मैं इसे नियंत्रण बंदरगाह पर सुन सकता हूं।सी # में टोर कंट्रोल प्रोटोकॉल का उपयोग कैसे करें?

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

क्या कोई यह बता सकता है कि मैं क्या गलत कर रहा हूं?

संपादित करें:

हंस के सुझाव, जो वह अब किसी कारण से नष्ट कर दिया गया है के बाद, मैं "को प्रमाणित \ n" बस "प्रमाणित" के बजाय भेजने की कोशिश की। अब मुझे टोर से एक त्रुटि मिल रही है: "551 अमान्य उद्धृत स्ट्रिंग। आपको पासवर्ड को डबल कोट्स में रखना होगा।" कम से कम कुछ प्रगति है।

मैंने फिर "प्रमाणीकरण \" \ "\ n" भेजने की कोशिश की, जैसा कि यह चाहता है, लेकिन प्रतिक्रिया के इंतजार के दौरान यह समय समाप्त हो गया।

संपादित करें:

आदेश विंडोज टेलनेट क्लाइंट में ठीक काम करता है। मुझे उद्धरण भी जोड़ने की ज़रूरत नहीं है। क्या गलत है पता नहीं लगा सकता है। हो सकता है कि डबल कोट्स को भेजे जाने पर सही ढंग से एन्कोड नहीं किया गया हो?

उत्तर

4

जब मैं 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; 
} 
8
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(); 
    } 
0

शायद आप Vidalia कि नियंत्रण बंदरगाह पहुँच के लिए एक टुकड़े किए गए पासवर्ड जेनरेट करता इस्तेमाल करते हैं। आपको टोर कंसोल ऐप का उपयोग करने और एक torrc फ़ाइल को कॉन्फ़िगर करने की आवश्यकता है।

+2

नहीं, मैं Vidalia का उपयोग नहीं किया गया था देखने के लिए सक्षम करने के लिए

  • प्रकार "getinfo circuit-status", और मैं वैसे भी इसे हल। – Edgar

  • 1

    एक और उदाहरण जोड़ा गया है जो मैं नीचे उपयोग कर रहा हूं। उन लोगों के लिए भी कदम जोड़े गए जो टोर सेट करना चाहते हैं जो नियंत्रण पोर्ट के माध्यम से आदेश स्वीकार कर सकते हैं।

    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.exe है में

    1. कॉपी torrc-चूक। यदि आप टोर ब्राउज़र का उपयोग कर रहे हैं तो डिफ़ॉल्ट निर्देशिका है: "~ \ Tor ब्राउज़र \ ब्राउज़र \ TorBrowser \ Data \ Tor"
    2. एक cmd प्रॉम्प्ट विंडो
    3. निर्देशिका में chdir जहां tor.exe है। यदि आप Tor ब्राउज़र का उपयोग कर रहे हैं तो डिफ़ॉल्ट निर्देशिका है: "~ \ Tor ब्राउज़र \ ब्राउज़र \ TorBrowser \ Tor \"
    4. टोर कंट्रोल पोर्ट एक्सेस के लिए पासवर्ड जेनरेट करें। tor.exe --hash-password “your_password_without_hyphens” | more
    5. नियंत्रण पासवर्ड 9151 के तहत torcc-defaults के लिए अपना पासवर्ड पासवर्ड हैश जोड़ें। इसे इस तरह कुछ दिखाना चाहिए: hashedControlPassword 16:3B7DA467B1C0D550602211995AE8D9352BF942AB04110B2552324B2507। यदि आप अपना पासवर्ड "पासवर्ड" मानते हैं तो आप ऊपर की स्ट्रिंग की प्रतिलिपि बना सकते हैं।
    6. अब शुरू होने के बाद आप टेलनेट के माध्यम से टोर कंट्रोल तक पहुंच सकते हैं। अब कोड चलाया जा सकता है, बस उस पथ को संपादित करें जहां प्रोग्राम में आपकी टोर फ़ाइलें स्थित हैं। टेस्ट टेलनेट के माध्यम से टो संशोधित: निम्न आदेश के साथ
    7. प्रारंभ टो: tor.exe -f .\torrc-defaults
    8. एक और cmd शीघ्र और प्रकार खोलें: telnet localhost 9151
    9. यदि सब चला जाता है अच्छी तरह से आप एक पूरी तरह से काली स्क्रीन देखना चाहिए। टाइप करें "autenticate “your_password_with_hyphens”" अगर सब ठीक हो जाए तो आपको "250 ओके" देखना चाहिए।
    10. टाइप करें "SIGNAL NEWNYM" और आपको एक नया मार्ग मिलेगा, नया आईपी ergo। अगर सब ठीक हो जाए तो आपको "250 ओके" देखना चाहिए।
    11. प्रकार "setevents circ" (सर्किट घटनाओं) कंसोल आउटपुट वर्तमान सर्किट