繁体   English   中英

如何确定NDIS 6筛选器驱动程序中802.11原始数据包是否具有FCS(4字节)?

[英]How to determine whether a 802.11 raw packet has FCS (4bytes) in a NDIS 6 filter driver?

我有一个在Windows Vista和更高版本的系统上运行的NDIS 6筛选器驱动程序。

我将其绑定在NativeWiFi Filter因此我可以看到802.11 packets而不是fake Ethernet packets

而且我已经基于以下数据包过滤器设置了NDIS_PACKET_TYPE_802_11_RAW_DATANDIS_PACKET_TYPE_802_11_RAW_MGMThttps : NDIS_PACKET_TYPE_802_11_RAW_DATA ( NDIS_PACKET_TYPE_802_11_RAW_MGMT ,因此我可以接收微型端口的Raw 802.11 Packets指示。

然后,我将无线适配器切换为“ Monitor Mode

到目前为止,我的筛选器驱动程序可以接收所有802.11 control and management数据包。

我的问题是如何确定802.11原始数据包在我的驱动程序中是否具有FCS(帧检查序列,4字节)

我之所以这样问是因为我Radiotap header数据包中添加Radiotap headerhttp://radiotap.org/ ),并且radiotap有一个名为Flags的字段,用于指定802.11数据包是否具有FCS。

我的笔记本电脑带有无线适配器Qualcomm Atheros AR9485WB-EG Wireless Network Adapter表明, Beacon和重新Reassociation Response数据包具有FCS,而所有其他802.11数据包均没有。 radiotap标头中的错误Flags将导致Wireshark为那些数据包显示格式错误的数据包。 这就是为什么我需要确定驱动程序中FCS的可用性。

我的代码如下所示,我想知道如何编写if条件。

    // [Radiotap] "Flags" field.
    if (TRUE) // The packet doesn't have FCS. We always have no FCS for all packets currently.
    {
        pRadiotapHeader->it_present |= BIT(IEEE80211_RADIOTAP_FLAGS);
        *((UCHAR*)Dot11RadiotapHeader + cur) = 0x0; // 0x0: none
        cur += sizeof(UCHAR) / sizeof(UCHAR);
    }
    else // The packet has FCS.
    {
        pRadiotapHeader->it_present |= BIT(IEEE80211_RADIOTAP_FLAGS);
        *((UCHAR*)Dot11RadiotapHeader + cur) = IEEE80211_RADIOTAP_F_FCS; // 0x10: frame includes FCS

        // FCS check fails.
        if ((pwInfo->uReceiveFlags & DOT11_RECV_FLAG_RAW_PACKET_FCS_FAILURE) == DOT11_RECV_FLAG_RAW_PACKET_FCS_FAILURE)
        {
            *((UCHAR*)Dot11RadiotapHeader + cur) |= IEEE80211_RADIOTAP_F_BADFCS; // 0x40: frame failed FCS check
        }

        cur += sizeof(UCHAR) / sizeof(UCHAR);
    }

有什么办法吗? 谢谢!

我的笔记本电脑带有无线适配器Qualcomm Atheros AR9485WB-EG无线网络适配器的实验表明,信标和重新关联响应数据包具有FCS,而所有其他802.11数据包均没有。

不,不是。 当我看着相同的捕获,并迫使“FCS年底”标志上,我发现比其他帧帧的LOT有一个FCS Wireshark的报告为有效。 不要以为,仅仅因为一个框架并没有表现出“畸形框架”的错误,它没有一个FCS; “格式错误的帧”错误是由于Wireshark认为FCS是帧数据,并试图剖析大于FCS的4个字节的项而引起的。 对于数据帧,802.11解剖器不会解剖有效载荷,并且如果有效载荷具有其自己的长度字段(如IPv4和IPv6帧那样),则将使用该长度,并且在FCS之后,FCS将被视为额外数据。有效负载,不会导致“格式错误的帧”错误。

您应该尝试检查uReceiveFlags是否已设置DOT11_RECV_FLAG_RAW_PACKET ,如果已设置,则假定该帧具有FCS,否则假定它没有。

请记住,在监视模式下,仍无法将无法完全接收的帧提供给主机,因此,在监视模式下,某些“格式错误的帧”错误可能是由于,例如,广播将帧短了,因此请不要假定“格式错误的帧”错误表示该帧不应设置“ FCS end end”标志。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM