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

3
我创建了一个简单的基于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

1
FYI.https://dev59.com/HGw15IYBdhLWcg3wA3KT - Ben
1个回答

3
如果你展示了所有的代码,你就陷入了无限循环当中。 每当输入一个长度不大于54字节的数据包时,你就会一直读取同样的数据包。
此外,socket.recv()返回一个字符串/字节序列,你的数据访问方法是错误的。pkt[0]返回一个长度为1的字符串;pkt[0][x:y]不会返回有用的信息。
我不熟悉使用sockets,但经过一些改动后,我得到了一个可能类似于你想要的输出(我认为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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接