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

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Bucle while infinito muy ruidoso para keylogger c++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Bucle while infinito muy ruidoso para keylogger c++  (Leído 2,627 veces)
@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Bucle while infinito muy ruidoso para keylogger c++
« en: 3 Junio 2019, 08:17 am »

Como puedo hacerlo consumir menos recursos de cpu sin perder pulsaciones de tecla?
No quiero usar delay, wait, sleep ni nada parecido porque se puede saltar pulsaciones de teclas y a parte a pensas baja el uso de cpu.
Alguna solución buena?

El codigo es en plan:

while(true)
{
for (//tamanho maximo del log)
{
if ( teclainput() ) escribelog;
}
}



En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Bucle while infinito muy ruidoso para keylogger c++
« Respuesta #1 en: 3 Junio 2019, 19:34 pm »

Por lo que dices de los recursos de CPU, imagino que en teclainput() iría una función tipo kbhit(), que simplemente verifica si hay datos de teclado. Por lo tanto, cuando no hay tecla presionada, regresa y se vuelve a ejecutar el bucle, ocasionando el alto consumo de recursos. La clave estaría en usar mejor una función bloqueante, es decir, que intente leer una tecla, y si no hay ninguna, simplemente espere, y de esa forma no se usa prácticamente nada de CPU. Todas las funciones estándar de entrada de C y C++ (getchar, cin.get, etc.) ya son bloqueantes, pero un problema es que, de forma predeterminada, stdin usa buffer por línea. Por ejemplo, getchar() lee un caracter, pero el usuario tiene que presionar Enter para que esta función pueda leer lo que escribió. La solución sería cambiar stdin a modo sin buffer. En Windows podría hacerse así:

Código
  1. // Obtenemos handle a stdin
  2. HANDLE hEntrada = GetStdHandle(STD_INPUT_HANDLE);
  3. DWORD modo;
  4. char c;
  5.  
  6. // Guardamos la configuracion actual
  7. GetConsoleMode(hEntrada, &modo );
  8. // Desactivamos el buffer por linea
  9. SetConsoleMode(hEntrada, modo & ~(ENABLE_LINE_INPUT) );
  10.  

Una vez hecho esto, ya podrías hacer algo así:

Código
  1. while (true) {
  2.    c = cin.get(); // o getchar() o cualquier funcion que lea 1 caracter
  3.    escribelog(c);
  4. }
  5.  
  6. // Importante devolver stdin a su estado original antes de salir del programa
  7. SetConsoleMode(hEntrada, modo);

De esta manera, el programa simplemente esperará a que se presione alguna tecla, sin consumir apenas CPU, y en cuanto el usuario teclee algo, sin necesidad de que presione Enter, cin.get() lo obtendrá.

Una forma aún mejor sería haciendo que tu aplicación reciba eventos del teclado, pero ahí ya tendrías que usar más cosas de la API de Windows.

Y, claro está, me basé en el seudocódigo que pusiste, pero esto obviamente no funcionaría como keylogger, ya que sólo captura teclas de tu propia aplicación. Si quisieras capturar las del sistema, podrías crear un hook de teclado (WH_KEYBOARD o WH_KEYBOARD_LL). Realmente no es difícil pero tendrías que meterte más de lleno a WinAPI.


En línea

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: Bucle while infinito muy ruidoso para keylogger c++
« Respuesta #2 en: 3 Junio 2019, 19:58 pm »

Muchas gracias por la respuesta. El problema es el bucle en sí, no la repeticion de instrucciones de dentro. Si no ek propio bucle, si creo un bucle while vacio completamente tengo el mismo problema. La funcion que uso no se parece a kbhit, solo lee las teclas if (KEY_IS_DOWN) mediante eventos. Es decir, cuando una tecla se baje. No cuando encuentre datos en buffer. Si una tecla se pulsó hago comprobaciones en un switch(mapa) con case 0x30: escribeenlog("0"); Usando virtual keywords http://www.kbdedit.com/manual/low_level_vk_list.html

En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

RayR

Desconectado Desconectado

Mensajes: 243


Ver Perfil
Re: Bucle while infinito muy ruidoso para keylogger c++
« Respuesta #3 en: 3 Junio 2019, 21:04 pm »

Sí, un bucle vacío también te va a consumir mucho CPU, debido a que las instrucciones de verificación de la condición y el salto de vuelta al inicio, se van a ejecutar muchos millones de veces por segundo:

Código:
while (true) {
}

Aquí, el procesador está constantemente verificando si la condición es true, y saltando de nuevo al inicio del bucle. Esto sucede tan rápido, que ese trozo de código hace que tu procesador ejecute seguramente muchos millones de instrucciones por segundo. En este otro caso:

Código:
while (true) {
    if (tecla_presionada()) {
    ....
    }
}

En este caso, estamos llamando a tecla_presionada() en cada repetición, pero dado que lo único que hace es verificar si se presionó una tecla, regresa muy rápido. Ahora, en condiciones normales, la gran mayoría de las veces no habrá tecla presionada (obviamente nadie puede teclear millones de veces por segundo), por lo que ese if evaluará a falso, y volveremos a la siguiente repetición del bucle. Todo esto pasa muy rápido, y no hay nada ahí que le diga al procesador que tiene que detenerse un poco: él hace lo que tiene que hacer, que es ejecutar las instrucciones que tiene delante, tan rápido como sea posible.

Aunque no sé qué librería estás usando, prácticamente todas (por no decir todas) las que funcionan de la forma if (KEY_BLABLA), en Windows llaman internamente a la función GetKeyState o GetAsyncKeyState. Estas funciones únicamente verifican si la tecla especificada está presionada, y en cualquier caso, regresan inmediatamente, por eso estoy seguro de que así funciona también la función que estés llamando.

La única forma de evitar el alto consumo es haciendo que el bucle no se repita tan rápidamente, y eso sólo se puede hacer, o con algo tipo sleep, que no es muy recomendable, o usando funciones bloqueantes, como en el ejemplo que te puse, que no consume prácticamente nada de CPU. Si no te sirven las funciones de entrada estándar, tendrías que ver si la librería que estés usando tiene funciones que verifiquen si hay teclas presionadas, y si no las hay, espere hasta que se presione alguna, es decir, que funcionen de forma bloqueante. De otra manera, es imposible solucionar el problema.

Pero como te mencioné en el otro mensaje, la mejor solución es usar eventos de Windows, es decir, que tu programa reciba mensajes. De esa manera, ni siquiera hay que poner verificaciones if (KEY_IS_DOWN). Tu programa automáticamente será notificado cuando se haya pulsado alguna tecla, y tú únicamente verificas el valor de tecla virtual que recibas. De hecho, así es como suelen funcionar los keyloggers reales (aunque estos, adicionalmente instalan, como te decía, hooks para capturar teclas de todo el sistema).
En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.518


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Bucle while infinito muy ruidoso para keylogger c++
« Respuesta #4 en: 3 Junio 2019, 21:26 pm »

No quiero usar delay, wait, sleep ni nada parecido porque se puede saltar pulsaciones de teclas y a parte a pensas baja el uso de cpu.
Alguna solución buena?

Usar hooks: https://www.codeproject.com/Articles/1264/KeyBoard-Hooks

Saludos!
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

@XSStringManolo
Hacker/Programador
Colaborador
***
Desconectado Desconectado

Mensajes: 2.399


Turn off the red ligth


Ver Perfil WWW
Re: Bucle while infinito muy ruidoso para keylogger c++
« Respuesta #5 en: 3 Junio 2019, 21:37 pm »

Intentaré usar algun tipo de funcion bloqueante que no haga nada hasta que reciba input.
A parte el keylogger que estoy diseñando va bastante como el culo. Nornalmente pilla todas las teclas pero a veces el for no le da tiempo a pillar teclas. Entonces si escribo HHHOOOLLLAAA en el log se me puede guardar:
HHOAAA

Creo que voy a empezar de 0 mirando por ejemplos para ver varias maneras de hacerlo. El tema es que me gustaría que fuese en C++ puro multiplataforma porque a parte del keylogger se guardan otro tipo de registros y lo quiero usar para pcs que tengan servidor linux y sistema windows. Se que podría hacerlo con un rotkit y varios módulos. Uno de ellos para desplegar otro rotkit desde un sistema a otro y tener 1 en cada sistema según versión etc, pero no me convence. Parece una tarea muy pesada.

Es más que nada para aprender, si no hacia copia y pega de sources y ya.


Mirare los hoocks, pero ne gustaría que fuese multiplataforma sin tener que diseñar un keylogger para windows, otro para linux, otro para mac, otro para android...

La idea es subir el keylogger a un servidor web al cual puedo acceder a archivos de solo lectura para sacar la pass de root. Ya sea windows server, ubuntu server o lo que sea.
En línea

Mi perfil de patrocinadores de GitHub está activo! Puedes patrocinarme para apoyar mi trabajo de código abierto 💖

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
probando un bucle infinito... « 1 2 3 »
Bugs y Exploits
mousehack 22 16,364 Último mensaje 28 Agosto 2015, 21:46 pm
por MCKSys Argentina
Bucle infinito para petar linux en C ??
Hacking
LegolasArc 2 5,818 Último mensaje 5 Diciembre 2010, 12:12 pm
por toxeek
El que se ha metido en un bucle infinito soy yo...
Programación C/C++
Superplay 0 3,991 Último mensaje 1 Diciembre 2010, 21:14 pm
por Superplay
Implementacion de bucle infinito
Programación C/C++
mark182 3 4,787 Último mensaje 12 Marzo 2011, 11:33 am
por Akai
Bucle infinito interumpible
Programación C/C++
soyloqbuskas 3 2,988 Último mensaje 23 Agosto 2012, 01:06 am
por 0xDani
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines