का उपयोग करते समय स्कैपी पैकेट को सफ़ल करने में विफल रहता है मैं एक सरल उदाहरण के साथ अपनी समस्या का प्रदर्शन करने की कोशिश करूंगा।एकाधिक धागे
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 के लिए उपयुक्त प्रश्न है (स्कैपी के लिए एक बग रिपोर्ट हो सकती है?)। कृपया उस मामले में मुझे क्षमा करें।
एक ज्ञात बग की तरह दिखता है: http://trac.secdev.org/scapy/ticket/747 –
@ चतुरंगा चंद्रशेखर: जिस मुद्दे का मैं सामना कर रहा हूं वह बहु-थ्रेडिंग से संबंधित है। कोड थ्रेडिंग के बिना ठीक काम करता है। –
@ असीरथनाथयके इस तथ्य के साथ कुछ ऐसा नहीं होता है कि नेटवर्क इंटरफ़ेस "प्रेमीसियस मोड" में समाप्त होता है और केवल एक ही स्रोत उस इंटरफ़ेस से जुड़ सकता है? यदि नहीं, तो क्या आपने कतार के बजाय पायथन 'थ्रेडिंग' लाइब्रेरी का उपयोग करने का प्रयास किया है? मुझे पूरा यकीन नहीं है कि कतार प्रणाली कैसे काम करती है लेकिन 'थ्रेडिंग' के साथ आप कम से कम क्या करते हैं, इसके बारे में अधिक नियंत्रण प्राप्त करेंगे, और आप थोड़ा सा टिंकर कर सकते हैं। – Torxed