Python 中的数据包嗅探器
Packet sniffer in 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
有2个选项:
- 嗅探器只能抓到UDP包。
- 我正在接收 UDP 数据包。
我认为最合乎逻辑的答案是我的嗅探器无法正常工作,它只是捕获 UDP。有什么想法吗?
我自己正处于创建 python 数据包 parser/sniffer 的阶段,在我的研究中我发现,为了能够解析所有传入的数据包,如 TCP、ICMP、UDP、ARP。 .etc.,你不能使用下面的套接字类型,因为 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))
您正在使用"gethostbyname"并且此方法获取您计算机中所有IP地址中的一个。
代替此方法,您必须使用 "gethostbyname_ex" 来获取包含多个地址的列表。您必须 select 浏览器使用的地址,您将捕获 TCP、UDP 和 ICMP 数据包。
我想在 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
有2个选项:
- 嗅探器只能抓到UDP包。
- 我正在接收 UDP 数据包。
我认为最合乎逻辑的答案是我的嗅探器无法正常工作,它只是捕获 UDP。有什么想法吗?
我自己正处于创建 python 数据包 parser/sniffer 的阶段,在我的研究中我发现,为了能够解析所有传入的数据包,如 TCP、ICMP、UDP、ARP。 .etc.,你不能使用下面的套接字类型,因为 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))
您正在使用"gethostbyname"并且此方法获取您计算机中所有IP地址中的一个。 代替此方法,您必须使用 "gethostbyname_ex" 来获取包含多个地址的列表。您必须 select 浏览器使用的地址,您将捕获 TCP、UDP 和 ICMP 数据包。