Wieder einmal: SetWindowsHookEx()



  • Hallo,

    ich habe eine kleine Keylogger DLL geschrieben und die funktioniert auch, zumindest wenn ich sie z.B. über eine Konsolenanwendung benutze.

    Das Problem ist aber, und dazu habe ich bislang nichts gefunden, daß ich sie von einem NT Service aus benutzen möchte und da passt SetWindowsHookEx() der hInstance Handle offenbar nicht, welchen ich bei DLL_PROCESS_ATTACH in der DllMain kriege.
    Zumindest liefert GetLastError() den Fehlercode "6" für "Invalid Handle".

    Wie krieg ich hier einen gültigen Handle?!?

    Thx,
    matthias



  • Ok, kleine Änderung:
    SetWindowsHookEx() gibt ein non-zero Ergebnis, d.h. bezieht sich die GetlastError() Meldung nicht hierauf und das mit dem Handle dürfte also eh klappen.
    Trotzdem wird die KeyboardProc() nicht aufgerufen.

    Funktioniert das etwa mit NTServices nicht?



  • Also mittlerweile habe ich durch Zufall herausgefunden, daß alles funktioniert, wenn man "Datenaustausch zwischen Dienst und Desktop" unter Systemsteuerung/Dienste anhakt.
    Und zwar MANUELL. Mein Dienst hat sich dieses Häkchen per registry key selbst gesetzt ..hehe.. anscheinend MUSS diese Option vom User gesetzt werden...

    In der Registry gibts unter LOCAL_MACHINE\SYSTEM\CCSet\Services\<Servicename> einen Unterordner "Security" - da steht ein dämlicher Hash oder so drin..
    Warscheinlich hat das was damit zu tun..
    so, hätt ich mir alle fragen selbst beantwortet. 😃

    naja, trotzdem danke.



  • ***** Problem gelöst *****

    Manuelles Setzen des entsprechenden Reg Keys hilft nicht. Man muss den Prozess einfach wie folgt erstellen:

    [cpp]SC_HANDLE service = CreateService(serviceControlManager, szServiceName, szServiceDispName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, szPath, 0, 0, 0, 0, 0);[/cpp]


Anmelden zum Antworten