dpkt将小端数据包视为大端数据包

3

我正在使用dpkt解析一些ieee80211数据包。
我发现创建的ieee80211对象有错误的值。
深入挖掘后,我发现ieee80211将数据视为大端,而实际上我提供的数据包是小端。

有没有办法在运行时检测数据包的字节序,以便在提供给dpkt.ieee80211之前将其转换为大端呢?

3个回答

2
不应该有任何需要检测或猜测的内容。IEEE 802.11是一种标准协议,其规范说明了帧的每个部分的正确字节序。如果字节序被颠倒,则帧是畸形的。您可以在此处获得最新的标准副本(链接)
浏览了3500多页的pdf文档(感谢ctrl+f),大多数值似乎都是大端序,就像在TCP/IP中一样。但显然,偶尔使用小端序。例如,在某些TKIP字段中。坦率地说,这有点令人惊讶。
由于您没有提到要创建/解码的帧/字段,因此很难给出比查找更具体的建议。

该字段是帧控制。IEEE802.11的第一个字节为02,第二个字节为08。Wireshark以某种方式知道要交换这两个字节,并确定这是一个数据帧(0000 10 00中的10部分,即第二个字节08,但我期望它是第一个字节)。 - kroiz
这对你有帮助吗? https://dev59.com/wWct5IYBdhLWcg3wCJB- - Malt
在你链接的那个问题中的Wireshark截图中,你可以看到Wireshark在“帧控制”行上显示**(Normal)。在我的pcap中,Wireshark显示(Swapped)**。而且,在那个问题中的第一个字节是08,而在我的pcap中,08是第二个字节。所以,我认为Wireshark以某种方式理解了在我的IEEE80211中需要交换第一和第二个字节。我只是不知道它是如何做到的。 - kroiz
我明白了。这可能是一些有缺陷的实现,变得足够普遍以成为标准的事实。这种事情经常发生。我们应该查看wireshark解析器代码中这些帧的部分,看看它们如何决定是否翻转这些字节。0208可能只是一个无效值,而0802则可以吗? - Malt
我阅读了相关的Wireshark代码,但是无法理解:似乎有一个调用register_dissector dissect_ieee80211_bsfc的函数,但我不知道何时使用它而不是其他的dissectors。(bsfc代表字节交换帧控制) - kroiz
1
很不幸,我也遇到了同样的问题。我看到了注册和IEEE80211_COMMON_OPT_BROKEN_FC标志传递给解析器,但它们似乎都没有通过名称(wlan_bsfc)或句柄调用dissect_ieee80211_bsfc。我建议在https://ask.wireshark.org/或他们的开发邮件列表https://www.wireshark.org/lists/上提问。也许Wireshark的开发人员可以提供帮助。 - Malt

1

如果你不知道字节序的情况下,唯一可以检测到它的方式是注入有效载荷并以相同的方式解析。

然后,您可以通过检查注入的有效载荷的标识来检查字节序。


0
原来在CAPWAP下,IEEE80211的帧控制字节只是被简单地交换了。 这可能是一种最初的错误变成默认标准的情况。 请参见Wireshark Q&A中的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接