python3中利用dpkt模块解析dns域名时报错

最近在做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)

烦求各位大佬能够解决一下。。。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值