原始套接字python数据包嗅探器



我创建了一个简单的基于RAW套接字的数据包嗅探器。但当我运行它时,它很少捕获到一个数据包。首先,我创建它是为了在1秒的时间间隔内捕获数据包,但由于没有捕获到数据包,我评论了这一行。我连接到了互联网,很多http流量到处都是,但我无法捕捉到一个。在我创建套接字的代码中有问题吗?请有人给我一个解决方案。我是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

如果您显示了所有的代码,那么您将进入一个无休止的循环。每当一个长度不超过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

最新更新