我有一个NDIS 6过滤器驱动程序在Windows Vista和更高版本的系统上工作。
我把它绑在NativeWiFi Filter
下面,这样我就可以看到802.11 packets
而不是fake Ethernet packets
。
我已经在包过滤器中根据:https://msdn.microsoft.com/en-us/library/windows/hardware/ff554833(v=vs.85).aspx设置了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
(http://radiotap.org/),radiotap有一个名为Flags
的字段,指定802.11包是否有FCS。
我在笔记本电脑上使用无线适配器Qualcomm Atheros AR9485WB-EG Wireless Network Adapter
的实验表明Beacon
和Reassociation Response
数据包都有FCS,而所有其他802.11数据包都没有FCS。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无线网络适配器的实验表明,Beacon和重新关联响应数据包具有FC,而所有其他802.11数据包都没有。
不,没有。当我查看同一个捕获,并强制打开“FCS a t end”标志时,我发现除了那些帧之外的许多帧都有一个被Wireshark报告为有效的FCS。不要仅仅因为帧没有显示“格式错误的帧”错误,就认为它没有FCS;“格式错误的帧”错误是由于Wireshark认为FCS是帧数据,并试图剖析大于FCS的4字节的项。对于数据帧,802.11剖析器不会剖析有效负载,如果有效负载有自己的长度字段(如IPv4和IPv6帧所做的),则将使用该长度,并且在有效负载之后,FCS将被视为额外的数据,不会导致“格式错误的帧”错误。
您应该尝试检查uReceiveFlags
是否设置了DOT11_RECV_FLAG_RAW_PACKET
,如果设置了,则假设框架具有FCS,否则假设它没有。
请记住,在监视模式下,可能仍会向主机提供无法完全接收的帧,因此,监视模式下的某些“格式错误的帧”错误可能是由于(例如)无线电截短的帧造成的,因此不要假设“格式错误的帧”错误意味着帧不应该设置“FCS a t end”标志。
关于c - 如何确定NDIS 6筛选器驱动程序中802.11原始数据包是否具有FCS(4字节)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36566978/