Título: Algo heavy en C++ Publicado por: Kaxperday 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. Título: Re: Algo heavy en C++ Publicado por: ivancea96 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++. Título: Re: Algo heavy en C++ Publicado por: Kaxperday 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. Título: Re: Algo heavy en C++ Publicado por: ivancea96 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. Título: Re: Algo heavy en C++ Publicado por: Kaxperday 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
¿Donde debería de meter el mutex en arp_spoofing? Título: Re: Algo heavy en C++ Publicado por: ivancea96 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
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
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. Título: Re: Algo heavy en C++ Publicado por: Kaxperday en 13 Julio 2015, 16:48 pm No entiendo como me podría ayudar ese code a solventar mi problema mm.
Código
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. Título: Re: Algo heavy en C++ Publicado por: ivancea96 en 13 Julio 2015, 16:58 pm Código
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... Título: Re: Algo heavy en C++ Publicado por: Kaxperday 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. Título: Re: Algo heavy en C++ Publicado por: ivancea96 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. Título: Re: Algo heavy en C++ Publicado por: Kaxperday en 13 Julio 2015, 23:21 pm Bueno iba a meter una santa parrafada, pero he llegado a la conclusión de QUE, lo mejor es usar un solo thread, ya que si voy a tener 2 y voy a estar llamando al uno cada X tiempo luego al otro.. mutex.. lo mejor hago uno y ya esta, porque si el mutex lo que va a acabar haciendo es bloquear un thread, tengo lo mismo que si trabajo con un solo thread.
Escuchare paquetes de la red, cada X tiempo escaneare la red, y cada Z tiempo mandaré arp spoofing, todo en un thread, ya que con 2 threads y mutex, me da errores, y voy a tener lo mismo, pues haría el lock() para mandar arp spoofing a los hosts, apenas tarda tiempo, para eso lo hago en un thread y me ahorro mutex y demás. Aunque el tiempo que tardo en spoofear no estaría recogiendo paquetes... pero si hago lock() para spoofear tampoco lo estaría haciendo luego ¿porque no solo usar un thread? (Ya que en ambos casos usaria la lista de usuarios y el vector de hosts, estaría compartiendo la variable. Edito: O mejor hacer el spoofing y el escaneo de host (donde uso la variable) en una funcion, y la otra simplemente escucha y redirige el tráfico. Podría ir. No necesitaría mutex. Saludos. Título: Re: Algo heavy en C++ Publicado por: ivancea96 en 13 Julio 2015, 23:50 pm El mutex no ha de retrasar tu programa ni 1 milisegundo por segundo. Basta que lo organices bien. Pero tú verás dónde quieres colocar 1, 2 o 100 threads.
Título: Re: Algo heavy en C++ Publicado por: Kaxperday en 14 Julio 2015, 00:33 am Pff es que es bastante jodido, tengo que llamar al mutex para actualizar los hosts (que haga arp scanning) y eso lleva tiempo, sin embargo tienes razón si está bien organizado podría tenerlos ya listos y solo insertarlos o eliminarlos del vector, pero.. el problema es que para eso los he tenido que escanear anteriormente y debería de estar esperando a que me llamasen, ¿como?
Saludos socio. Título: Re: Algo heavy en C++ Publicado por: ivancea96 en 14 Julio 2015, 00:56 am A que te llamasen, ¿quienes?
Título: Re: Algo heavy en C++ Publicado por: Kaxperday en 14 Julio 2015, 01:22 am Ha que llamasen a la funcion, cuando se ejecuta cada cierto tiempo el escaner de red, se llama a su funcion, pero lleva tiempo hacer el escaner unos 5 segundos, luego deberia de estar ya hecho y esperando a que lo llamasen, pero ¿como? Ademas ademas el escaner de red se ejecuta cada X tiempo, pasado ese tiempo escanearia, y mientras ese tiempo tiene que mandar arp poisoning en bucle con los hosts.
Saludos. Edito: Haber lo que decía, estoy en este bucle: Código
Cuando acabo de spoofear a los usuarios, hago un descanso en ese descanso desbloqueo el mutex para que me modifique la lista, pero que pasa? que la lista se reescanea en otro bucle cada X tiempo, y no siempre está lista por lo que da error, ¿como puedo esperar al mutex? Lo que pasa es que el arp spoofing es cada segundo, y el escaneo de red cada 60 segundos por ejemplo, en el arp spoofing estoy siempre usando la lista, pero cuando hago el reescaneo pasado X tiempo (60 seg) trato de acceder a la variable usando mutex, para una operacion de apenas milisegundos pero no puede acceder, ¿alguna posible solucion? Saludos. |