使用Scapy从PCAP提取有效载荷数据

时间:2019-10-25 10:47:39

标签: python scapy

我想使用Scapy计算来自PCAP文件的数据包的有效负载大小,下面是我找到一个执行此操作并计算出所有有效负载大小统计信息的函数,例如中位数/最小/最大等。

如何在我的PCAP文件上使用此功能,并且在使用此功能处理PCAP文件之前,我需要对我的PCAP文件做任何事情。

这可以写得更简单吗?

def calc_IP_payload_size_features(packet_list, filter_con):
    global IP_len
    global IP_len_list
    global slice_length
    IP_len_list = []

    for i, (packet, dev_name) in enumerate(packet_list):
        try:
            IP_len.append(packet["IP"].len - packet["IP"].ihl)
        except IndexError:
            # IP_len.append(0)
            pass
        yield packet, dev_name

    # print("IP_len", IP_len)
    IP_len_list.append(IP_len)
    IP_len = []

    for i, (data) in enumerate(IP_len_list):
        if len(data) == 0:
            data.append(0)
        data = data[:min(slice_length, len(data)-1)]
        min_ip_len = min(data)  # minimum IP packet size
        max_ip_len = max(data)  # maximum IP packet size
        q1_ip_len = np.percentile(data, 25)  # first quartile of IP packet size
        median_ip_len = np.percentile(data, 50)  # median of IP packet size
        mean_ip_len = np.mean(data)  # mean of IP packet size
        q3_ip_len = np.percentile(data, 75)  # third quartile of IP packet size
        var_ip_len = np.var(data)  # variance of IP packet size
        iqr_ip_len = q3_ip_len - q1_ip_len  # IQR of IP packet size

        # print(i, "IP payload size features: ", min_ip_len, max_ip_len, q1_ip_len, median_ip_len, mean_ip_len, q3_ip_len, var_ip_len, iqr_ip_len)

        feature_list[i].append(min_ip_len)
        feature_list[i].append(max_ip_len)
        feature_list[i].append(q1_ip_len)
        feature_list[i].append(median_ip_len)
        feature_list[i].append(mean_ip_len)
        feature_list[i].append(q3_ip_len)
        feature_list[i].append(var_ip_len)
        feature_list[i].append(iqr_ip_len)

1 个答案:

答案 0 :(得分:0)

您可以像这样用scapy读取pcap文件:

pcap_contents = rdpcap("/path/to/foo.pcap")

来源:https://scapy.readthedocs.io/en/latest/usage.html#reading-pcap-files

这将返回一个scapy.plist.PacketList,您可以使用标准Python技术(例如,一个for循环)对其进行迭代:

for packet in pcap_contents:
    print(len(packet))

但是,您的循环似乎期望packet_list包含(packet, dev_name)的元组:

for i, (packet, dev_name) in enumerate(packet_list):

我的随机样本pcap文件当然不会产生这种数据,因此您可能需要首先将每个数据包与dev_name匹配,以产生(packet, dev_name) tuple的列表s。这可以使用标准的Python方法来完成,例如for循环,或者,如果您有dev_names索引匹配的列表,则可以zip列表:

packets = [IP()/TCP(), IP()/UDP()]
dev_names = ['foo', 'bar']
packet_list = zip(packets, dev_names)

filter_con似乎没有被使用,所以我无法对此发表评论。