Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Drewermerc en 23 Abril 2014, 05:13 am



Título: sockets en windows verificar puerto.
Publicado por: Drewermerc en 23 Abril 2014, 05:13 am
hola a todos.
bueno es que trato de hacer un programa que verifique si el ciertos puertos estan abiertos o no pero a la hora de ejecutar e programa me dice que todos los puertos estan habierto esperoque me puedan ayudar.

Código
  1.  
  2. #include <winsock2.h>
  3. #include <windows.h>    
  4. #include <iostream>
  5. #include <sys/types.h>
  6.  
  7. #pragma comment(lib, "Ws2_32.lib")
  8. using namespace std;
  9.  
  10. char IP[20];
  11. int startPort, endPort, err, nret;
  12.  
  13.  
  14.  
  15. int main()
  16. {
  17.        int i;
  18. struct sockaddr_in conect;
  19. SOCKET iSocket;
  20.    WSADATA wsaData;
  21.     if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0 )
  22.   {
  23.      cout << "Winsock Error, Exiting..." << endl;
  24.      cin.get();
  25.      return 0;
  26.   }
  27.  
  28.   cout << "Target IP: ";
  29.   cin>>IP;
  30.   cout << "Starting Port: ";
  31.   cin>>startPort;
  32.   cout << "End Port: ";
  33.   cin>>endPort;
  34.  
  35.   cin.ignore();
  36.  
  37.   cout << endl << endl << "Scanning..." << endl << endl;
  38.  
  39.   for( i=startPort; i <= endPort; i++)
  40.   {
  41.  
  42.      iSocket = socket(AF_INET, SOCK_STREAM, 0);
  43.      if (iSocket == -1)
  44.       cout<<"error al abrir el socket";
  45.  conect.sin_addr.S_un.S_addr = inet_addr(IP);
  46.      conect.sin_family = AF_INET;
  47.      conect.sin_port = htons(startPort);
  48.  
  49.  nret = bind(iSocket, (struct sockaddr *)&conect, sizeof(conect));
  50.  
  51.      if( nret == 0)
  52.      {
  53.         cout << "Port " << i << " - OPEN! " << endl;
  54.      }
  55.      else
  56.      {
  57.      cout <<"puerto no abir}erto";
  58.      getchar();
  59.      }
  60.      closesocket(iSocket);
  61.    }
  62.    cout << endl << "Finished With Scan..." << endl;
  63.  
  64.    cin.get();
  65.    WSACleanup();
  66. }
  67.  
  68.  


Título: Re: sockets en windows verificar puerto.
Publicado por: x64core en 23 Abril 2014, 06:47 am
Buenas, varios errores tanto en la estructura del programa como falta de conocimiento de sockets en Windows...
Se usa la funcion connect para intentar establecer la conexion, ya existen macros predefinidas para validar los resultados de las funciones
asi se hace un código más descriptivo:
Código:
      conect.sin_family = AF_INET;
     conect.sin_port = htons(startPort);
 
 nret = bind(iSocket, (struct sockaddr *)&conect, sizeof(conect));

Código:
      if( nret == 0)

-

conect.sin_port = htons(startPort)


podes usar getaddrinfo para obtener la información luego socket,connect,etc. Además seria bueno comprar un libro acerca sockets en Windows.


Título: Re: sockets en windows verificar puerto.
Publicado por: Drewermerc en 23 Abril 2014, 06:59 am
hola x64core
bueno mira mira tambien ya lo intente con bind pero no sigue en lo mismo y como el utimo memodo que use fue connect por eso lo publique con connect.
bueno pues si no tengo mucho conocimientos de sockets y pues yo me apoco de lo que encuentro en internet aunq ue no hay mucha informacion en esapañol en lo poco que entiendo de ingles tambien en eso me apollo y pue sno conozco ningun libro sobre sockest en windows.


Título: Re: sockets en windows verificar puerto.
Publicado por: x64core en 23 Abril 2014, 07:19 am
hola x64core
bueno mira mira tambien ya lo intente con bind pero no sigue en lo mismo y como el utimo memodo que use fue connect por eso lo publique con connect.
bueno pues si no tengo mucho conocimientos de sockets y pues yo me apoco de lo que encuentro en internet aunq ue no hay mucha informacion en esapañol en lo poco que entiendo de ingles tambien en eso me apollo y pue sno conozco ningun libro sobre sockest en windows.
El código que publicaste veo que usas bind no connect. Te digo que usa connect no bind.
Sólo arreglé el problema mayor y deberia ser usado sólo para pruebas pero lo mejor será leer:

Código:
int main()
{
int i = 0;
char hostname[] = "localhost";
struct sockaddr_in conect;
SOCKET iSocket;
SOCKADDR_IN Info;
   WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0 )
  {
     cout << "Winsock Error, Exiting..." << endl;
     cin.get();
     return 0;
  }
 
  cout << "Target IP: ";
  cin>>IP;
  cout << "Starting Port: ";
  cin>>startPort;
  cout << "End Port: ";
  cin>>endPort;
 
  cin.ignore();
 
  cout << endl << endl << "Scanning..." << endl << endl;
 
  for(int i=startPort; i <= endPort; i++)
  {
 
        iSocket = socket(AF_INET, SOCK_STREAM, 0);

        if (iSocket == -1)
            cout<<"error al abrir el socket";

        conect.sin_addr.S_un.S_addr = inet_addr(IP);
        conect.sin_family = AF_INET;
        conect.sin_port = htons(i);
 
     nret = connect(iSocket, (struct sockaddr *)&conect, sizeof(conect));
 
     if( nret == SOCKET_ERROR)
     {
         cout <<"puerto no abierto " << i << endl;;
     }
     else
     {
        cout << "Port " << i << " - OPEN! " << endl;
     }
     closesocket(iSocket);
   }
   cout << endl << "Finished With Scan..." << endl;
 
   cin.get();
   WSACleanup();
}

El Ingles es insispensable en la programación. En mi experiencia te recomiendo comprar esto dos :
http://www.amazon.com/Network-Programming-Microsoft-Windows-Edition/dp/0735615799
http://www.amazon.com/TCP-Sockets-Second-Edition-Programmers/dp/0123745403
Entorno Windows y en conocimiento en general




Título: Re: sockets en windows verificar puerto.
Publicado por: Drewermerc en 23 Abril 2014, 07:43 am
hola x64core.
bueno gracias y perdon es que ya estoy un poco cansado y con sueño y creo que entendi mal , entonces creo que me pondre a leer mas y checare los libros que me recomendaste.