我正在开展一个涉及阅读数据包的学校项目。我需要知道数据包的源和目标IP,协议以及源和目标端口。现在我的IP头运行良好,但是当我从TCP头显示端口时,我只在某些时候收到错误。我也不想使用外部库和工具,因为我不确定标记时项目将在哪个环境中进行测试。
错误
Traceback (most recent call last):
File "capturePacket.py", line 26, in <module>
tcp_hdr = struct.unpack("!HHII2sH2sH", tcpheader)
struct.error: unpack requires a buffer of 20 bytes
一些指导会有所帮助。谢谢。
import socket,struct,binascii,os
#if windows
if os.name == "nt":
s = socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP)
s.bind((socket.gethostname(),0))
s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)
s.ioctl(socket.SIO_RCVALL,socket.RCVALL_ON)
#if other
else:
s=socket.socket(socket.PF_PACKET, socket.SOCK_RAW, socket.ntohs(0x0800))
while True:
pkt=s.recvfrom(65565)
print ("\n\nIP Header:")
ipheader = pkt[0][14:34]
ip_hdr = struct.unpack("!1s1s1H1H2s1B1B2s4s4s",ipheader)
print ("Source IP", socket.inet_ntoa(ip_hdr[8]))
print ("Destination IP", socket.inet_ntoa(ip_hdr[9]))
print ("Protocol", ip_hdr[6])
print ("\n\nTCP Header:")
tcpheader = pkt[0][34:54]
tcp_hdr = struct.unpack("!HHII2sH2sH", tcpheader)
print ("Source Port:", tcp_hdr[0])
print ("Destination Port:", tcp_hdr[1])
答案 0 :(得分:0)
问题非常简单;您既没有将BPF过滤器传递给嗅探器,也没有将数据包捕获限制为仅限TCP,也没有检查IP协议值是否实际上是6或TCP。
所有这一切的意思是,当你试图解压缩你所假设的TCP头时,你可能会在UDP或ICMP数据包(或其他一些嵌入式协议)中找到更少的数据。疗程)。