最近在做python的解析pcap包,但是在用dpkt.dns.DNS解析域名时有的正常解析出来了,有的却解析失败。。
这是解析dns域名的代码:
这是解析成功后打印出来的域名:
这是报错的信息:
有点崩溃。。百度过问题,但是我未解决。。
这是源码:
#!/usr/bin/python
# -*- coding: utf-8 -*
import dpkt
import time
import socket
def main(filepath):
with open(filepath,'rb') as f:
try:
pcap = dpkt.pcap.Reader(f) # 先按.pcap格式解析,若解析不了,则按pcapng格式解析
except:
pcap = dpkt.pcapng.Reader(f)
id = 0 # 初始序列为0
# 将时间戳和包数据分开,一层一层解析,其中ts是时间戳,buf存放对应的包
for (ts, buf) in pcap: # 遍历pcap数据
eth = dpkt.ethernet.Ethernet(buf) # 解包,物理层
if not isinstance(eth.data, dpkt.ip.IP): # 解包,网络层,判断网络层是否存在
continue
src_mac = eth.src.hex()
des_mac = eth.dst.hex()
src_mac = ':'.join(src_mac[i:i + 2] for i in range(0, 12, 2))
des_mac = ':'.join(des_mac[i:i + 2] for i in range(0, 12, 2))
ip = eth.data
src_ip = socket.inet_ntoa(ip.src) # 源地址
des_ip = socket.inet_ntoa(ip.dst) # 目的地址
if not isinstance(ip.data, dpkt.udp.UDP): # 解包,判断传输层协议是否是UDP
continue
transf_data = ip.data # 传输层负载数据,基本上分析流量的人都是分析这部分数据,即应用层负载流量
if not len(transf_data.data): # 如果应用层负载长度为0,即该包为单纯的tcp包,没有负载,则丢弃
continue
src_port = transf_data.sport # 源端口
des_port = transf_data.dport # 目的端口
if des_port != 53 and src_port != 53: # 判断是否是dns协议
continue
dns = dpkt.dns.DNS(transf_data.data)
domain_name = dns.qd[0].name # 域名
try:
response_ip = socket.inet_ntoa(dns.an[1].ip) # dns返回ip
except:
response_ip = "" # dns请求,则没有ip返回
str_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(ts)) # 传输时间
fcode = 1
id += 1
temp_str = transf_data.data.hex()
pcap_datas = [id, str_time, domain_name, src_ip, des_ip, src_port, des_port, response_ip, src_mac, fcode,
temp_str, len(transf_data.data)]
print(pcap_datas)
if __name__ == '__main__':
file_path = r"C:\Users\Alon丶T\Desktop\iodine_DNS.pcap"
main(file_path)
烦求各位大佬能够解决一下。。。