2013-04-29 11 views
6

का उपयोग करते समय स्कैपी पैकेट को सफ़ल करने में विफल रहता है मैं एक सरल उदाहरण के साथ अपनी समस्या का प्रदर्शन करने की कोशिश करूंगा।एकाधिक धागे

from scapy.all import * 

m_iface = "wlan0" 
m_dst = "192.168.0.1" 

def print_summary(pkt): 
    print pkt.summary() 

def plain_sniff(): 
    sniff(iface = m_iface, count = 10, filter = "icmp and src {0}".format(m_dst), prn = print_summary) 

यह स्निफर बस ठीक काम करता है और मैं आउटपुट प्राप्त:

के बाद एक बहुत ही सरल (एकल थ्रेड) पैकेट स्निफर (ICMP) है

WARNING: No route found for IPv6 destination :: (no default route?) 
Ether/IP/ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0/Raw 
Ether/IP/ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0/Raw 
Ether/IP/ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0/Raw 
... 

इसके बाद, मैं एक अलग बनाने पैकेट स्नीफिंग के लिए धागा और स्निफ़र थ्रेड और मुख्य थ्रेड के बीच कैप्चर किए गए पैकेट्स को संवाद करने के लिए एक कतार का उपयोग करें:

from threading import Thread 
from Queue import Queue, Empty 
from scapy.all import * 

m_iface = "wlan0" 
m_finished = False 
m_dst = "192.168.0.1" 

def print_summary(pkt): 
    print pkt.summary() 

def threaded_sniff_target(q): 
    global m_finished 
    sniff(iface = m_iface, count = 10, filter = "icmp and src {0}".format(m_dst), prn = lambda x : q.put(x)) 
    m_finished = True 

def threaded_sniff(): 
    q = Queue() 
    sniffer = Thread(target = threaded_sniff_target, args = (q,)) 
    sniffer.daemon = True 
    sniffer.start() 
    while (not m_finished): 
    try: 
     pkt = q.get(timeout = 1) 
     print_summary(pkt) 
    except Empty: 
     pass 

यह स्निफर भी ठीक काम करता है और मुझे उपरोक्त के समान उत्पादन मिलता है।

def threaded_sniff_with_send(): 
    q = Queue() 
    sniffer = Thread(target = threaded_sniff_target, args = (q,)) 
    sniffer.daemon = True 
    sniffer.start() 
    while (not m_finished): 
    send(IP(dst = m_dst)/ICMP()) # Here 
    try: 
     pkt = q.get(timeout = 1) 
     print_summary(pkt) 
    except Empty: 
     pass 

तो मैं मिल विचित्र उत्पादन निम्नलिखित (फिल्टर करने के लिए प्रतीत नहीं होता: हालांकि, जब मैं मुख्य थ्रेड सिर्फ एक छोटा सा इतना है कि यह send() फ़ंक्शन का उपयोग करता के बीच के रूप में नीचे पैकेट कतार से पढ़ता संशोधित काम):

WARNING: No route found for IPv6 destination :: (no default route?) 
Sent 1 packets. 
Ether/ARP who has 192.168.0.1 says 192.168.0.9 
Sent 1 packets. 
Ether/ARP is at a0:21:b7:1a:7a:db says 192.168.0.1 
Sent 1 packets. 
Ether/IP/ICMP 192.168.0.9 > 192.168.0.1 echo-request 0 
Sent 1 packets. 
Ether/IP/ICMP 192.168.0.1 > 192.168.0.9 echo-reply 0 
... 

तीन स्निफर्स के लिए स्क्रिप्ट here से डाउनलोड किया जा सकता है। दिलचस्प बात यह है

Python: 2.7.3 
Scapy: 2.2.0 
OS: Fedora 18 

, सभी तीन स्निफर्स मेरे पुराने कंप्यूटर पर ठीक से काम:

मेरे वर्तमान सिस्टम विन्यास रूप में नीचे है

Python: 2.6.4 
Scapy: 2.0.0.10 (beta) 
OS: Fedora 13 

सबसे पहले मैंने सोचा कि यह Scapy/अजगर संस्करण हो सकता है । लेकिन जब भी मैंने अपने नए कंप्यूटर पर सटीक संस्करण स्थापित किए, तब भी व्यवहार जारी रहा।

मुझे पूरी तरह से यकीन नहीं है कि यह SO के लिए उपयुक्त प्रश्न है (स्कैपी के लिए एक बग रिपोर्ट हो सकती है?)। कृपया उस मामले में मुझे क्षमा करें।

+0

एक ज्ञात बग की तरह दिखता है: http://trac.secdev.org/scapy/ticket/747 –

+0

@ चतुरंगा चंद्रशेखर: जिस मुद्दे का मैं सामना कर रहा हूं वह बहु-थ्रेडिंग से संबंधित है। कोड थ्रेडिंग के बिना ठीक काम करता है। –

+0

@ असीरथनाथयके इस तथ्य के साथ कुछ ऐसा नहीं होता है कि नेटवर्क इंटरफ़ेस "प्रेमीसियस मोड" में समाप्त होता है और केवल एक ही स्रोत उस इंटरफ़ेस से जुड़ सकता है? यदि नहीं, तो क्या आपने कतार के बजाय पायथन 'थ्रेडिंग' लाइब्रेरी का उपयोग करने का प्रयास किया है? मुझे पूरा यकीन नहीं है कि कतार प्रणाली कैसे काम करती है लेकिन 'थ्रेडिंग' के साथ आप कम से कम क्या करते हैं, इसके बारे में अधिक नियंत्रण प्राप्त करेंगे, और आप थोड़ा सा टिंकर कर सकते हैं। – Torxed

उत्तर

6

इसका मुख्य कारण संसाधन ताले की वजह से सबसे अधिक संभावना है। स्कैपी के sniff() फ़ंक्शन को पैकेट को स्नीफ करने में सक्षम होने के लिए शायद निम्न-स्तर के नेटवर्क संसाधनों को लॉक करना होगा।

दो धागे (स्निफर थ्रेड शुरू करने के बाद) में देरी से आप सुनिश्चित करेंगे कि स्कापी को ऐसा करने के लिए समय मिलेगा।

यह देखने के लिए कि हम इस निष्कर्ष पर कैसे पहुंचे टिप्पणी अनुभाग में ऊपर चर्चा देखें। ग्ल असिरी रथनायक :)

+0

इसे देखने के लिए धन्यवाद। इसने मेरी मूल समस्या भी हल की (जो एक अधिक जटिल संचार परिदृश्य है)। स्कापी के आंतरिक में शायद एक थ्रेड-सुरक्षा समस्या है, उम्मीद है कि स्कापी से कोई भी इस पोस्ट में आएगा :) –

+1

वाईडब्ल्यू। अगर मुझे इसके लिए समय मिलता है तो मैं एक मेलिंग सूची में एक नोट भेजूंगा और कोई उम्मीद करेगा कि इस पर ध्यान दें :) – Torxed

संबंधित मुद्दे