【问题标题】:Raw socket python packet sniffer原始套接字 python 数据包嗅探器
【发布时间】:2013-07-11 20:04:42
【问题描述】:

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

【问题讨论】:

标签: python sockets raw-sockets


【解决方案1】:

如果您显示所有代码,您将陷入无限循环。 每当一个长度不超过 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

【讨论】:

    猜你喜欢
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2014-08-31
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多