begin process at 2012 02 09 15:31:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseaux & Internet

 > SCANNER DE PORT EN C

SCANNER DE PORT EN C


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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 :6 519

Auteur : shown

Ecrire un message privé
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 :-)

 Sources du même auteur

BOT POUR L'IRC
CHAT CLIENT/SERVEUR

 Sources de la même categorie

Source avec Zip SERVEUR MULTITHREAD [LINUX/WIN] par nipepsinicolas
Source avec Zip Source avec une capture SECURE REMOTE SHELL [WIN32] par ganjarasta
Source avec Zip Source avec une capture SUIVI DE PRODUCTION ONDULEUR PHOTOVOLTAÏQUE SOLARMAX par brunovan
Source avec Zip MINICHAT MULTI-CLIENT par wisar
SOCKET CPP par baptchr55

Commentaires et avis

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 ::.)~


Commentaire de shown le 07/09/2004 03:22:22

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

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.

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
@+

Commentaire de NitRic le 11/09/2004 00:32:26

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



~(.:: NitRic ::.)~

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.

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

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
@+

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 ?

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 ::.)~

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 ::.)~

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 ?

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)

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?

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

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,980 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales