elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Algo heavy en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Algo heavy en C++  (Leído 6,279 veces)
Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Algo heavy en C++
« en: 12 Julio 2015, 20:58 pm »

Hola miren, quiero realizar un MITM a la red, para ello me estoy sirviendo de wpcap.

Tengo la lista de usuarios en la red con su ip y mac asociada.

Ahora bien ya se como mandar mensajes ARP response para engañarlos y que me manden los datos a mí, el problema viene ahora.

Los mensajes ARP respose se los mando a los usuarios de una lista donde tengo las ips y sus macs de los usuarios de la red.

Lo que quiero es pasar el vector donde tengo las ips y macs a una funcion para que mande ARP responses a los hosts, pero a la vez quiero estar monitoreando el tráfico y añadiendo nuevos miembros a esa lista, y en caso de que uno falle o no responda ni un paquete en X tiempo quitarlo, si el numero de hosts es menor a X también se detendría, no sé si sería buena idea hacer 2 asyncs o threads.

Uno para mandar ARP responses y envenenar la red y otro que mientras me actualice la lista de hosts con sus ip y mac, la duda es:

¿Si tengo 2 asyncs que comparten una variable en este caso una clase que contiene un vector con la lista de usuarios, y una me está añadiendo y eliminando elementos mientras otra está trabajando con ellos, ¿fallaría el programa o no?

Ya os digo usar 2 asyncs o threads, uno escanea y actualiza la red y otro hace el spoofing.

Nada más, sino también se me ocurre meterlo todo en una función pero no sería igual de elegante y quedaría un poco gorda.

Saludos.


En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #1 en: 12 Julio 2015, 21:57 pm »

Como dije, tienes que usar un método de que solo un hilo entre a los fragmentos de código que modifican campos de la clase.
Mutex es la mejor opción en C++.


En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #2 en: 13 Julio 2015, 13:29 pm »

Pero.. ¿con mutex lo que hago no es detener un proceso (async o thread) para centrarme en otro? Es decir, cuando haga el lock el otro proceso se detendría y podría añadir los hosts pero en ese tiempo el otro proceso estaría muerto, no me parece tampoco muy buena solución.

De todas formas seguiré leyendo acerca de ello a ver si lo acabo entendiendo.

Básicamente lo que sé es que es un método de pasarse la pelota entre procesos, y no sería lo más eficiente, quizás podríamos saltarlo y que funcionara. O utilizar otro método como variables volatiles globales, ¿podría funcionar?

Saludos.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #3 en: 13 Julio 2015, 14:09 pm »

Estará muerto durante unos milisegundos, tal vez menos. Solo durante el tiempo que accedes a los puntos importantes donde se modifican campos del código.

Si no quieres definitivamente detener el hilo, también tienes mutex::try_lock, que entra y bloquea el mutex en caso de que pueda. Si no puede porque ya hay un hilo dentro, retorna false.

Citar
no sería lo más eficiente

¿Qué sería más eficiente? ¿Usar variables globales entre hilos para saber cual entra y cual no? Es lo mismo que usar mutex.

De todos modos, por qué quieres usar variables volatiles. Las variables volatiles evitan que el compilador optimize fragmentos de código donde las variables no se usen aparentemente.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #4 en: 13 Julio 2015, 14:24 pm »

Citar
Estará muerto durante unos milisegundos, tal vez menos.

Mmm es verdad, deberia ser solo para añadir un host a la lista con ip y mac (un vector), luego lo desbloquearía, entonces.. si el otro proceso estaba recorriendo el vector, cuando yo he añadido o eliminado un elemento para ese vector usando mutex, ¿cómo se debería de comportar el otro proceso que estaría recorriendo en ese momento los elementos del vector?

Supongo que podría fallar, puesto que si en ese momento estaba haciendo algo como:

