2015-04-08 1 views
0

J'essaye de construire et d'envoyer des trames 802.11 en C. J'ai vu qu'il est possible de le faire avec pcap par exemple. Cependant, dans tous les exemples que j'ai vus, je dois me fixer un numéro de séquence et d'autres champs de contrôle. Je me demande donc s'il y a une API qui permet de gérer toute cette partie de contrôle et où je n'ai qu'à spécifier des adresses?API pour construire des trames 802.11 en C sans gérer les champs de contrôle

Nous vous remercions à l'avance,

+0

De quel O.S.? Quel IDE/toolchain? Quelle plateforme? – LPs

+0

Travailler avec gcc sous Linux – Spider

+0

Des gens d'aide? – Spider

Répondre

0

tout d'abord quel type de paquet que vous essayez de faire? Les trames de données ou trames de balise .....

Si vous créez à partir de zéro, vous devez définir tous les paramètres vous-même, je suis en utilisant ce fichier d'en-tête [ieee80211] http://lxr.free-electrons.com/source/include/linux/ieee80211.h pour les paramètres de configuration 802.11, et têtes radiotap, vous pouvez utiliser [radiotap] http://lxr.free-electrons.com/source/include/net/ieee80211_radiotap.h

je peux vous donner un exemple de code (partie) de créer des cadres balise

// Add the radiotap header 
radiotap->it_version = 0; 
radiotap->it_len = sizeof(*radiotap) + sizeof(dataRate); 
radiotap->it_present = (1 << IEEE80211_RADIOTAP_RATE); 


// Beacon packet flags 
dot80211->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_BEACON; 
dot80211->i_fc[1] = IEEE80211_FC1_DIR_NODS; 
dot80211->i_dur[0] = 0x0; 
dot80211->i_dur[1] = 0x0; 
// Destination = broadcast (no retries) 
memcpy(dot80211->i_addr1, mac_Destination, IEEE80211_ADDR_LEN); 
// Source = our own mac address 
memcpy(dot80211->i_addr2, mac_source, IEEE80211_ADDR_LEN); 
// BSS = our mac address 
memcpy(dot80211->i_addr3, mac_BSSID, IEEE80211_ADDR_LEN); 
// Sequence control: Automatically set by the driver 

beacon -> beacon_timestamp = TimeStamp; 
printf("%"PRIu64,beacon -> beacon_timestamp); 
// interval = 100 "time units" = 102.4 ms 
// Each time unit is equal to 1024 us 
beacon->beacon_interval = BEACON_INTERVAL; 
// capabilities = sent by ESS 
//beacon->beacon_capabilities = x0003; 

Par exemple:

dot80211->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_BEACON; 

Vous pouvez définir le FCS (contrôle de trame) comme ceci, qui est défini dans l'en-tête.

Ma suggestion est de créer vos propres fichiers d'en-tête ou le modifier selon vos besoins ..

Hope this helps ??

+0

Salut Warlock, j'ai vraiment un problème en utilisant ieee80211.h. Il ne peut pas être trouvé sur linux includes, et lorsque vous essayez d'utiliser le fichier que vous avez mentionné seul, beaucoup d'erreurs apparaissent. – Spider

+0

Bonjour, vous voulez dire ieee80211.h je l'ai souligné? peut poster l'erreur? – Warlock

+0

Bonjour Warlock. Je viens de définir __packed qui ne l'était pas. Maintenant, je suis capable d'envoyer des images brutes en utilisant pcap_sendpacket. Mais j'ai un autre problème. J'ai essayé de spécifier le débit de données sur l'en-tête de radiotap, mais le NIC remplace avec toujours 1Mb/s. Est-il possible d'éviter cela? Merci – Spider