Ver Mensaje Individual
  #20 (permalink)  
Antiguo 23/04/2014, 05:08
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Código Escaner de puertos en C++

Hola nuevamente amigos!! Ahora si me funcionó perfecta la compilación!!
Faltaban esos parámetros en el compilador!!
Muchisimas gracias Drewermerc, me funcionó tu ayuda!!!
Gracias vangodp por tu ayuda también!!!

Probé este código:

Código C++:
Ver original
  1. ///////////////////////////////////////////////////////
  2. // Simple Portscanner using Winsock in Windows Console
  3. // Free-use-source, nothing really unique about it.
  4. // #hackers on EFnet
  5. ///////////////////////////////////////////////////////
  6. #include <winsock2.h>
  7. #include <iostream>
  8.  
  9. #pragma comment(lib, "Ws2_32.lib")
  10. using namespace std;
  11.  
  12. char IP[20];
  13. int startPort, endPort, err, nret;
  14.  
  15. SOCKET iSocket;
  16. SOCKADDR_IN Info;
  17. WSADATA wsadata;
  18.  
  19. int main()
  20. {
  21.    err = WSAStartup(MAKEWORD(2, 2), &wsadata);
  22.    if(err != 0)
  23.    {
  24.       cout << "Winsock Error, Exiting..." << endl;
  25.       cin.get();
  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(int i=startPort; i < endPort; i++)
  40.    {
  41.       iSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  42.  
  43.       Info.sin_family = AF_INET;
  44.       Info.sin_port = htons(startPort);
  45.       nret = connect(iSocket, NULL, NULL);
  46.       // error is for line above
  47.       if(nret != SOCKET_ERROR)
  48.       {
  49.          cout << "Port " << i << " - OPEN! " << endl;
  50.       }
  51.       //temp++;
  52.       closesocket(iSocket);
  53.     }
  54.     cout << endl << "Finished With Scan..." << endl;
  55.  
  56.     cin.get();
  57. }

Pero no me funcionó, así que lo modifiqué y miré por que fallaba y lo pude solucionar!!!!!!!!!!

Quedó así compañeros (lo dejo para que puedan observar como quedó finalmente y para ayudar a alguien que tiene o ha tenido el mismo problema que yo):

Código C++:
Ver original
  1. ///////////////////////////////////////////////////////
  2. // Simple Portscanner using Winsock in Windows Console
  3. // Free-use-source, nothing really unique about it.
  4. // #hackers on EFnet
  5. ///////////////////////////////////////////////////////
  6. #include <winsock2.h>
  7. #include <iostream>
  8.  
  9. #pragma comment(lib, "Ws2_32.lib")
  10. using namespace std;
  11.  
  12. char IP[20];
  13. int startPort, endPort, err, nret;
  14.  
  15. SOCKET iSocket;
  16. SOCKADDR_IN Info;
  17. WSADATA wsadata;
  18.  
  19. int main()
  20. {
  21.    err = WSAStartup(MAKEWORD(2, 2), &wsadata);
  22.    if(err != 0)
  23.    {
  24.       cout << "Winsock Error, Saliendo..." << endl;
  25.       cin.get();
  26.    }
  27.  
  28.    cout << "Direccion de IP: ";
  29.    cin>>IP;
  30.    cout << "Puerto de inicio: ";
  31.    cin>>startPort;
  32.    cout << "Puerto de final: ";
  33.    cin>>endPort;
  34.  
  35.    cin.ignore();
  36.  
  37.    cout << endl << endl << "Escaneando..." << endl << endl;
  38.    for(int i=startPort; i < endPort; i++) {
  39.  
  40.         iSocket = socket(AF_INET, SOCK_STREAM, 0);
  41.  
  42.         Info.sin_addr.s_addr = inet_addr("127.0.0.1");
  43.         Info.sin_family = AF_INET;
  44.         Info.sin_port = htons(i);
  45.         int conparlen = sizeof(Info);
  46.  
  47.         nret = connect(iSocket, (struct sockaddr*)&Info, conparlen);
  48.        if(nret != SOCKET_ERROR) {
  49.            cout << "Puerto: " << startPort << " - Abierto! " << endl;
  50.         }
  51.         else cout << "Puerto cerrado" << endl;
  52.         closesocket(iSocket);
  53.     }
  54.    cout << endl << "Escaneo finalizado..." << endl;
  55.  
  56.    cin.get();
  57. }


Ahora si me funciona perfecto!!! tenía varios errores ese código, uno es este por ejemplo:

Código C++:
Ver original
  1. Info.sin_port = htons(startPort);

lo dejé así:

Código C++:
Ver original
  1. Info.sin_port = htons(i);

ya que la variable i es la que incrementa!!
Opté por este código porque lo veo más fácil y más corto, pero también probé con el código que me dejaste vangodp y si funciona perfecto.

Me ha funcionado la ayuda de los 2, muchísimas gracias a ambos!!
Es muy bueno poder trabajar así en equipo, es muy bueno ayudarnos entre todos.

Cuando aprenda más, me encantaría poder analizar múltiples IPs y puertos, todos a la vez, esto seguramente se consigue con los famosos Threads.
Quiero hacer un programa, sería un roBOT para mi Red IRC de chat que escanearía puertos en caso de ataques y expulsaría a los clones que vayan entrando al Servidor.
Tengo un programa en C que funciona espectacular, excelente diria, pero me encantaría poder ser capaz de hacer uno yo mismo en C++.
¿Será difícil poder hacer eso?
Otra pregunta amigos, yo al bot lo necesitaría para Linux, pero para hacer las pruebas tiene que ser en Windows ya que Windows es mi S.O. ¿con sólo cambiar el nombre de la librería winsock2 por la que utiliza Linux, será suficiente?

¡Gracias amigos!

PD: ¿ Que significa esto: #pragma comment(lib, "Ws2_32.lib") ?