Использование Scapy для извлечения данных полезной нагрузки из PCAP - PullRequest
0 голосов
/ 25 октября 2019

Я хотел бы рассчитать размер полезной нагрузки пакетов из файла PCAP, используя Scapy, ниже, где я нашел функцию, которая делает это и обрабатывает все характеристики размера полезной нагрузки, например, медиана / мин / макс и т. Д.

Как я могу использовать эту функцию в моем файле 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 голосов
/ 26 октября 2019

Вы можете читать файлы pcap с помощью scapy следующим образом:

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

source: 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 не используется, поэтому я не могу это комментировать.

...