从 PCAP 文件中提取时间并保存为 CSV 文件

Posted

技术标签:

【中文标题】从 PCAP 文件中提取时间并保存为 CSV 文件【英文标题】:Extract Time from PCAP file and save as CSV file 【发布时间】:2019-09-04 15:41:47 【问题描述】:

我想从 PCAP 文件中提取仅用于 ARP 数据包的日期时间,并希望保存为 csv/txt。我确实使用下面的代码来提取时间。打印命令随着时间的推移工作正常。但是当它保存在 csv 文件中时,它只有一个日期和一次(例如 14:59:58)保存到 csv 文件中。任何人都可以建议修改从 pcap 中提取 ARP 时间并正确保存到 csv 的代码。谢谢。

with open("../data/" + filename + ".pcap", 'rb') as f: pcap = dpkt.pcap.Reader(f)

    requests = []
    replies = []

    for ts, buf in pcap:

        eth = dpkt.ethernet.Ethernet(buf)
        # If the packet is not arp

        if eth.type != 2054:
            continue
        try:
            arp = eth.arp
        except Exception as e:
            continue

        src = dpkt.socket.inet_ntoa(arp.spa)
        tgt = dpkt.socket.inet_ntoa(arp.tpa)

        if arp.op == 2:
            count_duplication(replies, src, tgt)

        elif arp.op == 1:
            count_duplication(requests, src, tgt)


        packet_time = datetime.datetime.utcfromtimestamp(ts).strftime("%m/%d/%Y, %H:%M:%S")

        print (packet_time)

  save_packets(sorted(requests, key=lambda x: -x[2]), '../tmp/count-requests-xyz' + '.csv', packet_time)

# Save Packets

def save_packets(packets,filename,tcp,ts, degree_sorted): 使用 open(filename, 'w') 作为 f: 对于数据包中的数据包: 数据='' 对于包裹中的物品: 数据 = 数据 + str(item) + ',' f.write(data + tcp + datetime.datetime.utcfromtimestamp(ts).strftime("%m/%d/%Y, %H:%M:%S") + degree_sorted + '\n')

【问题讨论】:

解释所需的 csv 结构。你知道如何找到仅 ARP 的数据包吗? CSV 文件将包含 src_ip、dst_ip、数据包数量、时间......是的,我知道如何仅提取 ARP 数据包,我已经根据需要的特征提取。 【参考方案1】:
import socket
import datetime
import dpkt


def _inet_to_str(inet):
    try:
        return socket.inet_ntop(socket.AF_INET, inet)
    except ValueError:
        return socket.inet_ntop(socket.AF_INET6, inet)


def arp(pcap_path):
    def _is_arp(packet):
        return True

    with open(pcap_path, 'rb') as f:
        pcap = dpkt.pcap.Reader(f)
        for ts, buf in pcap:
            eth = dpkt.ethernet.Ethernet(buf)
            if not isinstance(eth.data, dpkt.ip.IP):
                continue

            if not _is_arp(eth):
                continue
            ip = eth.data
            # write to file instead of printing
            print(',,'.format(_inet_to_str(ip.src), _inet_to_str(ip.dst),
                                    datetime.datetime.utcfromtimestamp(ts).strftime("%m/%d/%Y, %H:%M:%S")))

【讨论】:

嗨,感谢您的代码。但你能检查我的代码并提供建议吗? for ts, buf in pcap: eth = dpkt.ethernet.Ethernet(buf) # If the packet is not arp if eth.type != 2054: continue try: arp = eth.arp except Exception as e: continue src = dpkt. socket.inet_ntoa(arp.spa) tgt = dpkt.socket.inet_ntoa(arp.tpa) if arp.op == 2: count_duplication(replies, src, tgt) elif arp.op == 1: count_duplication(requests, src, tgt) 您发布的代码是部分的。请分享当前输出和所需输出。 (仅样本) packet_time = datetime.datetime.utcfromtimestamp(ts).strftime("%m/%d/%Y, %H:%M:%S") 打印(packet_time) 这篇文章中的代码是不是你所有的代码。共享代码(或可以运行的代码示例),以便我们可以针对 pcap 文件运行它。 修改f.write(data + tcp + timestamp + degree_sorted + '\n')f.write(data + tcp + datetime.datetime.utcfromtimestamp(ts).strftime("%m/%d/%Y, %H:%M:%S") + degree_sorted + '\n')

以上是关于从 PCAP 文件中提取时间并保存为 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 zip 中提取 csv 文件并在 python 中将其保存到磁盘? [复制]

从 pcap 转换为 csv

如何从 pcap 文件中提取所有数据包的 TCP 标头?

程序从pcap文件中获取端口号并将它们保存在excel文件中

如何从 csv 文件中提取图像、标签并使用 Torch 创建训练集?

使用 JMeter,如何从 API 的响应正文中提取字符串并将其保存到 csv 文件?