2015-12-01 59 views
2

我想創建一個監聽windows和linux的嗅探腳本。對於Linux,這很容易,但對於Windows而言,它不是。我遇到了一個錯誤,如下所示:python2.7 + windows 7 + scapy:select.error:(10038,'')

Traceback (most recent call last): 
    File "test_scapy.py", line 45, in <module> 
    main() 
    File "test_scapy.py", line 38, in main 
    sniff(filter="tcp port 80", prn=packet_callback, count=10) 
    File "C:\Python27\lib\site-packages\scapy\sendrecv.py", line 575, in sniff 
    sel = select([s],[],[],remain) 
select.error: (10038, '') 

我的代碼是

from scapy.all import * 

def packet_callback(packet): 
    print packet.show() 

sniff(filter="tcp port 80", prn=packet_callback, count=10) 

我看了後Scapy sniff() "an operation was performed on something that is not a socket"

和閱讀選擇文件https://docs.python.org/2/library/select.html 「在Windows File對象是不能接受的,但是套接字是在Windows上,底層的select()函數由WinSock庫提供,並且不處理源自WinSock的文件描述符。「

我認爲這意味着我必須重新定義嗅探套接字。所以我升級代碼

# create a raw socket and bind it to the public interface 
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 
    s.bind((HOST, 0)) 

    # Include IP headers 
    s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) 

    # receive all packages 
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) 

    sniff(filter="tcp port 80", prn=packet_callback, count=10, opened_socket=s) 
    s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF) 

現在沒問題,錯誤消失了。但我必須手動解析TCP RAW數據。

Now the question is: is there any easy way for me to sniffer for windows platform like using linux scapy layer wrapper, like call package[TCP].dst

任何建議表示讚賞。

+0

如果你有原始的流量字節,你可以使用相應的層來解析它。例如。 'p =以太(b'...')'會使用以太網解析字節。 –

+0

另外,我已經更新了Windows的實現,但它在python3和Windows 8及更高版本(沒有dnet要求)上開箱即用。你可以在這裏看到http://github.com/phaethon/scapy –

+0

我正在嘗試學習cython和pyrex,並在稍後爲自己弄清楚。 – unicea

回答

0

您正在使用哪個版本的Scapy?您應該更新到最新的(2.3.3)版本或更好的事件,從GitHub到當前的開發版本。