Hooks sin dll

Iniciado por noele1995, 12 Septiembre 2013, 21:25 PM

0 Miembros y 2 Visitantes están viendo este tema.

noele1995

Se que algunos me vais a decir que no se puede, dado que en la MSDN pone esto:
CitarA global hook procedure can be called in the context of any application in the same desktop as the calling thread, so the procedure must be in a separate DLL module.

Bueno por mucho que en la información de la MSDN diga que no se pueden hacer hooks globales sin una dll es mas que posible y algo real. Ya lo hice antes en otro lenguaje (VB6).

El problema es el siguiente aunque se parece ser que se instalan bien los hooks mi callback fuction nunca es llamada y ademas el ordenador se ralentiza. Estoy intentado hacer los hooks desde un programa de consola, y creo que es aqui donde reside el problema ya que encontre un codigo donde enseñaba a hacer los hook sin dll pero usaba tambien una interfaz grafica, al modificar ese codigo para que el programa fuese simplemente de consola empezo a dar los mismos problemas que mi programa.

Aqui el code para hacer el hook sin dll: http://www.mpcforum.com/showthread.php?78344-SRC-Global-Hook-without-dll-(C-)

Aqui mi code:
Código (cpp) [Seleccionar]
#define _WIN32_WINNT 0x0400

#include <windows.h>
#include <iostream>

HHOOK hook;

__declspec(dllexport) LRESULT CALLBACK KeyboardHookProc (int nCode,WPARAM wParam,LPARAM lParam)
{
   if  ((nCode == HC_ACTION) && ((wParam == WM_KEYDOWN) || (wParam == WM_SYSKEYDOWN)))
   {
       KBDLLHOOKSTRUCT hookstruct = *((KBDLLHOOKSTRUCT*)lParam);

//............. codigo manejador del hook

   }
   return CallNextHookEx(hook, nCode, wParam, lParam);
}

int main()
{
hook = SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)KeyboardHookProc,GetModuleHandle(NULL),NULL);

system("pause");

UnhookWindowsHookEx(hook);

return 1;
}


Basicamente hace lo mismo que el codigo que habia en el link solo que sin la interfaz asique estoy un poco confundido de porque no funciona y como arreglarlo. Primero crei que habia que crear el callback como si fuese una funcion de una DLL  y he definido la funcion como lo hacian en el otro code pero eso sigue sin funcionar. ¿Alguna idea? Gracias por adelantado, llevo mas de una semana comiendome el coco con esto XD

Eternal Idol

No estas procesando los mensajes ... no te llegan nunca, bloqueas todo en system. Proba con el tipico bucle de mensajes:

BOOL bRet;

while( (bRet = GetMessage( &msg, hWnd, 0, 0 )) != 0)
{
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
}
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

noele1995

Oh vale ahi esta el problema jeje, bueno los hooks aunque los pase a un proyecto aparte los pensaba incluir en el troyano que estoy programando, pero yo ya tengo un bucle que esta procesando el envio y recibo de los sockets, ¿deberia crear un thread aparte para el bucle de los mensajes verdad? Muchas gracias no habia caido en eso XD

Eternal Idol

De nada y no es mala idea usar un hilo.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón