Hook w DLL

0

Witam.

Mam następujący problem, po przeczytaniu kilku tematów z forum, a także pogrzebaniu w msdn'nie dalej nie wiem w czym problem.

Platforma: Windows XP
IDE: DevC++
Język: C++

Zakładam globalny hook w bibliotece DLL. Wygląda to tak:

/* Replace "dll.h" with the name of your header */
#include "dll.h"


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{
    hDllInst = hInst;
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}


void DLLIMPORT HookConsole()
{
     MessageBox(NULL, "W HookConsole.", "_Msg", MB_OK);
     hHook = SetWindowsHookEx(WH_KEYBOARD, &KeyProc, hDllInst, 0);
}

void DLLIMPORT UnhookConsole()
{
     MessageBox(NULL, "W UnhookConsole.", "_Msg", MB_OK);
     UnhookWindowsHookEx(hHook);
}

LRESULT CALLBACK DLLIMPORT KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
     if(code < 0) return CallNextHookEx(hHook, code, wParam, lParam);   
     
            if(wParam == VK_RETURN) MessageBox(NULL, "To jest enter", "MSG", MB_OK);
            else MessageBox(NULL, "To nie enter", "MSG", MB_OK);
     
     return CallNextHookEx (0, code, wParam, lParam);
}

W deklaracjach (dll.h) wszystko ujęte jest w extern "C"{}

Tak wyglądają funkcje w DLL. Komunikaty o zakładaniu z funkcji Hook i Unhook Console widać. Natomiast nie dzieje się nic poza tym. Nie reaguje na wciskane klawisze. Oczywiście bibliotekę ładuję i funkcje zakładające i zdejmujące hooka. Zakładam w WM_CREATE, zdejmuję w WM_DESTROY.

Pytanie:
Dlaczego to nie działa ? Hook globalny, założony w DLL. Powinno śmigać, a nie śmiga. Po kompilacji DLL'ki wyskakuje ostrzeżenie, że nie zdefiniowano Host Application, to może być powód ? (I jeśli tak, to jak to mam podczepić, co wpisać tam gdzie trzeba, bo pisze, że można to ustawić w jakiś tam parametrach).

Pozdrawiam
Mrówa.

0

$1 Nie pokazałeś jak zakładasz hooka
$2 Jak linkujesz bibliotekę(w jaki sposób exe widzi funkcję z dll), statycznie, czy GetProcAddress
$3 Te dwie funkcje to lepiej umieścić w DllMain, chyba, że wolisz je ręcznie wywoływać w execu

EDIT:
No i najważniejsze co zwraca SetWindowsHookEx(), czy czasem nie NULL?

0

Hooka zakładasz funkcją HookConsole. Biblioteka jest linkowana dynamicznie (czyli LoadLibrary, a do funkcji odwołuję się przez adres, który pobierasz GetProcAddress).

Punkt za spostrzegawczość. SetWindowsHookEx zwraca mi NULL. Co może być tego przyczyną ?

Ładowanie DLL'ki:

// definicje 
typedef void (*VOIDFN) (void);
VOIDFN Start = NULL;
VOIDFN Stop = NULL;
HINSTANCE hInstDLL = NULL;

.
.
.

// załadnowanie DLL
hInstDLL = LoadLibrary ("CheatBusterAC.dll"); 
Start = (VOIDFN) GetProcAddress (hInstDLL, "HookConsole"); 
Stop = (VOIDFN) GetProcAddress (hInstDLL, "UnhookConsole"); 

A potem to tylko wywołanie funkcji Start() i Stop().
Czyli już wiemy, że SetWindowsHookEx sie nie udaje. Dlaczego? Proszę o podpowiedzi . Poszukam także w googlach. W końcu mam nowy trop.

Dzięki crayze :)

EDIT:
Dodam, że hook w obrębie mojego wątka (lokalny) działa. Wtedy go piszę w kodzie aplikacji. A na DLL sie za bardzo nie znam. Przeczytałem jakieś kursy i tam działało, przekopiowałem tamten kod też dla testu i nic.

0

Witam.

Problem rozwiązany poniekąd. Dalej nie wiem dlaczego nie działał tamten kod. Ale spróbowałem rozwiązać to inaczej i działa.

Dla ludzi, którzy kiedyś spotkają taki problem i trafią na ten temat.
Hook zakładam w kodzie aplikacji. Czyli np. w WM_CREATE SetWindowsHookEx, gdzie podajemy hInstDLL (3 argument) biblioteki i Procedurę hakową też załadowaną z biblioteki. Jak to uzyskać ?

typedef LRESULT CALLBACK (*FN) (int code, WPARAM wParam, LPARAM lParam);
HINSTANCE hInstDLL = NULL;
FN KeyboardProc = NULL;
HHOOK hHook;
.
.
.

hInstDLL = LoadLibrary ("CheatBusterAC.dll"); 
    if(hInstDLL == NULL) 
       MessageBox(NULL, "LoadLibrary CheatBusterAC.dll failed.", "Error!", MB_ICONERROR);
    KeyboardProc = (FN) GetProcAddress (hInstDLL, "KeyProc");

A w DLL'ce jest tylko i wyłącznie procedura hakowa.

Dzięki i Pozdrawiam
Mrowa.

0

Jak ci SetWindowsHookEx zwraca NULL to sprawdź co się stało funkcją GetLastError.

0

Sprawdzałem i wychodzi mi z GetLastError() wartość 0 ;P

0

Jeśli GetLastError zwraca ci 0, to znaczy, że nie wywołałeś go zaraz po SetWindowsHookEx lub SetWindowsHookEx nie zwróciło NULL'a.

0

No myślę, że i tak nie warto drążyć tego tematu. Mi tam w sumie wsio lotto czy w DLL'ce mam samą procedurę hakową czy z funkcjami włączającymi i wyłączającymi haka.

Wszystkim dziękuję za odpowiedzi.
Pozdrawiam Mrowa

1 użytkowników online, w tym zalogowanych: 0, gości: 1