Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Luchoz95 en 5 Abril 2013, 18:57 pm



Título: Ayuda GetAsyncKeyState()
Publicado por: Luchoz95 en 5 Abril 2013, 18:57 pm
Hola genteee , miren tengo esta dll , y la quiero injectar a un proceso ..

Código
  1. #include <windows.h>
  2.  
  3.  
  4.  
  5. BOOL APIENTRY DllMain (HINSTANCE hmodule,    
  6.                       DWORD reason,        
  7.                       LPVOID reserved    )  
  8. {
  9.    switch (reason)  
  10.    {      
  11.      case DLL_PROCESS_ATTACH:
  12.  if(GetAsyncKeyState(VK_F12))
  13. {
  14. MessageBox(NULL,"Presionaste F12","Mensaje",MB_OK);
  15. }
  16.        break;
  17.    }
  18.    return TRUE;
  19. }

injecto la dll , pero cuando preciono F12 no pasa nada ... el programa donde es injectada ya tiene la funcion GetAsyncKeyState, entonces les hago una pregunta , tengo que hookear la funcion GetAsyncKeyState para que mi F12 funcione ?

Saludos !


Título: Re: Ayuda GetAsyncKeyState()
Publicado por: 85 en 5 Abril 2013, 21:06 pm
Este es un código que hice recientemente donde se utiliza esa función, fijate si podés hacer que te funcione mirando el código, sino avisame
http://foro.elhacker.net/programacion_cc/mensaje_scroll-t386831.0.html


Título: Re: Ayuda GetAsyncKeyState()
Publicado por: x64core en 6 Abril 2013, 10:41 am
Agrega un loop de mensajes, y yo crearia un hilo para capturar las teclas o bien estableceria un hook que es mejor.


Título: Re: Ayuda GetAsyncKeyState()
Publicado por: 85 en 6 Abril 2013, 16:09 pm
Claro es como te dije por PM, GetAsyncKeyState te sirve para comprobar continuamente el estado de una llave (key), si vos lo hacés tal como está en el primer post, significa que sólo se va a comprobar 1 sóla vez cuando la DLL se adjunte al proceso. Con una sóla vez que lo compruebes no sirve, porque vos podés presionar una llave en cualquier momento y no justo cuando la DLL se carga, por eso necesitás hacerlo dentro de un bucle.

Al mismo tiempo, fijate que por ejemplo en mi código, yo tengo 2 hilos. El principal de la aplicación y el secundario creado con CreateThread explícitamente. Bueno lo que tenés que hacer dentro del secundario es poner un Sleep con un cierto tiempo, ya que dependiendo del sistema de planificación, vos sabés que los hilos necesitan compartir el tiempo de ejecución asignado al proceso. (Ejecución = CPU).
Sería como una planificación manual del programador, poner un Sleep para dejar "respírar" al hilo secundario y pasar al primario.

Alguien experto en planificación, multithreading, multiprocessor, etc te va a poder explicar con más detalle todo esto, porque puede ser diferente para distintas CPUs (monoprocesador o multiprocesador).



Título: Re: Ayuda GetAsyncKeyState()
Publicado por: x64core en 6 Abril 2013, 19:00 pm
Claro es como te dije por PM, GetAsyncKeyState te sirve para comprobar continuamente el estado de una llave (key), si vos lo hacés tal como está en el primer post, significa que sólo se va a comprobar 1 sóla vez cuando la DLL se adjunte al proceso. Con una sóla vez que lo compruebes no sirve, porque vos podés presionar una llave en cualquier momento y no justo cuando la DLL se carga, por eso necesitás hacerlo dentro de un bucle.

Al mismo tiempo, fijate que por ejemplo en mi código, yo tengo 2 hilos. El principal de la aplicación y el secundario creado con CreateThread explícitamente. Bueno lo que tenés que hacer dentro del secundario es poner un Sleep con un cierto tiempo, ya que dependiendo del sistema de planificación, vos sabés que los hilos necesitan compartir el tiempo de ejecución asignado al proceso. (Ejecución = CPU).
Sería como una planificación manual del programador, poner un Sleep para dejar "respírar" al hilo secundario y pasar al primario.

Alguien experto en planificación, multithreading, multiprocessor, etc te va a poder explicar con más detalle todo esto, porque puede ser diferente para distintas CPUs (monoprocesador o multiprocesador).



Seria bueno publicar codigos aquí para la gente que tenga problemas similares  ::)


Título: Re: Ayuda GetAsyncKeyState()
Publicado por: Luchoz95 en 7 Abril 2013, 03:02 am
Gracias a todos por las respuesta, mirando un poco el codigo que me paso 85, pude hacer algo , me sirvio mucho la explicacion que me diste sobre Sleep(), bueno aca el codigo !
Código
  1. //Ejemplo GetAsyncKeyState
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #define INTERVAL 250
  5.  
  6. int main()
  7. {
  8.     char  * TECLAF12 ="OFF";
  9. char  * TECLAF11 ="OFF";
  10. char  * TECLAF10 ="OFF";
  11. char  * TECLAF9 ="OFF";
  12.  
  13. while(!GetAsyncKeyState(VK_INSERT)) //Cuando se preciones la tecla INSERT se saldra del ciclo while
  14. {
  15. system("cls");
  16. printf("Tecla [F12] -> : [%s]\n",TECLAF12);
  17. printf("Tecla [F11] -> : [%s]\n",TECLAF11);
  18. printf("Tecla [F10] -> : [%s]\n",TECLAF10);
  19. printf("Tecla [F09] -> : [%s]\n",TECLAF9);
  20. printf("\nSalir [INSERT]\n");
  21.  
  22. if(GetAsyncKeyState(VK_F12))
  23. {
  24. TECLAF12 ="ON";
  25. }
  26. if(GetAsyncKeyState(VK_F11))
  27. {
  28. TECLAF11 ="ON";
  29. }
  30. if(GetAsyncKeyState(VK_F10))
  31. {
  32. TECLAF10 ="ON";
  33. }
  34. if(GetAsyncKeyState(VK_F9))
  35. {
  36. TECLAF9 ="ON";
  37. }
  38.  
  39. Sleep(INTERVAL);
  40.  
  41. }
  42. }
  43.  

Espero que les sirva de ejemplo , S2!


Título: Re: Ayuda GetAsyncKeyState()
Publicado por: x64core en 7 Abril 2013, 03:33 am
Es mejor establecer un hook, si sera en una dll a injectar entonces no es necesario global.


Título: Re: Ayuda GetAsyncKeyState()
Publicado por: Luchoz95 en 7 Abril 2013, 03:56 am
si por ahora estoy tratando de entender la funcion , despues voy a ver si la puedo implementar en demas cosas


Título: Re: Ayuda GetAsyncKeyState()
Publicado por: 85 en 7 Abril 2013, 16:29 pm
Si ese código funciona está bien, pero lo que te decía del Sleep es que era necesario cuando tenés más de un hilo, es como una planificación manual.
En este caso no es necesario porque tenés 1 sólo hilo, aunque dejalo para que no se queme tu CPU de tantas iteraciones XD