2011-06-03 78 views
3

我已經看到了創建套接字使用嗅探IP數據包,例如幾個例子:Python原始套接字(Windows)中:嗅探以太網幀

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP) 

我所試圖實現的,是嗅探以太網框架並分析Windows中收到的數據。我感興趣的數據包是PPPoE幀不包含IP

的Linux(使用Python),我能夠做到這一點使用:

s = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(3)) 
s.setsockopt(socket.SOL_SOCKET, IN.SO_BINDTODEVICE, struct.pack("%ds"%(len("eth0")+1,),"eth0")) 
while condition: 
    pkt = s.recvfrom(1500) 
    addToQueue(filter(pkt)) 

現在由於betweeen Linux的插座的WinSock2 API的差異,我有以下兼容性問題:

  • 對於windows沒有IN包。這意味着SO_BINDTODEVICE不存在。 我如何嗅探eth0接口上的所有內容?
  • 我應該在socket()構造函數中使用協議選項,因爲我不想將其限制爲IPPROTO_IP。

任何人都可以指向正確的方向嗎?我經歷了類似的問題去,但他們沒有真正解決我的問題,因爲他們都關心的IP數據包嗅探

注:我知道像Scapy的庫可用於嗅探,但如果我們試圖做到這一點失去了包任何精心過濾(或使用prn函數),並不適合我想要做的。原始插座完全符合我的需求。

回答

2

沒有Windows中我無法驗證這一點,但我認爲,所有你需要的是...

HOST = socket.gethostbyname(socket.gethostname()) 
s = socket.socket(socket.AF_INET, socket.SOCK_RAW) 
s.bind((HOST, 0)) 
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) 
while condition: 
    pkt = s.recvfrom(1500) 
    addToQueue(filter(pkt)) 

另外,我建議你在看使用類似pypcap(或其他而不是使用libpcap包裝。

相關問題