簡體   English   中英

使用 Scapy 從 PCAP 中提取有效負載數據

[英]Using Scapy to extract payload data from a PCAP

我想使用 Scapy 計算來自 PCAP 文件的數據包的有效負載大小,我在下面找到了一個 function 執行此操作並計算出所有有效負載大小統計信息,例如中值/最小值/最大值等。

如何在我的 PCAP 文件上使用此 function 並且在使用此 function 處理我的 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)

您可以像這樣使用 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的列表。 這可以使用標准的 Python 方法來完成,例如使用for循環,或者,如果你有一個索引匹配的dev_names列表,你可以zip列表:

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

filter_con似乎沒有被使用,所以我不能對此發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM