无法理解PcapNG文件中的802.11数据帧格式

时间:2015-03-30 16:36:31

标签: python wifi wireshark 802.11 pcap-ng

我有Wireshark创建的 PcapNG 文件,我尝试用python-pcapng解析。

但是,我无法弄清楚如何将我从FileScanner的{​​{1}}收到的输出与 802.11数据帧格式进行协调:802.11 Data frame format

这是我得到的输出(我的代码在底部):

packet_payload_info

您能告诉我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 在802.11数据框中的位置吗?*

  • ,即第一个字节在框架中的位置是什么?

Python代码:

packet_payload_data

编辑1:

如果我打印多个#!/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开头。现在,packet_payload_data是数据框标记,这使我怀疑00 00 19 00 6F 08 00 00不仅仅是有效载荷数据,还包括帧控制位。

08

1 个答案:

答案 0 :(得分:1)

首先,假设,仅仅因为您在802.11接口上捕获,帧数据以802.11标头开头。它可能以"无线电元数据"开头。例如,标题后跟802.11标题。

读取pcap-ng文件的所有程序必须:

  • 读取所有接口描述块,并至少记住该IDB的序号(稍后将用作接口ID)和接口的LinkType值;
  • 处理数据包块时,查找具有指定接口ID的接口的LinkType值,并使用它来解释原始数据包数据。

The official list of LinkType values表示值是什么以及如何为该值解释分组数据。永远不会假设分组数据会是什么样子;始终检查LinkType值。

(这也适用于pcap文件;请务必检查文件的链接层标题类型。)

现在,请注意00 00 19 00 6F 08 00 00可能是radiotap标头的开头,版本值为0,填充字节为0,小端长度为25字节,第一个存在位字为0x0000086F。该存在位字将表示存在的字段为TSFT(8字节),Flags(1字节),Rate(1字节),Channel (4字节),Antenna signal(1字节),Antenna noise(1字节)和Antenna(1字节)。版本,填充字节,长度和存在位字是8个字节,总共8 + 8 + 1 + 1 + 4 + 1 + 1 + 1 = 25个字节。

所以我绝对会 NOT 假设您正在查看802.11标头!你必须检查LinkType;如果它是127(LINKTYPE_IEEE802_11_RADIOTAP),则数据包以radiotap头开始,接着是802.11头。如果它是105(LINKTYPE_IEEE802_11),则它们以802.11标头开头。

802.11报头,无论是跟随radiotap(或其他无线电元数据)报头还是位于原始分组数据的开头,都是原始的802.11报头,因此它首先是帧控制字段,然后是持续时间,等等。