Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Win Port-Scanner v0.3 - portscan.cpp

portscan.cpp

Caricato da:
Scarica il programma completo

  1. /*
  2. Simply Win Port-Scanner v0.3
  3. Autore:         __GiReX__
  4. Linguaggio:     C++
  5. Descrizione:    Windows Port-Scanner with timeout parameter
  6.  
  7. Changelog:      Aggiunta la possibilità di risolvere l'host
  8.                 E' quindi possibile passare al programma un DNS per lo scan!
  9.  
  10. Site:           www.girex.altervista.org
  11. */
  12.  
  13. #include <iostream>
  14. #include <winsock.h>
  15. #include <cstdlib>
  16. #include <cstring>
  17. #include <ctime>
  18. using namespace std;
  19.  
  20. bool scan(SOCKET *sock, sockaddr_in *sock_addr, u_int port, u_long *enabled, timeval *time);
  21. int check_host(char *host, sockaddr_in *sock_addr);
  22. int check_port(u_int start, u_int end);
  23. void usage(char *prog);
  24.  
  25. int main(int argc, char *argv[])
  26. {
  27.  u_int start_port, end_port;  
  28.  
  29.  SOCKET sock;  
  30.  WSADATA info;
  31.  SOCKADDR_IN sock_addr;
  32.  
  33.  u_long enabled = 1;
  34.  timeval timeout;
  35.  
  36.  bool noth = true;
  37.  
  38.  if(argc < 4) {
  39.         usage(argv[0]);
  40.         return 1;  
  41.   }
  42.  
  43.     if(argc!=5) {
  44.           timeout.tv_sec = 0;
  45.           timeout.tv_usec = 500000;                             // 500 millisceondi di default
  46.     } else {
  47.           timeout.tv_sec = 0;
  48.           timeout.tv_usec = atoi(argv[4])*1000;                 // Timeout da riga di comando
  49. }
  50.        
  51.   cout << "Simply Win Port-Scanner v0.3 by __GiReX__\n\n"
  52.        << "Opened ports list:\n\n";
  53.    
  54.    start_port = atoi(argv[2]);                                  // Range di porte
  55.    end_port = atoi(argv[3]);                                    // da riga di comando
  56.    
  57.     if(check_port(start_port, end_port)) return 1;              // Controllo se il range di porte è valido
  58.    
  59.    
  60.     WSAStartup(MAKEWORD(2, 2), &info);                          // Inizializzo la procedura per i socket
  61.       sock_addr.sin_family = AF_INET;                           // Struttura sockaddr_in : Protocollo  
  62.        if(check_host(argv[1], &sock_addr)) return 1;            // Controllo se l'input dell'host è regolare
  63.      
  64.      
  65.     for(int i = start_port; i <= end_port; i++)
  66.     {
  67.       cout << "Scanning: " << i << "\r";
  68.         sock = socket(AF_INET, SOCK_STREAM, 0);
  69.            if(scan(&sock, &sock_addr, i, &enabled, &timeout)) { // Se scan ritorna true la porta è aperta
  70.                cout << "Scanning: " << i << "\t opened\n";
  71.                noth = false;
  72.         }
  73.   }
  74.      
  75.       if(noth) cout << "No port seems is open\n";
  76.      
  77.      cout << "Scanning: //\tfinished\n\nElapsed time: " << clock() / CLOCKS_PER_SEC  << " s\n";
  78.    
  79.    closesocket(sock);                                           // Chiudo socket
  80.   WSACleanup();                                                 // Pulisco e termino procedura socket
  81.  return 0;
  82. }
  83.  
  84. bool scan(SOCKET *sock, sockaddr_in *sock_addr, u_int port, u_long *enabled, timeval *timeout)
  85. {
  86.  FD_SET fds;
  87.    
  88.    sock_addr->sin_port = htons(port);                           // Setto la porta
  89.      ioctlsocket(*sock, FIONBIO, enabled);                      // Abilito le socket non-blocking
  90.      
  91.      FD_ZERO(&fds);                                             // Pulisco il set                
  92.      FD_SET(*sock, &fds);                                       // Aggiungo il socket al SET della select
  93.      
  94.      connect(*sock,(struct sockaddr*)sock_addr,sizeof(struct sockaddr)); // Ritorna sempre errore
  95.            
  96.    if(select(*sock, 0, &fds, 0, timeout)>0)  return true;       // Individuo il socket con la select
  97.                                                                 // Se ritorna 1 valore > 0 la porta è aperta
  98.  return false;
  99. }
  100.  
  101. int check_host(char *chost, sockaddr_in *sock_addr)
  102. {
  103.  u_long host;
  104.  LPHOSTENT site;
  105.    
  106.     if(!strstr(chost, "www")) {                                 // Se non trovo www allora viene specificato un IP
  107.          host = inet_addr(chost);                              
  108.          
  109.           if(host == INADDR_NONE) {                             // Se ritorna INADDR_NONE l'IP non è valido
  110.               cout << "Invalid IP format! Unable to resolve the host!\n";
  111.           return 1;
  112.      
  113.       } else
  114.            sock_addr->sin_addr.s_addr = host;                   // Se invece trovo www si tratta di un DNS
  115.            
  116.    }  else {
  117.            site = gethostbyname(chost);                         // Risolvo il DNS..
  118.            
  119.             if(!site)  {
  120.                 cout << "Invalid www address! Unable to resolve the host!\n";
  121.             return 1;
  122.     } else
  123.           sock_addr->sin_addr = *((LPIN_ADDR)*site->h_addr_list); }
  124.          
  125.  return 0;
  126. }
  127.  
  128. int check_port(u_int start, u_int end)
  129. {
  130.    
  131.     if(start > 65535 || start < 0 || end > 65535 || end < 0 || start > end) {
  132.              cout << "Invalid port range! Re-insert it!\n";
  133.              return 1;
  134.      }
  135.   return 0;
  136.  
  137. }      
  138.  
  139. void usage(char *prog)
  140. {
  141.      cout << "\nUsage: " << prog << " <ip/host> <porta_iniziale> <porta_finale> [time-out]\n\n"
  142.              << "Example: scan.exe   www.google.com   1   100\n"
  143.              << "         scan.exe   127.0.0.1        1   500 80\n\n"
  144.              << "[time-out] is optional and must be expressed in milliseconds\n"
  145.              << "default is 500 milliseconds, more is lower more the scan faster!\n";
  146. }