Tôi sẽ cố gắng để chứng minh vấn đề của tôi với một ví dụ đơn giản.Scapy không sniff gói khi sử dụng nhiều chủ đề
Sau đây là một rất đơn giản (đơn ren) packet sniffer (ICMP):
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)
sniffer này chỉ hoạt động tốt và tôi nhận được kết quả:
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
...
Tiếp theo, tôi tạo ra một riêng biệt thread cho sniffing packet và sử dụng một Queue để truyền đạt các gói đã capture giữa thread sniffer và thread chính:
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
Sniffer này cũng hoạt động tốt và tôi nhận được cùng một đầu ra như trên. Tuy nhiên, khi tôi sửa đổi các chủ đề chính chỉ là một chút để nó sử dụng các chức năng send()
giữa đọc từ hàng đợi gói như sau:
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
Sau đó, tôi nhận được những điều sau đây sản lượng kỳ lạ (bộ lọc không dường như công việc):
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
...
Kịch bản cho ba người đánh hơi có thể được tải xuống từ here.
cấu hình hệ thống hiện tại của tôi là như sau:
Python: 2.7.3
Scapy: 2.2.0
OS: Fedora 18
Điều thú vị là tất cả các ba sniffers hoạt động tốt trên máy tính cũ của tôi:
Python: 2.6.4
Scapy: 2.0.0.10 (beta)
OS: Fedora 13
Trước tiên tôi nghĩ rằng nó có thể là phiên bản Scapy/Python . Nhưng ngay cả khi tôi cài đặt chính xác các phiên bản tương tự trên máy tính mới của tôi, hành vi vẫn tồn tại.
Tôi không hoàn toàn chắc chắn nếu đây là câu hỏi phù hợp với SO (có thể là một báo cáo lỗi cho Scapy?). Xin lỗi cho tôi trong trường hợp đó.
Trông giống như một lỗi đã biết: http://trac.secdev.org/scapy/ticket/747 –
@ChathurangaChandrasekara: Vấn đề tôi gặp phải liên quan đến đa luồng. Mã hoạt động tốt mà không cần luồng. –
@AsiriRathnayake Điều này không xảy ra để có một cái gì đó để làm với thực tế là giao diện mạng kết thúc trong "chế độ Premiscious" và rằng chỉ có một nguồn có thể liên kết với giao diện đó? Nếu không, bạn đã thử sử dụng thư viện trăn 'threading' thay vì xếp hàng chưa? Tôi không chắc chắn toàn bộ hệ thống xếp hàng hoạt động thế nào nhưng với 'luồng' bạn sẽ có được quyền kiểm soát nhiều hơn về những gì khi ít nhất, và bạn có thể tinker xung quanh một chút. – Torxed