Código:
for(int i=0;i<lista.usuarios.size();i++

Y en ese caso, lista.usuarios.size() valía 5, y estaba por el elemento i=4 (último y quinto elemento), al añadir un nuevo elemento por ejemplo ¿ya lo estaría teniendo en cuenta e iría hasta el sexto no? (i=5). Y si elimino uno, me saldría del bucle.... vamos esos problemas vendrían de una mala colocación del lock.

Bueno trataré de implementarlo se me hace algo raro, ya lo iré poniendo por aquí a ver que tal va, gracias socio.

Saludos.

Edito: Me vendría bien un poco de ayuda con la implementación pues soy nuevo en esto y se me puede alargar un poco, a ver que os parece esto:

Código
  1. mutex mtx;
  2. int main()
  3. {
  4. auto a = async(arp_spoofing, ..);
  5. auto b = async(actualiza_usuarios, ..);
  6. }
  7. void arp_spoofing(lista_usuario lista)
  8. {
  9. for (int i; i < lista.usuarios.size(); i++)
  10. {
  11. spoof(ip, mac);
  12.                //cuando acaba una ronda espera X tiempo...
  13.                //quizás aqui podria desbloquear el mutex para que modifiquen la lista
  14.                //pero como?
  15. }
  16. }
  17.  
  18. void actualiza_usuarios(lista_usuarios lista)
  19. {
  20. //analizo paquetes que entran
  21. //cada x tiempo reactualizo los host de la red.
  22. //ejemplo añadiria 1 y eliminaria 2.
  23. mtx.lock();
  24. lista.añadir(ip1, mac1);
  25. lista.eliminar_host(ip2, mac2);
  26. lista.eliminar_host(ip3, mac3);
  27. mtx.unlock();
  28.  
  29. }

¿Donde debería de meter el mutex en arp_spoofing?
« Última modificación: 13 Julio 2015, 14:51 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #5 en: 13 Julio 2015, 15:40 pm »

Código:
¿cómo se debería de comportar el otro proceso que estaría recorriendo en ese momento los elementos del vector?

Cualquier operación de vector, incluyendo recorrerlo, ha de ser envuelta por el mutex.

Código
  1. #ifndef MUTEX_TYPE
  2. #define MUTEX_TYPE
  3.  
  4. #include <mutex>
  5.  
  6. template<class T>
  7. class MutexType{
  8.    T _value;
  9.    std::mutex _m;
  10.  
  11. public:
  12.    MutexType(){}
  13.    MutexType(T newValue):_value(newValue){}
  14.    MutexType(const MutexType&)=delete;
  15.  
  16.    T& lock(){
  17.        _m.lock();
  18.        return _value;
  19.    }
  20.  
  21.    void unlock(){
  22.        _m.unlock();
  23.    }
  24. };
  25.  
  26. #endif // MUTEX_TYPE

Esta clase para envolver cualquier tipo en mutex, te puede ayudar. Claro que esta implementación basa su fiabilidad en el programador que la utilice, pues puedes hacer lock() y luego unlock() y seguir usando el objeto.

También puedes hacer funciones para trabajar con un objeto privado:

Código
  1. template<class T>
  2. class Mutexvector{
  3.    std::mutex _m;
  4.    std::vector<T> _v;
  5.  
  6. public:
  7.    void push_back(T value){
  8.        _m.lock();
  9.        _v.push_back(value);
  10.        _m.unlock();
  11.    }
  12.    /* ... */
  13.  
  14. };

Uses mutex, uses variables, uses lo que quieras usar, simplemente tienes que entender que acceder a contenido dinámico y modificarlo desde varios hilos (o ya incluso contenido estático), puede dar muchos problemas.
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #6 en: 13 Julio 2015, 16:48 pm »

No entiendo como me podría ayudar ese code a solventar mi problema mm.

Código
  1. mutex mtx;
  2. int main()
  3. {
  4. auto a = async(arp_spoofing, ..);
  5. auto b = async(actualiza_usuarios, ..);
  6. }
  7. void arp_spoofing(lista_usuario lista)
  8. {
  9.        mtx.lock();
  10. for (int i; i < lista.usuarios.size(); i++)
  11. {
  12. spoof(ip, mac);
  13.                //cuando acaba una ronda espera X tiempo...
  14.                //quizás aqui podria desbloquear el mutex para que modifiquen la lista
  15.                //pero como?
  16.                if(ha acabado una ronda)
  17.                      mutex.unlock(); Sleep(2000);
  18.                mutex.lock();
  19. }
  20. }
  21.  
  22. void actualiza_usuarios(lista_usuarios lista)
  23. {
  24. //analizo paquetes que entran
  25. //cada x tiempo reactualizo los host de la red.
  26. //ejemplo añadiria 1 y eliminaria 2.
  27. mtx.lock();
  28. lista.añadir(ip1, mac1);
  29. lista.eliminar_host(ip2, mac2);
  30. lista.eliminar_host(ip3, mac3);
  31. mtx.unlock();
  32.  
  33. }

Vamos no veo necesario para hacer esto usar una clase, la idea del mutex aplicada aquí,  la implementaría haciendo que cuando arp_spoofing acabe una ronda de arps, desbloquee el mutex, y entonces actualiza_usuarios proceda a modificar el vector.

Pero debería de pillar a actualiza_usuarios ya preparada para hacerlo y esperando ese unlock(), se juntan varias cosas con desconocimiento del tema XPP

Bueno aún no me he puesto a implementarlo, pero será divertido. >:D >:D

Saludos.
« Última modificación: 13 Julio 2015, 16:52 pm por Kaxperday » En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #7 en: 13 Julio 2015, 16:58 pm »

Código
  1. Sleep(2000);

Eso sobraría. Una vez hecho el unlock, si el otro hilo ha invocado lock(), se meterá. No necesitas esperar.

En cualquier caso, recorrer el vector con un índice es muy inapropiado. Podría el otro hilo eliminar una direccion, y entonces tu índice se podría saltar algún elemento.

Lo que deberías hacer, es copiar el vector, y liberar el mutex.

No hay cabidad a la suerte en la programación...
En línea

Kaxperday


Desconectado Desconectado

Mensajes: 702


The man in the Middle


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #8 en: 13 Julio 2015, 17:27 pm »

Una cosa,

¿cuando hago unlock() en async1 entrará en el otro async2 si este habría llamado al lock(), pero como puedo hacer que si no tenga llamado el lock() aún espere y lo use cuanto antes, es decir sino coincidirían el unlock() de uno con el lock() del otro, bueno me estoy haciendo la picha un lío, cuando lo pruebe comentare avances mejor  :¬¬ :¬¬ :xD

Saludos.
En línea

Cuando el poder económico parasita al político ningún partido ni dictador podrá liberarnos de él. Se reserva el 99% ese poder.
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Algo heavy en C++
« Respuesta #9 en: 13 Julio 2015, 18:18 pm »

A nivel práctico, el mutex es tan sencillo como lo dicho. Al llamar a lock(), se va a esperar hasta que se llame unlock, y sea su turno (puede haber varios hilos habiendo llamado al lock). No es más que eso. Ahora ya, impleméntalo como quieras.

Pero como he dicho, es atroz recorrer un array con un índice sabiendo que el array puede cambiar de tamaño en cualquier momento.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
como convertir algo en algo o crear algo xD
Electrónica
ATI-Radeon 2 4,255 Último mensaje 17 Diciembre 2006, 02:38 am
por davinci21
[RS][PC]Heavy Weapon Deluxe[17MB][Ing]Full..! Provado Por Mi by elsupergb...!
Juegos y Consolas
elsupergb 0 1,454 Último mensaje 1 Febrero 2008, 20:53 pm
por elsupergb
Warhammer prepara más contenidos con el evento Heavy Metal
Juegos y Consolas
Castiblanco 0 1,658 Último mensaje 21 Noviembre 2008, 23:26 pm
por Castiblanco
Fans de música clásica y heavy metal se parecen « 1 2 »
Foro Libre
daryo 13 5,781 Último mensaje 23 Mayo 2013, 21:11 pm
por daryo
Análisis de 'Heavy Rain' para PC
Noticias
wolfbcn 0 1,077 Último mensaje 13 Julio 2019, 02:23 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines