2013-07-11 70 views
2

我創建了一個簡單的基於RAW套接字的數據包嗅探器。但是當我運行它時,它很少捕獲一個數據包。首先我創建了這個功能,以1秒的時間間隔捕獲數據包,但看到沒有數據包被捕獲,我評論了該行。我連接到互聯網,很多http流量都在這裏和那裏,但我無法捕捉到一個。在創建套接字的代碼中是否存在這個問題?請有人給我一個解決方案。我對python編程相當陌生,無法理解如何解決這個問題。原始套接字python數據包嗅探器

import socket, binascii, struct 
import time 

sock = socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.htons(0x800)) 
print "Waiting.." 
pkt = sock.recv(2048) 
print "received" 

def processEth(data): 
    #some code to process source mac and dest. mac  
    return [smac, dmac] 

def processIP(data): 
    sip = str(binascii.hexlify(data[1])) 
    dip = str(binascii.hexlify(data[2])) 
    return [sip, dip] 

def processTCP(data): 
    sport = str(data[0]) 
    dport = str(data[1]) 
    return [sport, dport] 


while len(pkt) > 0 : 

    if(len(pkt)) > 54: 
     pkt = sock.recv(2048) 
     ethHeader = pkt[0][0:14] 
     ipHeader = pkt[0][14:34] 
     tcpHeader = pkt[0][34:54] 

     ethH = struct.unpack("!6s6s2s",ethHeader) 
     ethdata = processEth(ethH) 

     ipH = struct.unpack("!12s4s4s",ipHeader) 
     ipdata = processIP(ipH) 

     tcpH = struct.unpack("!HH16", tcpHeader) 
     tcpdata = processTCP(tcpH) 

     print "S.mac "+ethdata[0]+" D.mac "+ethdata[1]+"  from: "+ipdata[0]+":"+tcpdata[0]+" to: "+ipdata[1]+":"+tcpdata[1] 
     #time.sleep(1); 

    else: 
     continue 
+1

僅供參考。 http://stackoverflow.com/questions/6878603/strange-raw-socket-on-mac-os-x – Ben

回答

3

如果您顯示了所有的代碼,您將遇到無限循環。 只要沒有長度大於54字節的數據包到來,您最終會一直讀取同一個數據包。

此外,socket.recv()返回一個字符串/字節序列;您訪問數據的方法是錯誤的。 pkt [0]返回長度爲1的字符串; pkt [0] [x:y]不會返回有用的東西。我有不熟悉使用套接字,但有一些變化,我得到的輸出可能看起來類似於你的意圖(processEth()我認爲...)中缺少的東西...)。

[...] 

while len(pkt) > 0: 

    print "Waiting.." 
    pkt = sock.recv(2048) 
    print "received" 

    if(len(pkt)) > 54: 
     ethHeader = pkt[0:14] 
     ipHeader = pkt[14:34] 
     tcpHeader = pkt[34:38] 

     ethH = struct.unpack("!6s6s2s",ethHeader) 
     ethdata = processEth(ethH) 

     ipH = struct.unpack("!12s4s4s",ipHeader) 
     ipdata = processIP(ipH) 

     tcpH = struct.unpack("!HH16", tcpHeader) 
     tcpdata = processTCP(tcpH) 

     print "S.mac "+ethdata[0]+" D.mac "+ethdata[1]+"  from: "+ipdata[0]+":"+tcpdata[0]+" to: "+ipdata[1]+":"+tcpdata[1] 
     #time.sleep(1); 

    else: 
     continue 
+0

感謝@polygox :) – Deepal