Я работаю с библиотекой <b>pyshark</b> на Python и анализирую .pcapng файл с сетевым трафиком. Мне необходимо извлечь значение расширения TLS, которое **не является первым** в списке расширений. Например, я хочу получить значение поля "tls.handshake.extension.type" для расширения "Extension: supported_versions". В данный момент выводится значение "Extension: Reserved", которое располагается первым в списке расширений. Как мне это исправить?
Для извлечения определенного расширения TLS из файла .pcapng с помощью библиотеки PyShark, вам потребуется пройти через каждый пакет в вашем файле и отфильтровать необходимые данные. В случае, если расширение не является первым в списке, вам нужно будет пройти циклом через все расширения и выбрать то, которое вам нужно. Вот пример того, как вы можете сделать это: ```python import pyshark # Замените 'your_file.pcapng' на путь к вашему pcapng файлу file_path = 'your_file.pcapng' # Открытие файла с помощью PyShark cap = pyshark.FileCapture(file_path, display_filter='tls.handshake.type == 1') # Отбираем только сообщения handshake for packet in cap: # Проверяем, есть ли TLS расширения в пакете if hasattr(packet, 'tls') and hasattr(packet.tls, 'handshake'): # Получаем все расширения из пакета extensions = packet.tls.handshake.extensions for extension in extensions: # Проверка на нужное расширение if 'Extension: supported_versions' in str(extension): # Выводим тип расширения print(extension.extension_type) break # Выходим из цикла, если расширение найдено # Закрытие захвата cap.close() ``` Обратите внимание на следующие моменты в коде: 1. Мы используем `display_filter` для фильтрации только тех пакетов, которые относятся к handshake TLS. Это нужно для оптимизации. 2. Проверяем, есть ли атрибуты `tls` и `handshake` в пакете перед тем, как к ним обращаться, чтобы избежать ошибок, если пакет не содержит этих данных. 3. Проходим через все найденные расширения и ищем нужное по имени. 4. После поиска нужного расширения можем вывести его тип или любое другое требуемое значение. Этот пример может потребовать модификации в зависимости от конкретных данных в вашем `.pcapng` файле, но задаёт общий подход к решению вашей задачи.
Так не пойдёт?
import pyshark display_filter = 'tls.record.content_type == 22' pcap = pyshark.FileCapture(file_path, display_filter=display_filter) d = {} for packet_number, packet in enumerate(pcap): for layer in packet: if 'Supported Version:' in str(layer): for line in str(layer).splitlines(): if 'Supported Version:' in line: tls_version = line.split(' ')[3] if packet_number in d: d[packet_number].append(tls_version) else: d[packet_number] = [tls_version] print(d) >>> {0: ['1.3', '1.2'], 1: ['1.3'], 2: ['1.3', '1.2'], 3: ['1.3'], 4: ['1.3', '1.2'], 5: ['1.3']}