ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» º Creation d'un portscanner avec Delphi 5 º ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ Creation d'un portscanner avec Delphi 5 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ On va expliquer en 2 mots le fonctionnement et l'utilite d'un portscanner. Le scan de port peut etre utile pour voir si telle ou telle IP a un port ouvert, un port ouvert est une porte d'entree potentielle, par exemple une IP ayant le port 31337 ouvert est certainement infecte par BackOrifice..., de la meme facon le scan d'IP peut etre utilise pour decouvrir certaines failles: port 21 ouvert => Serveur FTP => Faille eventuelle, 79 => Finger etc, etc... Le fonctionnement est tres simple, pour un portscanner non "evolue" comme le notre on va tenter de se connecter a tous les ports de la victime un par un si l' on arrive à se connecter alors le port est ouvert, autrement il est ferme. Bon, tout d'abord il nous faut creer un socket client, c'est lui qui va se connecter à l'ip distante pour nous dire si tel ou tel port est ouvert, allez donc dans l'onglet Internet et Selectionnez ClientSocket et nommez le ps, pour les proprietes: object ps: TClientSocket Active = False ClientType = ctNonBlocking Port = 0 OnConnect = psConnect OnError = psError Left = 224 Top = 128 end Maintenant on cree un controle Edit ou l'on va rentrer l'IP à scanner: object Edit1: TEdit Left = 8 Top = 24 Width = 177 Height = 21 TabOrder = 0 Text = '127.0.0.1' end Et 2 autres l'un proposant de choisir à partir de quel port commencer le scan et l'autre à quel port l'on arrete le scan: object Edit3: TEdit // Port de depart Left = 8 Top = 23 Width = 57 Height = 21 TabOrder = 0 Text = '1' end object Edit4: TEdit // Port final Left = 8 Top = 24 Width = 57 Height = 21 TabOrder = 0 Text = '65535' end Ensuite on cree 2 boutons, un pour commencer le scan et un autre pour l'arreter: object Button1: TButton // Pour commencer Left = 8 Top = 136 Width = 57 Height = 25 Caption = '&Start' TabOrder = 3 OnClick = Button1Click end object Button2: TButton // Pour arreter Left = 76 Top = 136 Width = 57 Height = 25 Caption = '&Stop' Enabled = False TabOrder = 4 OnClick = Button2Click end Pour finir on cree un control ListBox pour afficher les ports ouverts/fermes: object ListBox1: TListBox Left = 8 Top = 16 Width = 137 Height = 129 ItemHeight = 13 TabOrder = 0 end Maintenant on va coder =): Avant toute chose il faut creer une variable integer que l'on va incrementer à chaque passage à un nouveau port: var portno: integer; Ensuite on va creer le code correspondant au bouton start c a dire celui qui va initialiser le socket: begin Edit1.Enabled:=False; // Edit3.Enabled:=False; // Edit4.Enabled:=False; // On desactive les autres controles Button1.Enabled:=False; // Button2.ENabled:=True; // Sauf le bouton stop que l' on active ListBox1.Clear; // On efface l'ancien log portno:=strtoint(edit3.text); // Le nø de port de depart dans portno ps.address:=edit1.text; // Edit1.Text contient l'IP à scanner donc l'address du socket ps.port:=portno; // Le nø du port de depart ps.active:=true; // On lance le socket end; Ensuite on va rajouter du code aux evenements du socket, tout d'abord il faut supprimer les messages d'erreurs lorsque le Socket ne peut pas se connecter. Pour cela dans procedure TVotreForm.psError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); ajoutez: ErrorCode:=0; Maintenant on va gerer les evenements du socket, pour commencer on va programmer ce qu'il faut faire quand le socket se connecte c a dire que Si le socket se connecte alors le port est ouvert alors on affiche le nø du port dans la listbox alors on desactive le socket pour changer le nø du port alors on change le nø du port par celui qui suit (port + 1) alors on reactive le socket pour le connecter au nouveau port Donc dans: procedure TVotreForm.psConnect(Sender: TObject; Socket: TCustomWinSocket); on va mettre: label la_fin; // un label à utiliser plus tard begin // on commence listbox1.items.add('Port: '+inttostr(portno)+ ' is open'); // alors on affiche le nø du port dans la listbox ps.active:=false; // alors on desactive le socket pour changer le nø du port portno:=portno+1; // alors on change le nø du port par celui qui suit (port + 1) if portno > strtoint(edit4.text) then // on verifie que le port actuel n'est pas superieur au port final begin goto la_fin; // Si oui c pas la peine de continuer on va directement à la fin end else ps.address:=edit1.text; // On remet l'IP à scanner en address ps.port:=portno; // On change le nø de port ps.active:=true; // Et c'est reparti pour un tour :) la_fin: // Stop end; ensuite on va programmer ce qu'il faut faire quand le socket ne peut pas se connecter c a dire que: -Si le socket ne se connecte pas alors: - Le port est ferme (ou l'IP n'est plus connectee :) - On affiche le nø du port ferme dans la listbox - On desactive le socket pour changer le nø du port - On change le nø du port par celui qui suit - On reactive le socket et on se connecte au nouveau port Donc dans: procedure TVotreForme.psError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer); mettez: label on_se_casse; //meme usage que tt à l'heure begin errorcode:=0; // on veut pas de message d'erreur ps.active:=false; // on desactive le socket portno:=portno+1; // on incremente le nø du port if portno > strtoint(edit4.text) then goto on_se_casse else // on vire si port actuel > port final // On peut rajouter listbox1.items.add('Port: '+inttostr(portno)+ ' is closed'); mais c'est pas utile :) ps.address:=edit1.text; // on remet l'IP ps.port:=portno; // on change le port ps.active:=true; // on se reconnecte on_se_casse: end; Enfin, on met le code du bouton stop: procedure TForm1.Button2Click(Sender: TObject); begin ps.active:=False; Edit1.enabled:=True; Edit3.Enabled:=True; Edit4.eNabled:=True; Button1.Enabled:=True; Button2.Enabled:=False; end; Ce portscanner est tres lent, et pour cause, il n'utilise qu'un seul socket. Pour accelerer le scan vous pouvez creez plusieurs sockets pour remediez à cela. Le premier partira du port choisi, le deuxieme du port choisi + 1, le troisieme du port choisi + 2, et a chaque fois on ajoute au nø du port le nombre de sockets afin qu'il ne scanne pas 2 fois le meme port Sur ce meme principe on peut coder un scan d'IP en changeant la fonction incrementant le nø du port par une incrementant les chiffres de l'IP. Pareillement on peut coder un scanner de failles/trojans en partant sur une liste de ports contenus dans une ListBox et en incrementant la ligne du port a là place du nø du port, si ces autres sources vous interessent mailez moi à: kahel@pikachu.com.tw pour que je vous les envoie ou explique dans un futur nø de HCCC (je met pas de commentaires dans mes sources ;).