Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

SCANNER DE PORT EN C


Information sur la source

Catégorie :Réseaux & Internet Niveau : Débutant Date de création : 07/09/2004 Date de mise à jour : 07/09/2004 13:50:32 Vu : 5 517

Note :
8,67 / 10 - par 3 personnes
8,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (16)
Ajouter un commentaire et/ou une note

Description

C'est un scanner de port, vous n'avez qu'à modifier l'ip de la machine et la liste des ports à scanner.
Créé avec Dev-C++ aucun problème d'execution.
 

Source

  • #include <stdio.h>
  • #include <winsock2.h>
  • #pragma comment(lib, "ws2_32.lib")
  • int main(int argc, char* argv[])
  • {
  • char *ip = "127.0.0.1";//ip de la machine a scnanner (dans ce cas-ci localhost)
  • float o;
  • o=0;
  • float f;
  • f=0;
  • float x;
  • float port;
  • float port_max;
  • float port_initial;
  • port_initial = 20; //premier port a scanner
  • port_max = 30; //dernier port a scanner
  • x = port_max-port_initial;
  • /* on initialise notre winsock */
  • WSADATA WSAData;
  • WSAStartup(MAKEWORD(2,0), &WSAData);
  • /* fin d'initialisation */
  • /* on construit notre socket */
  • SOCKET sock;
  • SOCKADDR_IN sin;
  • for (port=port_initial ; port <= port_max ; port++)
  • do
  • {
  • sock = socket(AF_INET, SOCK_STREAM, 0);
  • sin.sin_addr.s_addr = inet_addr(ip);
  • sin.sin_family = AF_INET;
  • sin.sin_port = htons(port);
  • if((connect(sock,(struct sockaddr*)&sin,sizeof(struct sockaddr))) == 0)
  • {
  • printf("Port %.f ouvert\n",port);
  • o++;
  • }
  • else
  • {
  • printf("Port %.f Ferme\n",port);
  • f++;
  • }
  • port++;
  • }
  • while(port < port_max);
  • printf("\n\nAnalyse terminee avec succes !\n\n");
  • printf("%.f ports ont ete scannes :)\n", x);
  • printf("%.f port ouvert et %.f port ferme", o, f);
  • printf("\n\n\nAppuyez sur une touche pour quitter");
  • getchar();
  • WSACleanup(); //on libére les ressources allouées
  • closesocket(sock); //on ferme le socket
  • return 0;
  • }//fin int main
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")



int main(int argc, char* argv[])
     {



char *ip = "127.0.0.1";//ip de la machine a scnanner (dans ce cas-ci localhost)
float o;
o=0;
float f;    
f=0;
float x;
float port;
float port_max;
float port_initial;
port_initial = 20; //premier port a scanner
port_max = 30; //dernier port a scanner
x = port_max-port_initial;


/* on initialise notre winsock */
	WSADATA WSAData;
	WSAStartup(MAKEWORD(2,0), &WSAData);
/* fin d'initialisation */

	
/* on construit notre socket */
	SOCKET sock;
	SOCKADDR_IN sin;


for (port=port_initial ; port <= port_max ; port++)

do
{
                 sock = socket(AF_INET, SOCK_STREAM, 0);
                 sin.sin_addr.s_addr = inet_addr(ip);
                 sin.sin_family     = AF_INET;
                 sin.sin_port     = htons(port);
                 if((connect(sock,(struct sockaddr*)&sin,sizeof(struct sockaddr))) == 0)
                         {
                         printf("Port %.f ouvert\n",port);
                         o++;
                         }
                 else
                         {
                         printf("Port %.f Ferme\n",port);
                         f++;
                         }
         port++;
}
while(port < port_max);


printf("\n\nAnalyse terminee avec succes !\n\n");
printf("%.f ports ont ete scannes :)\n", x);
printf("%.f port ouvert et %.f port ferme", o, f);
printf("\n\n\nAppuyez sur une touche pour quitter");
	                  	                  
getchar();

WSACleanup(); //on libére les ressources allouées
closesocket(sock); //on ferme le socket

return 0;
                                              	             
     }//fin int main

Conclusion

Je suis débutant en C donc ne soyez pas trop méchant ;-)
Si vous avez des améliorations à apporter notamment pour la vitesse du scan, faites moi signe ;-)
shown@ifrance.com
 

Historique

07 septembre 2004 02:34:19 :
changement de catégorie
07 septembre 2004 02:34:20 :
changement de catégorie
07 septembre 2004 13:50:32 :
Quelques corrections suggérées par NitRic et aardman. Je vous remercie, ça me fait avancer :-)

Commentaires et avis

signaler à un administrateur
Commentaire de NitRic le 07/09/2004 03:19:18

sizeof(struct sockaddr) != sizeof(struct sockaddr_in)

Je trouve drôle le fait que la petite image te représentant il soit inscrit ANSI C mais que ton code ne le soit pas :)( Ce n'est pas un reproche, rassure toi :) )

Personnellement, je te conseil de valider les valeurs retournées par les appels des fonctions un peu plus.
Il est toujours utile de savoir si la fonction à echouée ou réussi :)

Plutôt que d'utiliser %i et %d à la random, reste avec %d. Okay, ils représentent tous les deux un entier signé mais c'est plus `commode` %d qui est le plus utilisé. Je dis ca simplement pour les personnes ne sachant pas ce que représent %i.

Un `return 0;` à la fin de ton main() serait bien aussi. Certain compilateur pourrait ne pas aimer s'il y en à pas.

Si tu n'a aucun formatage à faire lors de l'affichage de chaine à l'écran, tu peux utiliser puts(). Simple suggestion.



~(.:: NitRic ::.)~


signaler à un administrateur
Commentaire de shown le 07/09/2004 03:22:22

Pas de problème, merci pour les conseils.
Je corrigerai et je mettrai à jour :)

signaler à un administrateur
Commentaire de aardman le 07/09/2004 04:11:00

Salut,
Aucun WSACleanup(),  aucun closesocket(), ...
Pour la boucle principale: un for ou un do-while, il faut choisir, mais pas les deux.

signaler à un administrateur
Commentaire de Krox68 le 10/09/2004 22:37:39

slt, dsl de te dire sa et peut etre ke je me trompe mai sa sen le pompage sur des sources kasi identiques sur le site
si c pa le cas torai du regarder avan de poster com sa torai mi des fonctions ke les otre scan navai pa
jespere me tromper si c le ca c un bon ebu a par kelk petites erreurs
@+

signaler à un administrateur
Commentaire de NitRic le 11/09/2004 00:32:26

faut apprendre à écrire Krox68, c'est vraiment dur à lire ...



~(.:: NitRic ::.)~

signaler à un administrateur
Commentaire de shown le 11/09/2004 01:02:31

Krox68, non j'ai rien pompé alors peut être qu'il existe presque le même à quelque part en tout cas je suis pas au courant. Donne le lien j'irai voir. Mais de toute façon il est clair que le principe doit être semblable, notament la création du socket : il n'y a pas 36 solutions pour creer et initialiser un socket en partant de là il ne reste plus que la technique pour vérifier si un port est ouvert qui peut différer mais encore une fois elle non plus n'a rien d'exceptionnelle.

signaler à un administrateur
Commentaire de zinotron le 11/09/2004 08:05:24

ben moi je dirais juste que la fonction connect() est vachement lente et que je sais que ya des choses a faire pour aller plus vite (bon, faut aller fouiller dans les raw socket et non pas dans les stream sockets, et c'est beaucoup moin facile-pour moi en tout cas :p )

C'est tout

Zinotron

signaler à un administrateur
Commentaire de Krox68 le 11/09/2004 10:48:30

desolé nitric je vais m'appliquer maintenant
en fait c'est pas l'initialisation de la socket mais surtout la boucle va voir dans mes sources pour des scanners plus evolué
en tout cas c'est un bon debut en socket
@+

signaler à un administrateur
Commentaire de Seiken le 24/04/2005 17:28:00

Chez moi ça ne compile pas :

2 sockets2.c
C:\DEV-C_~1\Include\winsock2.h:126: warning: `FD_CLR' redefined
58 c:\dev-c_~1\include\winsock.h
warning: this is the location of the previous definition
141 c:\dev-c_~1\include\winsock2.h
warning: `FD_SET' redefined
.....

Je suis sous Dev-C++ 4, quelqu'un peut m'aider ?

signaler à un administrateur
Commentaire de NitRic le 26/04/2005 01:15:32

premier fichier à inclure =>  winsock2.h <= tout en haut
si tu inclus `windows.h` avant, ca cause ce genre de problème car `windows.h` inclut `winsock.h`(version 1).


/* main.c */
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
/* etc ... */

int main()
{

    /* ... */
    return 0;

}


au fait, winsock2.h inclut windows.h alors une simple inclusion de winsock2.h suffit ...



~(.:: NitRic ::.)~

signaler à un administrateur
Commentaire de NitRic le 26/04/2005 01:33:31

Petite remarque:

WSACleanup();
closesocket(sock);

c'est pas bon ca, tu dois libérer les ressources lorsque tu en à terminé et non avant d'en avoir terminé:

...
closesocket(sock);

WSACleanup();
return 0;


Autre remarque:

tu utilise un `struct sockaddr_in sin;` donc dans ton connect() tu devrais lui envoyer: sizeof(struct sockaddr_in) ou encore: sizeof(sin)

connect() renvoie 0 si aucune erreur sauf que ton socket peu bloquer, être en progression, ... vérifie le code d'erreur. WSAEWOULDBLOCK et WSAEINPROGRESS ne constituent en rien une erreur mais plutôt un avertissement si on veut:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/connect_2.asp

tu pourrais mettre un timeout sur tes opérations ou y aller en raw ...



~(.:: NitRic ::.)~

signaler à un administrateur
Commentaire de YURIX le 12/05/2006 23:51:04

J'ai un problème lorsque j'essaie de compiler le code avec Dev-C++ 4

Le log du compilateur me donne:

Compilateur: Default compiler
Exécution de  g++.exe...
g++.exe "C:\Documents and Settings\YuRi\Bureau\Scanner.cpp" -o "C:\Documents and Settings\YuRi\Bureau\Scanner.exe"   -fno-access-control -fmessage-length=0  -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"C:\Dev-Cpp\include\c++\3.4.2\backward"  -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"C:\Dev-Cpp\include\c++\3.4.2"  -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib" -fmessage-length=0

In function `int main(int, char**)':
warning: passing `float' for converting 1 of `u_short htons(u_short)'

undefined reference to `WSAStartup@8'
undefined reference to `socket@12'

undefined reference to `inet_addr@4'
undefined reference to `htons@4'
undefined reference to `connect@12'
undefined reference to `closesocket@4'
undefined reference to `WSACleanup@0'
collect2: ld returned 1 exit status

Exécution terminée

A chaque fois que j'essaie de faire un fichier cpp avec le code pour les winsocks j'ai cette erreur. Quelqu'un aurait-il une solution a mon problème ?

signaler à un administrateur
Commentaire de excrt le 17/05/2006 19:58:28

//...
char *ip = "127.0.0.1";//ip de la machine a scnanner (dans ce cas-ci localhost)
WORD o = 0; // WORD => unsigned short
WORD f = 0;
WORD x;
WORD port;
WORD port_max = 30;
WORD port_initial = 20;
//port_initial = 20; //premier port a scanner
//port_max = 30; //dernier port a scanner
x = (port_max - port_initial);
//...

pour obtenir un max de portabilité d'un compilateur/lieur(linker) à un autre, éviter les extensions dans le noms des librairies
« #pragma comment(lib, "ws2_32.lib") » devient ceci « #pragma comment(lib, "ws2_32") »
sous Dev-C++/CodeBlocks c'est « libws2_32.a » et sous MSVC c'est « ws2_32.lib », seul le nom(sans extension) de la librairie suffit dans le « #pragma ... »

si par malheur le pragma ne fonctionne pas alors il faut ajouter la librairie dans les options de compilation(pour le lieur/linker)

signaler à un administrateur
Commentaire de enhr le 28/06/2006 13:51:05

j'ai moi aussi des problème de compilation
les messages d'erreurs
undefined reference to `WSAStartup@8'
undefined reference to `socket@12'

undefined reference to `inet_addr@4'
undefined reference to `htons@4'
undefined reference to `connect@12'
undefined reference to `closesocket@4'
undefined reference to `WSACleanup@0'
collect2: ld returned 1 exit status
j'ai vraiment besion d'aide comment configurer mon compilateur?

signaler à un administrateur
Commentaire de wizard512 le 11/11/2006 22:48:30

Bonne source,
simple et utile, trés utile,
et en plus avec dev c++
Merci....

Note : 9/10

signaler à un administrateur
Commentaire de deck_bsd le 18/01/2007 15:13:56

Yop,

sock = socket(AF_INET, SOCK_STREAM, 0);
                 sin.sin_addr.s_addr = inet_addr(ip);
                 sin.sin_family     = AF_INET;

peut être mis hors de la boucle pour optimiser ton code.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,296 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.