2015-02-03 15 views
6

Tôi đang sử dụng scapy với python để đánh hơi lưu lượng truy cập trực tiếp.Sniffer gói scapy kích hoạt một hành động trên mỗi gói sniffed

capture=sniff(iface="<My Interface>", filter="tcp") 

Nhưng điều này ngửi mỗi gói và thêm nó vào danh sách capture mà có thể được xử lý sau.

Tôi muốn xử lý gói và hiển thị một số trường của gói, ngay sau khi được đánh hơi. tức là khi ngửi gói, nó sẽ kích hoạt một chức năng mà tôi có thể phân tích gói đó. Và điều này sẽ tiếp tục cho vài gói.

Tôi đã sẵn sàng chức năng mà tôi đang sử dụng với danh sách gói đã chụp. Nhưng tôi không thể sử dụng nó cho mỗi gói tin trực tiếp.

Làm cách nào để đạt được điều đó? Có thể với scapy hoặc tôi có cần cài đặt bất kỳ gói nào khác không?

Trả lời

7

Các tham số cho hàm sniff nên giống như mã dưới đây .:

from scapy.all import * 

def pkt_callback(pkt): 
    pkt.show() # debug statement 

sniff(iface="<My Interface>", prn=pkt_callback, filter="tcp", store=0) 

store=0 nói không lưu trữ bất kỳ gói dữ liệu nhận và prn nói gửi pkt-pkt_callback.

Source.

Như đã đề cập bởi Yoel, nếu chỉ có một hành động là cần thiết, lambda có thể được sử dụng với prn thay vì một chức năng mới như trong trường hợp này:

sniff(iface="<My Interface>", prn = lambda x: x.show(), filter="tcp", store=0) 
+0

Vui lòng đọc [câu trả lời này] (http://stackoverflow.com/a/28296641/3903832) về khiếu nại của bạn về cách đặt 'store = 0'. – Yoel

+0

@Yoel Nó sẽ không có bất kỳ tác động nào đến việc thực hiện chương trình. Nhưng bạn không nghĩ rằng, thêm mỗi gói vào một danh sách ('store = 1') là một chi phí phụ trong khi chúng tôi đang xử lý mỗi gói với' prn'. Chúng ta có thực sự cần lưu trữ các gói đó không? – RatDon

+0

Đó không phải là những gì bạn trả lời ban đầu được nêu. Tôi đồng ý rằng thiết lập 'store = 0' sẽ cải thiện một chút hiệu quả về không gian và thời gian và tôi thậm chí còn lập luận rằng trong một nhận xét cho [câu trả lời của tôi] (http://stackoverflow.com/a/28296641/3903832) khi bạn đã thực sự tuyên bố đối diện. Bây giờ bạn đã chỉnh sửa câu trả lời của bạn, nó là chính xác, mặc dù tôi không nhìn thấy những gì nó thêm vào các cuộc thảo luận kể từ khi trả lời của tôi và ý kiến ​​của nó, đã được đăng từ lâu, đã nêu tất cả các bên trên. – Yoel

5

Điều này có thể được thực hiện với đối số prn của hàm sniff. Hướng dẫn của Scapy có một ví dụ đơn giản here. Scapy 's official API documentation quy định cụ thể:

sniff(prn=None, lfilter=None, count=0, store=1, offline=None, L2socket=None, timeout=None)

...
prn: chức năng để áp dụng cho mỗi gói. Nếu một cái gì đó được trả về, nó sẽ được hiển thị. Ví dụ: bạn có thể sử dụng prn = lambda x: x.summary().
...


EDIT:
The accepted answer tuyên bố rằng lập luận store phải được thiết lập để 0 cho prn callback được gọi. Tuy nhiên, thiết lập store=0 không có bất kỳ tác dụng như vậy. Scapy's own examples không đặt store=0official API documentation không đề cập đến bất kỳ yêu cầu nào như vậy. Trong thực tế, việc kiểm tra mã nguồn của Scapy cho thấy không có kết nối nào giữa các đối số storeprn. Dưới đây là một đoạn trích của khối mã có liên quan:

... 
if store: 
    lst.append(p) 
c += 1 
if prn: 
    r = prn(p) 
    if r is not None: 
     print r 
... 

Thực hiện một vài trường hợp thử nghiệm đơn giản cũng hỗ trợ phát hiện này.

+0

Cảm ơn. Tôi đã tìm thấy nó và tôi đã đặt tham số 'store' thành' 0' tôi đoán là sẽ xử lý lưu lượng truy cập trực tiếp. Nhưng ở khắp mọi nơi nó được đề cập rằng nó là tốn thời gian và do đó, tôi sẽ cố gắng với một số phương tiện khác. Dù sao cũng cảm ơn. – RatDon

+0

Ồ, thật đáng ngạc nhiên. Tôi hy vọng thiết lập 'store = 0' sẽ hiệu quả hơn, nếu có. Bạn đã đọc cái này ở đâu? – Yoel

Các vấn đề liên quan