Ayuda GetAsyncKeyState()

Iniciado por Luchoz95, 5 Abril 2013, 18:57 PM

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

Luchoz95

Hola genteee , miren tengo esta dll , y la quiero injectar a un proceso ..

#include <windows.h>



BOOL APIENTRY DllMain (HINSTANCE hmodule,     
                       DWORD reason,         
                       LPVOID reserved    ) 
{
    switch (reason) 
    {     
      case DLL_PROCESS_ATTACH:
  if(GetAsyncKeyState(VK_F12))
{
MessageBox(NULL,"Presionaste F12","Mensaje",MB_OK);
}
        break;
    }
    return TRUE;
}


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 !

85

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
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

x64core

Agrega un loop de mensajes, y yo crearia un hilo para capturar las teclas o bien estableceria un hook que es mejor.

85

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).

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

x64core

Cita de: 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).



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

Luchoz95

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 !
//Ejemplo GetAsyncKeyState
#include <stdio.h>
#include <windows.h>
#define INTERVAL 250

int main()
{
     char  * TECLAF12 ="OFF";
char  * TECLAF11 ="OFF";
char  * TECLAF10 ="OFF";
char  * TECLAF9 ="OFF";

while(!GetAsyncKeyState(VK_INSERT)) //Cuando se preciones la tecla INSERT se saldra del ciclo while
{
system("cls");
printf("Tecla [F12] -> : [%s]\n",TECLAF12);
printf("Tecla [F11] -> : [%s]\n",TECLAF11);
printf("Tecla [F10] -> : [%s]\n",TECLAF10);
printf("Tecla [F09] -> : [%s]\n",TECLAF9);
printf("\nSalir [INSERT]\n");

if(GetAsyncKeyState(VK_F12))
{
TECLAF12 ="ON";
}
if(GetAsyncKeyState(VK_F11))
{
TECLAF11 ="ON";
}
if(GetAsyncKeyState(VK_F10))
{
TECLAF10 ="ON";
}
if(GetAsyncKeyState(VK_F9))
{
TECLAF9 ="ON";
}

Sleep(INTERVAL);

}
}


Espero que les sirva de ejemplo , S2!

x64core

Es mejor establecer un hook, si sera en una dll a injectar entonces no es necesario global.

Luchoz95

si por ahora estoy tratando de entender la funcion , despues voy a ver si la puedo implementar en demas cosas

85

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
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/