Les Forums

Les Forums

Les forums sont fermés. Ils restent présent pour consultation et archivage.
Vous pouvez désormais poser vos questions directement dans les commentaires en bas de chaque page du site.
Alors n'hésitez pas à participer

scanner ips choix du range du port du et scan aleat possible

Salut @ tous!!!

Je me suis pas présenté car je n'ai pas vu de section à ce sujet.
Donc je fais ça vite fait bien fait ds mon post à soucis.

Je viens de code mon premier prog, y a un mois je connaissais neeb ds ce domaine.
Depuis j'ai mangé pas mal de pages de code ds google. J'espère d'ailleur ne pas m'étouffer avec lol.

Voilà la source que j'ai utilisé pour démarrer:
[url]http://www.cppfrance.com/code.aspx?ID=28177[/url]
Bon maintenant ça n'a plus grand chose à voir vu toutes les modifs que j'y ai faites, mais il me fallait une base vu que je comprenais rien.
Je vous rassure maintenant je comprend un peu plus et je remarque aussi les maladresses que j'ai encore: je mélange un peu le C et le C++, et j'ai du mal avec le choix de mes librairies ( je suis sur que j'en inclus qui me sont inutiles), je comprends tjs pas les options de compilations ( du coup si je change de compilateur je sais plus créer mon exe).

Allez, j'arrête mon barratin et j'expose mon truc:

ce scanner doit faire:
scanner un port dans une rangée d'ip
choix du nombre de thread
mode aléatoire ou semi-aléatoire
- génération aléatoire d'ip pour scanner un port
- généré une ip semi-aléatoir: ip=a.b.c.d
valeur de "a" prédéfini avec plusieurs valeurs possible choisies aléatoirement ds un txt. Ce qui permet de ne générer des ips que ds les rangées qui m'interesses.
"b" "c" et "d" valeurs aléatoires entre 0 et 255.
- enregistrement des résultats ds un fichier

Enfin, j'en arrive à mes problèmes.
Le scanner fonctionne mais je veux l'optimiser, et là mon manque d'expérience me fait défaut!

Par ex:
Une fois le scan fini, je fais un netstat -n histoire de vérifier que toutes les connexions sont bien fermées!
Et là malheur, je vois:
TIME_WAIT
Certains sockets n'ont pas du se fermer et sont en attente.

J'imagine aussi que se connecter à un port pour voir s'il y a un server d'actif n'est pas la meilleur des solutions. Car qd j'ai plusieurs connexion qui réussissent, je vois l'activité de mon cpu gonfler. Certes ça redescend vite mais ça me plait pas.

Voilà, je pose le code, ne prenez pas peur, c'est mon premier, et merci d'avance pour toutes les infos que vous m'apporterez, enfin si vous êtes motivés!
😀

Dernière précision, j'utilise devc++ avec comme option de projet:
-lwsock32
-lwinmm
lib/libmswsock.a



#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "ws2_32.lib")
#include <time.h>
#include "stdafx.h"
#include "String.h"

struct config
{
SOCKET sock;
SOCKADDR_IN sin;
int ip;
int port;
HANDLE hthread;
FILE * fic;
};

int nthread=1;

DWORD WINAPI connection( LPVOID Param )
{
//FILE * fic;
//freopen ("resultats.dat","a",stdout);
//char retour[] = "\n";
struct config * conf = (struct config *)Param;
WSADATA WSAData;
WSAStartup(MAKEWORD(2,0), &WSAData);
conf->sin.sin_addr.s_addr = ntohl(conf->ip);
conf->sin.sin_family = AF_INET;
conf->sin.sin_port = ntohs(conf->port);
conf->sock = socket(AF_INET,SOCK_STREAM,0);
for (;!connect(conf->sock, (SOCKADDR *)&conf->sin, sizeof(conf->sin));)
{
closesocket(conf->sock);
shutdown(conf->sock,2);
/* Ecrire chaîne dans le fichier */
freopen ("resultats.dat","a",stdout);
printf("%s\n",inet_ntoa(conf->sin.sin_addr));
fclose (stdout);
//closesocket(conf->sock);
//shutdown(conf->sock,2);
//WSACleanup();
//closesocket(conf->sock);
//CloseHandle(conf->hthread);
}
//fclose (stdout);
nthread++;
shutdown(conf->sock,2);
closesocket(conf->sock);
WSACleanup();
//CloseHandle(conf->hthread);
free(conf);
}

int main(int argc, char *argv[])
{
int startip;
int endip;
int port;
int aleatip;
struct config * conf = NULL;
if ( argc == 4 )
{
startip = htonl(inet_addr(argv[1]));
endip = htonl(inet_addr(argv[2]));
port = atoi(argv[3]);
nthread = 100;
{
FILE * fic;
char retour[] = "\n";
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
char commande[] = "scan.exe ";
char espace[] = " ";
/* Ecrire chaîne dans le fichier */
fwrite(commande, strlen(commande), 1, fic);
fwrite(argv[1], strlen(argv[1]), 1, fic);
fwrite(espace, strlen(espace), 1, fic);
fwrite(argv[2], strlen(argv[2]), 1, fic);
fwrite(espace, strlen(espace), 1, fic);
fwrite(argv[3], strlen(argv[3]), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
}
for (;startip <= endip;)
{
nthread = 100;
for (;nthread>0;nthread--)
{
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = startip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);
if ( startip <= endip ) startip++;
}
_sleep(2000);
CloseHandle(conf->hthread);
}
FILE * fic;
char retour[] = "\n";
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
char finscan[] = "scan terminé\n";
fwrite(finscan, strlen(finscan), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
return 0;
}
else if ( argc == 5)
{
startip = htonl(inet_addr(argv[1]));
endip = htonl(inet_addr(argv[2]));
port = atoi(argv[3]);
nthread = atoi(argv[4]);
{
char retour[] = "\n";
char commande[] = "scan.exe ";
char espace[] = " ";
FILE * fic;
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
/* Ecrire chaîne dans le fichier */
fwrite(commande, strlen(commande), 1, fic);
fwrite(argv[1], strlen(argv[1]), 1, fic);
fwrite(espace, strlen(espace), 1, fic);
fwrite(argv[2], strlen(argv[2]), 1, fic);
fwrite(espace, strlen(espace), 1, fic);
fwrite(argv[3], strlen(argv[3]), 1, fic);
fwrite(espace, strlen(espace), 1, fic);
fwrite(argv[4], strlen(argv[4]), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
}
for (;startip <= endip;)
{
nthread = atoi(argv[4]);
for (;nthread>0;nthread--)
{
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = startip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, NULL);
if ( startip <= endip ) startip++;
}
_sleep(2000);
CloseHandle(conf->hthread);
}
FILE * fic;
char retour[] = "\n";
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
char finscan[] = "scan terminé\n";
/* Ecrire chaîne dans le fichier */
fwrite(finscan, strlen(finscan), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
return 0;
}
else if ( argc == 3)
{
srand ((unsigned)time (0));
//int a,b,c,d,i=1000;
int a;
int b;
int c;
int d;
char str[20];
port = atoi(argv[1]);
nthread = atoi(argv[2]);
startip = 1;
endip = 1000;
{
char retour[] = "\n";
char commande[] = "scan.exe random ";
char espace[] = " ";
FILE * fic;
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
/* Ecrire chaîne dans le fichier */
fwrite(commande, strlen(commande), 1, fic);
fwrite(argv[1], strlen(argv[1]), 1, fic);
fwrite(espace, strlen(espace), 1, fic);
fwrite(argv[2], strlen(argv[2]), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
}
for (;endip = endip;)
{
nthread = atoi(argv[4]);
for (;nthread>0;nthread--)
{
a=rand()%256;
b=rand()%256;
c=rand()%256;
d=rand()%256;
sprintf(str,"%d.%d.%d.%d",a,b,c,d);
aleatip=htonl(inet_addr(str));
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = aleatip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, 0);
startip++;
}
_sleep(2000);
CloseHandle(conf->hthread);
}
FILE * fic;
char retour[] = "\n";
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
char finscan[] = "scan terminé\n";
/* Ecrire chaîne dans le fichier */
fwrite(finscan, strlen(finscan), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
return 0;
}
else if ( argc == 6)
{
port = atoi(argv[1]);
startip = atoi(argv[2]);
int str[300];
char str1[20];
int i=0;
int a;
int b;
int c;
int d;
nthread = startip;
endip = 1000;
srand ((unsigned)time (0));
FILE * pFile;
pFile = fopen ("range.txt","rb");
rewind (pFile);
while (!feof(pFile))
{
fscanf (pFile, "%d", &str[i]);
i++;
}
fclose (pFile);
char retour[] = "\n";
char commande[] = "scan.exe random dans range.txt ";
char espace[] = " ";
FILE * fic;
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
/* Ecrire chaîne dans le fichier */
fwrite(commande, strlen(commande), 1, fic);
fwrite(argv[1], strlen(argv[1]), 1, fic);
fwrite(espace, strlen(espace), 1, fic);
fwrite(argv[2], strlen(argv[2]), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
for (;;)
{
for (;nthread>0;nthread--)
{
a=str[rand()%i];
b=rand()%256;
c=rand()%256;
d=rand()%256;
sprintf(str1,"%d.%d.%d.%d",a,b,c,d);
aleatip=htonl(inet_addr(str1));
conf = (struct config *) malloc(sizeof(struct config) );
conf->ip = aleatip;
conf->port = port;
conf->hthread = CreateThread(NULL, 0, &connection, conf, 0, 0);
//startip++;
}
_sleep(2000);
closesocket(conf->sock);
shutdown(conf->sock,2);
CloseHandle(conf->hthread);
nthread = startip;
}
/* Ouverture d'un fichier */
fic = fopen("resultats.dat", "a+");
char finscan[] = "scan terminé\n";
/* Ecrire chaîne dans le fichier */
fwrite(finscan, strlen(finscan), 1, fic);
fwrite(retour, strlen(retour), 1, fic);
fclose(fic);
return 0;
}
else
{
printf("Usage : scan.exe ip_start ip_end port\n");
printf("alternatif : scan.exe ip_start ip_end port nbthreads\n");
printf("ou encore pour du random: scan.exe port nbthreads\n");
printf("ou encore pour du random trié: scan.exe port nbthreads random dans range.txt\n");
return 0;

}
}
Lu fredo,

En fait, si tu utilises des socket TCP, tu demande à l'OS de gérer pour toi la session et donc, en cas de non réponse, ta socket reste en attente. C'est donc normal, si tu voulais le contourner, il te faudrait passer en socket Raw et gérer toi même la session. Ainsi, en cas de non réponse tu ferait ce que tu veux.

Pour le Proc, j'en sais rien, une idée au passage : ne lances tu pas trop de requêtes simultannées ?


@+
_SebF - Sébastien FONTAINE