WIFI et langage C

daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   -  
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

je souhaiterai créer un programme en c que me permet de détecter la liste des differents reseaux WIFI disponible.

si quelqu'un pouvais m'aider à me lancer car je ne sais pas comment cela fonctionne

NB: pas besoin de me dire va voir l'api de tel ou tel truc ou fais un man recvfrom, je veux juste avoir un aperçu du mécanisme de détection de reseauw wifi, comment choper les SSID des reseaux de proximité avec les fonctions nécessaires

je vous remercie

je suis sous linux Ubuntu, pour le dev : langage c

merci

14 réponses

daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
bon comme prévu je reviens avec quelquechose, ouais je sais c'est à utiliser sous windows mais bon, je pense qu'il faut regarder sous linux et sous windows:

les include :

#include <Windows.h>
#include <Winbase.h>

#include <string>
#include <iostream>
#include "Wlanapi.h"

le code permettant de scanner les reseau wifi :


DWORD out1;

	HANDLE out2;

	char c;

	cout << "voulez-vous lancer le scan ? pour \"oui\" tapez la lettre 'o' pour \"non\" tapez la lettre 'n':  ";

	cin >> c;

	if (c != 'o') return null;

	DWORD d1 = WlanOpenHandle(1,null,&out1,&out2);

	//cout << "WlanOpenHandle ";

	switch(d1){
	
		case ERROR_INVALID_PARAMETER :cout <<" error: parameter" << endl;break;

		case ERROR_NOT_ENOUGH_MEMORY :cout <<" error: memory allocation" << endl;break;

		case ERROR_REMOTE_SESSION_LIMIT_EXCEEDED:cout <<" error: too much handle" << endl;break;

		case ERROR_SUCCESS:/*cout << "WlanOpenHandle no problem" << endl<< endl;*/break;

		default: cout << "default" << endl;break;
	}

	PWLAN_INTERFACE_INFO_LIST ppInterfaceList;

	DWORD d2 = WlanEnumInterfaces(out2,NULL,&ppInterfaceList);

	//cout << "WlanEnumInterfaces ";

	switch(d2){
	
		case ERROR_SUCCESS : /*cout << " no problem" << endl<< endl;*/break;

		case ERROR_INVALID_PARAMETER : cout <<"error : parameter" << endl;break;
	
		case ERROR_INVALID_HANDLE : cout <<"error : handle" << endl;break;
	
		case ERROR_NOT_ENOUGH_MEMORY : cout <<"error : memory" << endl; break;

		default: cout <<"default" << endl;break;
	}

	GUID g;

	if (ppInterfaceList->dwNumberOfItems > 0){
	
		//cout << "Guid : " << ppInterfaceList->InterfaceInfo[ppInterfaceList->dwIndex].InterfaceGuid.Data1 << "  " << ppInterfaceList->InterfaceInfo[ppInterfaceList->dwIndex].InterfaceGuid.Data2 << "  " << ppInterfaceList->InterfaceInfo[ppInterfaceList->dwIndex].InterfaceGuid.Data3 << "  " << ppInterfaceList->InterfaceInfo[ppInterfaceList->dwIndex].InterfaceGuid.Data4 << endl;
	
		cout << endl;
		cout <<" =========================================="<<endl;
		cout <<"|  description  |          state           |" << endl;
		cout <<" =========================================="<<endl;

		
		cout << "|    " <<ppInterfaceList->InterfaceInfo[ppInterfaceList->dwIndex].strInterfaceDescription << "   ";

		switch(ppInterfaceList->InterfaceInfo[ppInterfaceList->dwIndex].isState){
		
			case 0: cout << "|        not ready         |";break;

			case 1: cout << "|        connected         |";break;

			case 2: cout << "|  ad-hoc network formed   |";break;

			case 3: cout << "|      disconnecting       |";break;

			case 4: cout << "|      disconnected        |";break;
			
			case 5: cout << "|       associating        |";break;

			case 6: cout << "|       discovering        |";break;

			case 7: cout << "|      authenticating      |";break;
		
			default: cout << "|        default           |";break;
		}

		g = ppInterfaceList->InterfaceInfo[ppInterfaceList->dwIndex].InterfaceGuid;
	}
	cout <<endl<<" =========================================="<<endl;

	cout <<endl<<endl;
	cout <<endl<< " ========================================================================================================"<<endl;
	cout <<       "|       Name       |    Quality    |    Type of key   |        Encoding         |          Ssid          " << endl;//ajouter @ Mac
	cout <<       " ========================================================================================================"<<endl;
	PWLAN_AVAILABLE_NETWORK_LIST p = NULL;

	DWORD d = WlanGetAvailableNetworkList(out2,(const GUID *)&g ,WLAN_AVAILABLE_NETWORK_INCLUDE_ALL_ADHOC_PROFILES,NULL,&p);

	//cout << endl << "WlangetAvailableNetworkList ";

	switch(d){
	
		case ERROR_SUCCESS : /*cout << " no problem " << endl<< endl;*/break;

		case ERROR_INVALID_PARAMETER : cout << " error: parameter " << endl;break;
		
		case ERROR_INVALID_HANDLE : cout << " error :handle " << endl;break;

		case ERROR_NDIS_DOT11_POWER_STATE_INVALID : cout << " error :wifi turned off() " << endl;break;

		case ERROR_NOT_ENOUGH_MEMORY : cout << " error :memory allocation" << endl;break;

		default:cout << "default" << endl;break;
	}
	
	int nb_res = p->dwNumberOfItems;

	for (int i = 0; i < nb_res ; i++){
	
		cout <<"|     "<< p->Network[i].strProfileName   << "     ";

		cout <<"|      ";printf("%3d %s",p->Network[i].wlanSignalQuality," %   ");
	
		//cout <<"|    " << p->Network[0].uNumberOfBssids << "    ";

		int crypt = p->Network[i].dot11DefaultAuthAlgorithm;

		

		switch(crypt){
	
			case 1: cout <<"|    80211 open    ";break;

			case 2: cout <<"| 80211 shared key ";break;

			case 3: cout <<"|        wpa       ";break;

			case 4: cout <<"|      wpa psk     ";break;

			case 5: cout <<"|   not supported  ";break;

			case 6: cout <<"|       wpa2       ";break;

			case 7: cout <<"|     wpa2 psk     ";break;

			default: cout <<"|     default     ";break;
	
		}



		switch(p->Network[i].dot11DefaultCipherAlgorithm){
	
			case 0x00: cout << "|           none          ";break;

			case 0x01: cout << "|        wep 40 bit       ";break;

			case 0x02: cout << "|           tkip          ";break;

			case 0x04: cout << "|         aes-ccmp        ";break;

			case 0x05: cout << "|       wep 104 bit       ";break;

			case 0x100: cout <<"| wpa group or rsn group  ";break;

			case 0x101: cout <<"|           wep           ";break;

			default: cout <<   "|         default         ";break;
	
		}

		cout <<"|     " << p->Network[i].dot11Ssid.ucSSID<< "     ";

		cout <<endl<<" ========================================================================================================"<<endl;
	}

cout << "appuyer sur une touche + Entrée" << endl;
cin >>c;
	WlanFreeMemory(p);
	WlanCloseHandle(out2,NULL);




bon il y a des szwitch dans tout les sens mais c'est pour le debuggage alors utilisez les en enlevant ce que j'ai mis en commentaire (bien entendu ça va pourrir l'affichage que j'ai fais mais bon), si pas de bug alors laissez en commentaire, je l'ai fait sous visual studio 2008 pro, c'est un projet application console win32.

si vous avez des question n'hesitez pas ou allez consulter la msdn ou bien dans google tapez "c++ et Wlanapi" c'est un de mes post que vous devriez voir apparaitre en premier et aussi "scanner points d'accès wifi - c/c++" qui est aussi un de mes posts, maintenant je vais regarder la wincap et m'acheter un clé usb Wifi gérant l'injection de paquets (enfin quand j'aurais de l'argent) et ensuite je ragarde sous linux (peut etre plus facile ? ...).

voila bon courage a vous, si vous avez des info balancez ici, on est preneur

bon week-end, tchû
2
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Ah oui il y a des fonctions carrément dans l'api windows pour faire ça.... Je savais pas.
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44 > kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention  
 
ouais et tu peux aussi te deconnecter ou tre connecter a un réseau si tu as les infos utiles (sous forme de profile avec wlanapi) bon bien entendu il te faut le reste pour lire les trames qui te passe sous le nez ... '-)

bon week man

tchû
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Salut,

Tu as sans doute la commande iwlist.
Si tu lances iwlist scanning sous linux tu as la liste des réseaux wifi à portée.

Cette commande utilise la iwlib, une librairie pour gérer les interfaces wifi.
C'est une librairie incluse dans wireless-tools.

Pour l'utiliser tape
sudo apt-get install libiw-dev

Puis regarde ensuite ton fichier /usr/include/iwlib.h pour voir l'étendue des fonctions qui s'offrent à toi.
Tu trouveras des exemples d'utilisation dans le code source des petits programmes de wireless-tools.

