Python中的包嗅探器

2024-04-29 12:44:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在Python 3.5中做一个包嗅探器,它捕获UDP、TCP和ICMP。这是一个简短的例子:

 import socket
 import struct

# the public network interface
HOST = socket.gethostbyname(socket.gethostname())
# create a raw socket and bind it to the public interface
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)

s.bind((HOST,0))

# Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

# receive all packages
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

# receive a package
n=1
while(n<=400):
    print('Number ', n)
    data=s.recvfrom(65565)
    packet=data[0]
    address= data[1]
    header=struct.unpack('!BBHHHBBHBBBBBBBB', packet[:20])
    if(header[6]==6): #header[6] is the field of the Protocol
        print("Protocol = TCP")
    elif(header[6]==17):
        print("Protocol = UDP")
    elif(header[5]==1):
        print("Protocol = ICMP") 
    n=n+1

问题是它只捕获UDP数据包:( 输出:

Number  1 Protocol = UDP Number  2 Protocol = UDP Number  3 Protocol = UDP Number  4 Protocol = UDP Number  5 Protocol = UDP Number  6 Protocol = UDP Number  7

有两种选择:

  • 嗅探器只能捕获UDP数据包。
  • 我刚收到UDP数据包。

我认为最合理的答案是我的嗅探器工作不正常,它只是捕获UDP。知道吗?


Tags: theimportipnumberdatasocket数据包protocol
2条回答

您正在使用“gethostbyname”,此方法在计算机中的所有ip地址之间获取一个地址。 您必须使用“gethostbyname_ex”来代替此方法,该方法获取一个包含多个addrese的列表。您必须选择用于浏览器的地址,然后才能保护TCP、UDP和ICMP数据包。

我自己正处于创建python包解析器/嗅探器的阶段,在我的研究中,我发现,要能够解析所有传入的包,如TCP、ICMP、UDP、ARP等等,您不能使用下面的套接字类型,因为socket.IPPROTO_IP只给出IP包,是一个虚拟协议

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

相反,您必须使用它并在Linux系统中运行得最好

s = socket.socket( socket.AF_PACKET , socket.SOCK_RAW , socket.ntohs(0x0003))

相关问题 更多 >