Comment déterminer si un paquet brut 802.11 a FCS (4 octets) dans un pilote de filtre NDIS 6?

J’ai un pilote de filtre NDIS 6 fonctionnant sous Windows Vista et les systèmes ultérieurs.

Je l’ai lié sous le NativeWiFi Filter afin de pouvoir voir les 802.11 packets au lieu de fake Ethernet packets .

Et j’ai défini les NDIS_PACKET_TYPE_802_11_RAW_DATA et NDIS_PACKET_TYPE_802_11_RAW_MGMT dans le filtre de paquets en fonction des éléments suivants: https://msdn.microsoft.com/en-us/library/windows/hardware/ff554833(v=vs.85=fr ). les indications de Raw 802.11 Packets du miniport.

Ensuite, j’ai basculé mon adaptateur sans fil en Monitor Mode .

À présent, mon pilote de filtre peut recevoir tous les paquets de 802.11 control and management .

Ma question est de savoir comment déterminer si un paquet brut 802.11 a FCS (séquence de contrôle de trame, 4 octets) dans mon pilote ?

Je demande ceci parce que Radiotap header ( http://radiotap.org/ ) aux paquets et que radiotap a un champ appelé Flags qui spécifie si le paquet 802.11 a un FCS ou non.

Mon expérience avec mon ordinateur portable avec un adaptateur sans fil L’adaptateur réseau sans fil Qualcomm Atheros AR9485WB-EG Wireless Network Adapter montre que les paquets Beacon et Reassociation Response ont FCS et que tous les autres paquets 802.11 n’en ont pas. Et les mauvais Flags dans l’en-tête de la radio-carte obligeront Wireshark à afficher un paquet mal formé pour ces paquets. C’est pourquoi je dois déterminer la disponibilité de FCS dans mon pilote.

Mon code est comme ci-dessous et je veux savoir comment écrire la condition 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); } 

Toutes les méthodes? Merci!

Mon expérience avec mon ordinateur portable avec un adaptateur sans fil L’adaptateur réseau sans fil Qualcomm Atheros AR9485WB-EG montre que les paquets Beacon et Reassociation Response ont FCS et que tous les autres paquets 802.11 n’en ont pas.

Non, ça ne va pas. Quand j’ai regardé la même capture et que j’ai forcé le drapeau “FCS at end”, j’ai constaté qu’un grand nombre de trames autres que ces trames avaient un FCS que Wireshark a déclaré valide. Ne supposez PAS que, simplement parce qu’un cadre n’indiquait pas une erreur “Malformed frame”, il n’avait pas de FCS; les erreurs “Malformed frame” sont dues à Wireshark qui pense que le FCS est une donnée de trame et tente de disséquer les éléments dont la taille est supérieure à 4 octets du FCS. Pour les trames de données, le dissecteur 802.11 ne dissèque pas la charge utile, et si la charge utile a un champ de longueur propre, comme le font les trames IPv4 et IPv6, cette longueur sera utilisée et le FCS sera traité comme des données supplémentaires après la fin du traitement. charge utile et ne pas causer une erreur “Malformed frame”.

Ce que vous devriez essayer est de vérifier si uReceiveFlags a défini DOT11_RECV_FLAG_RAW_PACKET et, si tel est le cas, supposez que la trame a un FCS, sinon supposez que non.

Et rappelez-vous que, en mode moniteur, des trames qui ne peuvent pas être complètement reçues peuvent toujours être fournies à l’hôte. Par conséquent, certaines erreurs “Malformed frame” en mode moniteur peuvent être dues, par exemple, au fait que la trame est coupée par la radio. , alors ne supposez pas qu’une erreur “Malformed frame” signifie que la trame n’aurait pas dû avoir le drapeau “FCS at end” défini.