Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Príncipe_Azul en 26 Abril 2014, 08:09 am



Título: Necesito un código Escaner de Puertos en C++ usando Threads
Publicado por: Príncipe_Azul en 26 Abril 2014, 08:09 am
Hola compañeros!! Un gusto otra vez por aquí

Bueno les comento que estoy con ganas de crear un programa en C++, hasta ahora digamos que voy bien, pero me topo ahora con un inconveniente, que en realidad no les, pero por el momento si.

Lo que yo deseo es crear un Bot Escaner de Puertos en C++ para Redes IRC de chat, yo al bot lo pude hacer solo y hasta cree una función split() para poder separar palabras en una cadena string.


La conexión me sale bien, el bot entra al Servidor, se loguea y recibe la IP del usuario que conecta al chat, el tema viene a la hora de escaner ciertos puertos para determinar si el usuario tiene un X puerto abierto que es prohibido.

Estos tipo de bots son de seguridad y se utilizan para prevenir ataques masivos de clones.


Yo he podido hacer el escaner que analiza por ejemplo 10 puertos para saber si un usuario tiene algún proxy no permitido, estos puertos casi siempre son usados por proxys y utilizan las IPs proxys para entrar "camuflados" o anónimos al servidor.


El escaner escanea puerto por puerto hasta terminar con el último puerto, pero lo que yo necesito es crear una función y hacer llamadas a esa función con el valor de la IP del usuario para saber si tiene un puerto abierto, pero cláro, para poder hacer esto, voy a necesitar el uso de Threads, en Python esto es simple, podría lograrlo con:


Código
  1. threading.Thread(target=Escaner.Analizar()).start()


o utilizar otra clase para lograr esto o usar la clase padre que es threading.


Pero en C++ por lo que leí es mucho más difícil o más difícil, en realidad lo quiero hacer no creo que sea algo difícil, pienso que un poco, porque el programa no tiene más que hacer que escanear puertos de IPs que van conectando al servidor


Esas IPs pueden ser cientas en cuestión de minutos, por eso necesito usar Threads, necesito que se divida por hilos los procesos para poder hacer esto posible.

Osea que por ejemplo en 3 segundos, el bot escanee 5 IPs al mismo tiempo, eso es lo que necesito.


Me encantaría que me dejaran un código de ejemplo para poder hacer esto posible, uso windows, así que utilizo la librería winsock2.


Me imagino que para el que sabe esto debe ser algo fácil o pan comido, yo seguiré intentando poder lograr esto y tratar de entender de alguna manera como hacer un código que utilice los Threads.


Desde ya les agradezco, muchas gracias a todos y que tengan buen día!! :-)


Título: Re: Necesito un código Escaner de Puertos en C++ usando Threads
Publicado por: amchacon en 26 Abril 2014, 10:18 am
Todo depende del estandar de C++ que uses.

Si usas el nuevo estadar C++11. Este tiene una clase para threads bastante sencilla:

Crear un thread
Código
  1. #include <iostream>
  2. #include <thread>
  3.  
  4. using namespace std;
  5.  
  6. void hilo()
  7. {
  8.    cout<<"Creando hilo..."<<endl;
  9. }
  10.  
  11. int main()
  12. {
  13.    thread t(hilo);
  14.  
  15.    t.join();
  16.    return 0;
  17. }

Crear un thread con parametros

Código
  1. #include <iostream>
  2. #include <thread>
  3.  
  4. using namespace std;
  5.  
  6. void hilo(int a,int b)
  7. {
  8.    cout<<"Creando hilo..."<<endl;
  9.    cout<<"Los argumentos son "<<a<<" y "<<b<<endl;
  10. }
  11.  
  12. int main()
  13. {
  14.    thread t(hilo,2,3);
  15.  
  16.    t.join();
  17.    return 0;
  18. }

Crear un thread en un miembro no estatico de una clase:
Código
  1. #include <iostream>
  2. #include <thread>
  3.  
  4. using namespace std;
  5.  
  6. class A
  7. {
  8.    int dato;
  9. public:
  10.    A(int n) {dato = n;}
  11.  
  12.    void hilo()
  13.    {
  14.        cout<<"Creando hilo..."<<endl;
  15.        cout<<"El objeto contiene "<<dato<<endl;
  16.    }
  17. };
  18.  
  19. int main()
  20. {
  21.    A Objeto(1);
  22.  
  23.    thread t(&A::hilo,Objeto);
  24.  
  25.    t.join();
  26.    return 0;
  27. }

Los códigos funcionan perfectamente en mi compilador. Si no funciona en el tuyo es porque o bien, tienes que activar el modo C++11 (en el Mingw es -std=c++11).

O bien, tu versión del compilador no soporta la nueva clase thread (es una clase joven y no todos los compiladores se han actualizado). Te dejo mi compilador por si te interesa (incluye la librería gráfica SFML, por eso ocupa de más):
https://dl.dropboxusercontent.com/u/69551225/x64-4.8.0-release-posix-seh-rev2.rar


Título: Re: Necesito un código Escaner de Puertos en C++ usando Threads
Publicado por: Príncipe_Azul en 26 Abril 2014, 14:44 pm
Hola, muchas gracias por tu ayuda!!  :D
Pero el primer código ni el segundo me funcionan, me dan este error al compilarlo:

C:\Users\Daniel\Desktop\C++\SocketPuertos.cpp||In function 'int main()':|
C:\Users\Daniel\Desktop\C++\SocketPuertos.cpp|12|error: 'thread' was not declared in this scope|
C:\Users\Daniel\Desktop\C++\SocketPuertos.cpp|12|error: expected ';' before 't'|
C:\Users\Daniel\Desktop\C++\SocketPuertos.cpp|13|error: 't' was not declared in this scope|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

¿Como puedo solucionarlo? o que establezco en la variable t?


Título: Re: Necesito un código Escaner de Puertos en C++ usando Threads
Publicado por: amchacon en 26 Abril 2014, 15:50 pm
Primero pruebalo en un proyecto aparte copiando y pegando tu codigo. Si te sigue sin funcionar es por que tu compilador no soporta el estandar C++11 (vuelve a leer mi mensaje, pero hazlo entero ahora ¬¬).

En algún lugar de mi mensaje ¬¬ dejé un link para descargar un compilador con los threads 100% funcionales. Solo es usarlo con el flag -std=c++11

Por cierto la documentación de los threads:
http://en.cppreference.com/w/cpp/thread


Título: Re: Necesito un código Escaner de Puertos en C++ usando Threads
Publicado por: leosansan en 26 Abril 2014, 20:11 pm
En mi Code::Blocks, activando la opción C++11, van perfecto.

¿Qué versión de SFML tienes instalada?

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Necesito un código Escaner de Puertos en C++ usando Threads
Publicado por: amchacon en 26 Abril 2014, 20:52 pm
La ultima, la instalé hace una semana.

Te dejo mi plantilla para proyectos de SFML:
https://dl.dropboxusercontent.com/u/69551225/SFML-Plantilla.rar

En el modo DEBUG sale una consola en segundo plano para que puedas usar tus cout y printfs para depurar. Para que salga solo la ventana, el modo RELEASE y reconstruir el proyecto entero.


Título: Re: Necesito un código Escaner de Puertos en C++ usando Threads
Publicado por: leosansan en 26 Abril 2014, 22:06 pm

Muchas Thanks, campeón.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)


Título: Re: Necesito un código Escaner de Puertos en C++ usando Threads
Publicado por: Príncipe_Azul en 15 Mayo 2014, 08:19 am
Muchas gracias, muy amables!!!  :)