PS: Ca se dit "incluse" ?
1
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
salut les gens c'est toujours moi,

bon j'ai testé le scan_wifi du site un peu plus haut, néanmoins il me manque des bibliotheques du genre net80211/* (#include <net80211/ieee80211.h>,#include <net80211/ieee80211_ioctl.h>, ...)que je n'arrive pas à trouver ou du moins qu'est-ce que je dois installer pour choper cette biblio ? je suis sous Ubuntu (la derniere version).

je vous remercie par avance
1
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
salut kilian,

est-ce que tu pourrais encore m'aider ?
en fait j'aimerai faire quasi la meme chose que ce que tu m'as filé mais sans .h d'autre personne (bien sur tout les .h à inclure ont forcément été fait par des personnes ...) et donc programmé bas niveau, avec manipulation de socket et toute les structures qu'il faut pour le wifi. Si tu ne vois pas comment faire sans wireless-tools alors je te remercie de t'être creuser les meninges.

merci encore

PS : oui on peut dire incluse qui est le perticipe passé du verbe inclure mais au féminin.
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Eh non je ne sais pas comment ca se passe à plus bas niveau. Faudrait justement regarder comment se débrouille cette lib.
Mais ça m'interesse aussi, si tu trouves, n'hésite pas en parler ici :-)

PS: ouf merci pour "incluse"
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
ok je te tiens au courant si je trouve plus d'info sur le codage bas niveau pour le wifi.

bon week.
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
bon j'ai trouvé un site traitant en bas niveau le wifi, je n'ai pas regardé en profondeur mais il me semble qu'il est assez complet, peut-etre pas assez sur les commentaire mais bon, voila :

http://www.unixgarden.com

je continu mes recherches
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Merci!!
0
dddv
 
Tien j'en suis au meme niveau , bonjour d'abord . Moi je suis sur mac donc je sais pas trop si je vais faire avancer les choses mais c'est en rapport avec les adaptateurs reseaux IEEE 802.11n par exemple ... a part cet intervention sans concistance tu peu ajouter une personne qui cherche en plus . Mais avec le langage c peu importe l'os sur lequel tu te trouve faut trouver cette librairie . J'ai pecho un bouquin sur la programation systeme en c sous linux on sait jamais .
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
ok j'attends des nouvelles alors, la je regarde sous windows avec Wlanapi.h mais je galère sévère, enfin ce qui est sur c'est que dès que je parvient à quelquechose --> je le mets sur ce post

allé bonne soirée
0
dddv
 
ba pour moi c'est resolu c'est apple80211_var.h mais ca resou pas ton probleme assaye de telecharger un autre complateur ou une biblioteque de librairie ca devrait se trouver . Parceque les pages de code des apli systeme c'est ludique mais si ta pas la librairie du protocole 802.11 ... ah moin de baisser encore d'un niveau et faire ton 80211.h tout seul ... si tu trouve un tutoriel la dessu previen moi .
Bonne soirée
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
Pardon, j'avais zappé la discussion, mais ça tombe bien je suis justement en train de bosser sur le WIFI mais au niveau noyau.

bon j'ai testé le scan_wifi du site un peu plus haut, néanmoins il me manque des bibliotheques du genre net80211/* (#include <net80211/ieee80211.h>,#include <net80211/ieee80211_ioctl.h>

Ce sont des fichiers d'en-tête qui sont utilisés par le noyau Linux. Mais j'imagine que comme tu utilises un outil (la iwlib) qui interroge directement un driver wifi, celui-ci te renverra des données conformes aux structures du noyau.

Par contre ce sont des fichiers d'en-têtes qui se retrouvent plutôt à partir du noyau 2.6.15 je crois.
Hem...motivé pour compiler un noyau?
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
je ne touche plus au noyau car la semaine derniere j'en ai fait planté un, resultat : plus de carte ethernet et wifi d'installé.

sinon tu dis qu'on peut utilisé iwlib c'est ça ?

je regarde de ce coté la, sinon pour iee808/... c'est avec l'OS netBSD un truc de ce genre donc pas avec le linux que tout le monde connait

allé tchu
0
kilian Messages postés 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
T'as raison en plus c'est pour netbsd.
0
daronmaster Messages postés 326 Date d'inscription   Statut Membre Dernière intervention   44
 
bon j'ai un peu avancé, (grace à un gars de chez microsoft), pour l'instant je code pour choper les ssid des alentours, dès que j'ai quelquechose de convenable, je vous le fais savoir

tchû
0