Keyboardhook



  • Hallo,

    ich wollte für meine DLL Hotkeys implementieren und hab dazu mit SetWindowsHookEx einen WH_KEYBOARD Hook gesetzt. Funktioniert hat es aber nicht, weswegen ich dieses Minimalprojekt zum Testen erstellt habe. Auch diese DLL funktioniert nicht, wenn sie in ein anderes Programm injected wird, außer das Programm bietet über die F1 Taste an ein Hilfmenu zu öffnen. Sobald man also F1 gedrückt hat, funktioniert in diesen Programm der Hook und bei jedem Tastendruck wird "lala" ausgegeben. Fenster bei denen F1 drücken nichts bewirkt, bei denen funktioniert auch der Hook nicht.

    #include <windows.h>
    
    HHOOK KeyHookHandle;
    
    LRESULT CALLBACK KeyboardHook(int code, WPARAM wParam, LPARAM lParam)
    {
    	if(lParam &0x80000000 || lParam &0x40000000)
    		return CallNextHookEx(KeyHookHandle,code,wParam,lParam);
    
    	if(code == HC_ACTION)
    		MessageBox(0,"lala","lala",0);
    
    	return CallNextHookEx(KeyHookHandle,code,wParam,lParam);
    }
    //---------------------------------------------------------------------------
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
    {
    	KeyHookHandle = SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardHook,hinstDLL,NULL);
    	if(!KeyHookHandle)
    		MessageBox(0,"fehler","fehler",0);
    	return 1;
    }
    

    Weiß jemand woran das liegt?

    greetz KN4CK3R



  • wenn ich deine DllMain sehe, wird mir schlecht. fwdreason ist aus gutem grund da.
    verstehe dein problem auch nicht. nen keyboard hook in einer dll für hotkeys?häh? schonmal was von RegisterHotkey() gehört??

    🙄



  • ein if(fwdreason == DLL_PROCESS_ATTACH) bewirkt auch keine Änderung und RegisterHotkey bringt mir auch nichts, da ich keinen Zugriff auf die Messageverarbeitung der Programme habe.

    greetz KN4CK3R



  • Dann hooke doch einfach die MessageProc Funktion.



  • rofl, ihr mit euren bekloppten hooks. ich mach dir jetzt mal nen vorschlag, sag uns was du übehaupt erreichen willst und ich wette wir können dir nen besseren weg sagen als immer gleich sofort mit kanonen auf spatzen zu schießen.



  • Er programmiert Cheats (Vermutung wegen Signatur..). Was willst du da bitte anderes tun?



  • es geht einfach nur dadrum, dass ich gerne einen Hotkey hätte um etwas an- bzw. auszustellen. Prinzipiell könnte ich das einfach so machen:

    while(true)
    {
        if(GetAsyncKeyState(VK_F1)&1)
            tu_dies();
    }
    

    Allerdings bin ich nicht gerade ein Fan von GetAsyncKeyState, weswegen ich lieber den Keyboardhook benutzen würde.

    greetz KN4CK3R



  • Hmmm,
    wie wäre es mit einer simplen RegisterHotKey() Funktion, in Verbindung mit WM_HOTKEY Nachricht?
    http://msdn.microsoft.com/en-us/library/ms646309(VS.85).aspx
    http://msdn.microsoft.com/en-us/library/ms646279(VS.85).aspx

    Diese Funktion gibst schon seit Ur-zeiten, nämlich Windows NT 3.1 :xmas2:
    Aber ich denke mal das ist viel zu einfach für Dich....

    Just my 5 cents

    P.S.: Übrigens, jede Hook-Funktion beansprucht zur Laufzeit zusätzliche Ressourcen der CPU! Steht auch so in der MSDN.



  • wenn ich die DLL zB in Notepad lade und dort Register Hotkey aufrufe, dann kann ich von Notepad nicht verlangen, dass er die WM_HOTKEY Message an meine DLL weiterleitet, außer ich hooke auch noch die Messageverarbeitung.

    Problem hat sich sowieso mittlerweile erübrigt, SetWindowsHookEx möchte nicht in der main-Funktion der DLL aufgerufen werden, woanders schon.

    greetz KN4CK3R



  • KN4CK3R schrieb:

    wenn ich die DLL zB in Notepad lade und dort Register Hotkey aufrufe, dann kann ich von Notepad nicht verlangen, dass er die WM_HOTKEY Message an meine DLL weiterleitet, außer ich hooke auch noch die Messageverarbeitung.

    Es reicht ja völlig aus, daß Deine DLL ein (unsichtbares) Fenster mit hwnd hat.
    Dieses hwnd gibst Du bei RegisterHotkey an.
    Und dieses Fenster bekommt dann die Nachrichten wie z.B. WM_HOTKEY.

    Einfache Lösungen sind immer noch elegantere Lösungen.



  • Hook, Hook, Hook!
    Haut ihm die Hooke voll!

    😃



  • hustbaer schrieb:

    Hook, Hook, Hook!
    Haut ihm die Hooke voll!

    😃

    aber echt 😉

    wie bekäme ich denn das HWND meines unsichtbaren Fenster raus das ich gar nicht erzeuge?

    greetz KN4CK3R



  • Mmacher schrieb:

    KN4CK3R schrieb:

    wenn ich die DLL zB in Notepad lade und dort Register Hotkey aufrufe, dann kann ich von Notepad nicht verlangen, dass er die WM_HOTKEY Message an meine DLL weiterleitet, außer ich hooke auch noch die Messageverarbeitung.

    Es reicht ja völlig aus, daß Deine DLL ein (unsichtbares) Fenster mit hwnd hat.
    Dieses hwnd gibst Du bei RegisterHotkey an.
    Und dieses Fenster bekommt dann die Nachrichten wie z.B. WM_HOTKEY.

    Einfache Lösungen sind immer noch elegantere Lösungen.

    Und das Fenster würde ich in einem eigenen Thread erzeugen, und dort auch Messages pumpen, damit alles schön unabhängig von Threads der Applikation ist.
    Dazu startet man im DLL_PROCESS_ATTACH einen Thread, was ganz gut funktioniert, solange man nicht auf den neuen Thread warten muss.



  • hä?^^ ich will doch gar kein Fenster erzeugen?! Wollte bloß erklärt haben, wie ich an das HWND des DLL Fensters komme, dass ich ja anscheinend erzeuge laut Mmacher.

    greetz KN4CK3R



  • du SOLLST aber eins erzeugen.
    was du TUST weiss ich natürlich nicht, und mmacher auch nicht, aber du SOLLST ein fenster erzeugen.
    das kannst du dann nämlich verwenden, um hotkeys zu empfangen.



  • Du sollst in der DLL einen Thread erstellen.
    In dessen Thread-Funktion steht dann der übliche Code für die Fenstererstellung (RegisterClassEx, CreateWindowEx, ShowWindow (aber mit SW_HIDE, damit unsichtbar!), UpdateWindow und letztendlich der Message-Pumpe)
    Dadurch hat man ja auch ein HWND und eine WndProc für dieses Fenster (das zwar unsichtbar, aber trotzdem da ist!)
    In dieser WndProc des unsichtbares Fenster kannste dann die WM_HOTKEY entgegennehmen.

    Ele



  • du kannst es dir leichter machen wenn du anstatt der dll die du injecten musst, einen treiber schreibst, damit sind keylogger relativ leicht zu verwirklichen, und zudem sind sie schlechter erkennbar als ein programm das ne dll injected.

    -- huubs, sah so aus wie der standart keylogger ansatz, habs erst jetzt gelesen 🙂

    --- taucht das neue fenster dann in enumerate windows auf? ( wäre eine detection mögl )



  • rofl als ob du oder der op ahnung von treiber programmierung hätten. ihr würdet doch mit den ersten 3 zeilen nen bsod hinkriegen.


Anmelden zum Antworten