Не удается понять формат фрейма данных 802.11 в файле PcapNG
У меня есть файлы PcapNG, созданные Wireshark, с которыми я пытаюсь разобрать python-pcapng
,
Тем не менее, я не могу понять, как согласовать вывод, который я получаю от FileScanner
"s packet_payload_info
с форматом фрейма данных 802.11:
Это вывод, который я получаю (мой код внизу):
magic_number 0xa0d0d0a
SectionHeader(version_major=1, version_minor=0, section_length=-1, options=Options({'shb_userappl': [u'Dumpcap 1.12.4 (v1.12.4-0-gb4861da from master-1.12)'], 'shb_os': [u'Mac OS X 10.10.2, build 14C109 (Darwin 14.1.0)']}))
magic_number 0x1
InterfaceDescription(link_type=127, reserved='\x00\x00', snaplen=262144, options=Options({'if_os': [u'Mac OS X 10.10.2, build 14C109 (Darwin 14.1.0)'], 'if_tsresol': [6], 'if_name': [u'en1']}))
magic_number 0x6
EnhancedPacket(interface_id=0, timestamp_high=332139, timestamp_low=2801116064L, packet_payload_info=(45, 45, '\x00\x00\x19\x00o\x08\x00\x00`I\xb2&\x00\x00\x00\x00\x12\x18q\x16@\x01\xb1\xaa\x00\xb4\x00\x90\x00\xf4\x0f\x1b\xb8sL`\x92\x175\x00\x01\xe3\xcf\x00\x12'), options=Options({}))
packet_payload_info : (45, 45, '\x00\x00\x19\x00o\x08\x00\x00`I\xb2&\x00\x00\x00\x00\x12\x18q\x16@\x01\xb1\xaa\x00\xb4\x00\x90\x00\xf4\x0f\x1b\xb8sL`\x92\x175\x00\x01\xe3\xcf\x00\x12')
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 60 49 B2 26 00 00 00 00 12 18 71 16 40 01 B1 AA 00 B4 00 90 00 F4 0F 1B B8 73 4C 60 92 17 35 00 01 E3 CF 00 12
packet_payload_data (bin): 00000000 00000000 00011001 00000000 01101111 00001000 00000000 00000000 01100000 01001001 10110010 00100110 00000000 00000000 00000000 00000000 00010010 00011000 01110001 00010110 01000000 00000001 10110001 10101010 00000000 10110100 00000000 10010000 00000000 11110100 00001111 00011011 10111000 01110011 01001100 01100000 10010010 00010111 00110101 00000000 00000001 11100011 11001111 00000000 00010010
Не могли бы вы сказать мне, где packet_payload_data
вписывается в кадр данных 802.11?*
- т.е. где его первый байт помещается в кадре
Код Python:
#!/usr/bin/env python
from pcapng import FileScanner
def hex_str_to_num(hex_str,out_format='X'):
if out_format.upper() == 'B':
return ' '.join(format(ord(x), out_format).zfill(8) for x in hex_str)
else:
return ' '.join(format(ord(x), out_format).zfill(2) for x in hex_str)
PCAPNG = "/cygdrive/c/tmp/trace3.pcapng"
MAX = 3
ENHANCEDPACKET_ID = 6
with open(PCAPNG, "r") as pcapng_file:
scanner = FileScanner(pcapng_file)
counter = MAX
for block in scanner:
print
print "magic_number",hex(block.magic_number)
print block
if block.magic_number == ENHANCEDPACKET_ID:
print
payload_data = block.packet_payload_info[2]
print "packet_payload_info :",block.packet_payload_info,"\n"
print "packet_payload_data (hex):",hex_str_to_num(payload_data,"X"),"\n"
print "packet_payload_data (bin):",hex_str_to_num(payload_data,"b")
counter -= 1
if not counter:
break
РЕДАКТИРОВАТЬ 1:
Если я печатаю несколько EnhancedPacket
"s packet_payload_data
Я заметил, что все они начинаются с 00 00 19 00 6F 08 00 00
, Теперь 08
маркер фрейма данных, который заставляет меня подозревать, что packet_payload_data
это не только данные полезной нагрузки, но и биты управления кадром.
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 60 49 B2 26 00 00 00 00 12 18 71 16 40 01 B1 AA 00 B4 00 90 00 F4 0F 1B B8 73 4C 60 92 17 35 00 01 E3 CF 00 12
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 92 49 B2 26 00 00 00 00 12 18 71 16 40 01 CD AA 00 C4 00 60 00 60 92 17 35 00 01 F7 65 6E 79
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 09 4A B2 26 00 00 00 00 12 18 71 16 40 01 CA AA 00 94 00 00 00 60 92 17 35 00 01 F4 0F 1B B8 73 4C 04 00 C0 23 FF FF FF FF FF FF FF FF 58 D0 59 5C
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 5F 51 B2 26 00 00 00 00 52 6C 71 16 40 01 B2 AA 00 B4 00 1C 1B F4 0F 1B B8 73 4C 60 92 17 35 00 01 33 20 02 04
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 86 51 B2 26 00 00 00 00 12 6C 71 16 40 01 CA AA 00 C4 00 4C 00 60 92 17 35 00 01 EE 12 B7 D7
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 EE 53 B2 26 00 00 00 00 12 6C 71 16 40 01 B1 AA 00 B4 00 74 00 F4 0F 1B B8 73 4C 60 92 17 35 00 01 33 20 02 04
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 15 54 B2 26 00 00 00 00 12 6C 71 16 40 01 CB AA 00 C4 00 4C 00 60 92 17 35 00 01 EE 12 B7 D7
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 98 56 B2 26 00 00 00 00 52 6C 71 16 40 01 B2 AA 00 AB 00 74 00 F4 0F 1B B8 73 3C E4 44 DF 67 09 14 3A 0A 24 04
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 C0 56 B2 26 00 00 00 00 12 6C 71 16 40 01 CB AA 00 C4 00 4C 00 60 92 17 35 00 01 EE 12 B7 D7
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 E8 58 B2 26 00 00 00 00 12 18 71 16 40 01 B1 AA 00 B4 00 90 00 F4 0F 1B B8 73 4C 60 92 17 35 00 01 E3 CF 00 12
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 1B 59 B2 26 00 00 00 00 12 18 71 16 40 01 CD AA 00 C4 00 60 00 60 92 17 35 00 01 F7 65 6E 79
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 92 59 B2 26 00 00 00 00 12 18 71 16 40 01 CA AA 00 94 00 00 00 60 92 17 35 00 01 F4 0F 1B B8 73 4C 04 00 D0 23 FF FF FF FF FF FF FF FF B0 51 F7 7B
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 A0 69 B2 26 00 00 00 00 12 6C 71 16 40 01 C6 AA 00 B4 00 C0 00 50 2E 5C DA 81 9D F4 0F 1B B8 73 4C B4 E2 C5 B7
packet_payload_data (hex): 00 00 19 00 6F 08 00 00 17 6A B2 26 00 00 00 00 12 6C 71 16 40 01 C5 AA 00 B4 00 C0 00 50 2E 5C DA 81 9D F4 0F 1B B8 73 4C B4 E2 C5 B7
1 ответ
Прежде всего, не думайте, что только потому, что вы захватили интерфейс 802.11, данные кадра начинаются с заголовка 802.11. Он может начинаться с заголовка "радиометаданных", например, после заголовка 802.11.
ВСЕ программы, которые читают файлы pcap-ng, должны:
- прочитать все блоки описания интерфейса и запомнить, как минимум, порядковый номер этого IDB (который будет использоваться позже в качестве идентификатора интерфейса) и значение LinkType для интерфейса;
- при обработке блока пакета найдите значение LinkType для интерфейса с указанным идентификатором интерфейса и используйте его для интерпретации необработанных данных пакета.
Официальный список значений LinkType указывает, что это за значения и как данные пакета должны интерпретироваться для этого значения. Никогда и никогда не предполагал, как будут выглядеть пакетные данные; всегда проверяйте значение LinkType.
(Это относится и к файлам pcap; всегда проверяйте тип заголовка канального уровня файла.)
Теперь обратите внимание, что 00 00 19 00 6F 08 00 00
может быть началом заголовка радиоленты со значением версии 0, байтом заполнения 0 и длиной с прямым порядком байтов 25 байтов, причем первое слово бита присутствия будет 0x0000086F. Это слово бита присутствия будет означать, что присутствующими полями будут TSFT (8 байт), флаги (1 байт), скорость (1 байт), канал (4 байта), сигнал антенны (1 байт), шум антенны (1). байт) и антенна (1 байт). Версия, бит байта, длина и слово бита присутствия составляют 8 байтов, всего 8+8+1+1+4+1+1+1 = 25 байтов.
Так что я бы определенно НЕ предположил, что вы смотрите на заголовок 802.11! Вы должны проверить LinkType; если это 127 (LINKTYPE_IEEE802_11_RADIOTAP), пакеты начинаются с заголовка радиоленты, за которым следует заголовок 802.11. Если это 105 (LINKTYPE_IEEE802_11), они начинаются с заголовка 802.11.
Заголовок 802.11, следует ли он заголовку радиоленты (или другим метаданным радиосвязи) или находится в начале необработанных пакетных данных, является необработанным заголовком 802.11, поэтому он начинается с поля управления кадром, за которым следует Продолжительность и т. Д.