SetWindowsHookEx



  • hey,
    ich hätte eine Frage zu SetWindowsHookEx. Wenn ich jetzt eine DLL angebe und diese CBTProc enthält, und den hook setze, wie lang gilt der Hook dann?
    Bis die Funktion returned und fertig ist, und alle anderen Apps die neu erstellt werden haben dann keine DLL im Prozessraum? Oder so lange, wie die Application läuft, die den Hook installiert ist?
    Und meine zweite Frage, man sollte ja in DllMain nicht alles machen und es nicht reentrant. Gilt das auch für die CBTProc oder kann ich darin meinen Code ausführen? Oder sollte man auch bei dieser Methode eine Funktion exporten?
    Danke im Voraus!



  • mov eax, thread
    push eax
    

  • Mod

    Dein Hook gilt so lange bis der Hook entfernt wird. Das hat nichts mit der Ausführung oder sonst was zu tun.
    Hooks werden mit UnhookWindowsHookEx entfernt und solange sie nicht entfernt werden sind sie aktiv. Einfach mal die Doku lesen...

    Deine CBTProcist was ganz anderes und diese kann sehr wohl reentrant sein. D.h. mehrere Threads können diese zeitgleich in einem Prozess ausführe (je nach Hook).

    Ansonsten nützt es gar nichts die Hook Funktion in einen eigenen Block auszulagern. Was soll es nutzen eine Funktion zu exportieren?



  • danke für die Antwort.
    Der Hook an sich interessiert mich ja nicht. Ich will nur eine DLL in die Prozesse mappen. Und in DllMain sollte man ja einiges nicht ausführen und lieber ne Funktion exportieren und das muss man auch auf diese Methode übertragen oder nicht?


  • Mod

    apiredirector schrieb:

    danke für die Antwort.
    Der Hook an sich interessiert mich ja nicht. Ich will nur eine DLL in die Prozesse mappen. Und in DllMain sollte man ja einiges nicht ausführen und lieber ne Funktion exportieren und das muss man auch auf diese Methode übertragen oder nicht?

    Ich weiß nicht was Du willst?
    Meinst Du eine Init Funktion? Das Auslagern aleine in eine Funktion macht verbotenen Code nicht besser, wenn er dann doch wieder in DllMain ausgeführt wird.
    Was meinst Du?

    In der Hook Funktion selbst gibt es keine Einschränkungen, allerding sollte man sich klar sein, dass der Code dort effektiv und schnell sein sollte. Man hat sonst gleich eine eingebaute Handbremse im System.



  • ich meine so eine Funktion in der DLL

    extern "C" void __declspec(dllexport) Funktion()
    {
    
    }
    

    aber wenn du sagst man kann im Hook alles machen, ist das wohl überflüssig.


  • Mod

    Es würde nichts ändern. Solch eine Funktion dürftest Du auch aus DllMain nicht aufrufen, wenn diese "unerlaubte" Fnktionen ausführt.

    Wie kommst Du darauf, dass die Kapselung in einer Funktion auf einmal Funktionen "verträglicher"machen würde?



  • nö das meine ich nicht.
    Ich meine sowas wie nach dem SetWindowsHookEx noch ein CreateRemoteThread oder so um die Funktion zu starten, nicht im Context von DllMain


  • Mod

    CreateRemoteThread würde im eigenen Kontext laufen und hätte mit dem Hook nichts zu tun. Der könnte schon längst angesprungen worden sein...



  • ok danke Martin! 🙂



  • Martin bist du dir sicher, dass der Hook nach Beenden der Anwendung im System bleibt?
    Ich habe dieses getestet

    #include <windows.h>
    
    BOOL WINAPI DllMain(HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpReserved)
    {
       return TRUE;
    }
    
    extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
    {   
    	Beep(2000, 500);
    	return CallNextHookEx(0, nCode, wParam, lParam);
    }
    

    Als DLL...

    HMODULE hInjDll = LoadLibrary(DllFile);
    	FARPROC cbtProcAddr = GetProcAddress(hInjDll, "_CBTProc@12");
    	SetWindowsHookEx(WH_CBT, (HOOKPROC)cbtProcAddr, hInjDll, 0);
    

    Die exe dazu...

    Während die .exe läuft wird das System recht langsam und Beept meistens. Dann wenn die exe terminiert, wird alles ruhig, obwohl ich kein Unhook aufrufe -> Dll wird trotzdem demapped? Außerdem sieht es so aus, als wäre die DLL nicht in jedem Prozess, wenn ich z. B. Editor offen habe und OllyDbg attache, wird die DLL bei den Modulen angezeigt, aber bei vielen anderen die nicht in der Taskleiste sind nicht, obwohl sie keine höheren Rechte haben oder Systemprozesse sind.


  • Mod

    Ich habe nicht von der EXE gesprochen. Oder aus welcher Aussage schließt Du, dass der Hook die setzende EXE überlebt?

    Möglich, dass die Hooks automatisch entladen werden, wenn der Prozess terminiert.
    In der Doku steht

    Before terminating, an application must call the UnhookWindowsHookEx function to free system resources associated with the hook.

    Das nicht in alle Prozesse der Hook injeziert wird ist dokumentiert für Windows Vista und Windows 7
    Siehe z.B. IE Protected Mode
    http://msdn.microsoft.com/en-us/library/bb250462(VS.85).aspx

    Siehe Windows Vista Integrity Mechanism Technical Reference
    http://msdn.microsoft.com/en-us/library/bb625964.aspx



  • hi,
    aus dieser:

    Dein Hook gilt so lange bis der Hook entfernt wird. Das hat nichts mit der Ausführung oder sonst was zu tun.
    Hooks werden mit UnhookWindowsHookEx entfernt und solange sie nicht entfernt werden sind sie aktiv. Einfach mal die Doku lesen...

    aber ich sollte wohl selber darauf kommen, dass windows das selber schließt wenn ein Prozess beendet.

    Das heißt also ich muss den Hook in die DLL tun oder ich darf das loader programm nicht beenden richtig?



  • und als Ergänzung noch, ich habe windows xp.


  • Mod

    Für externe/systemweite Hooks muss der Hook immer in einer DLL sein!



  • und wenn ich einen Hook nur in einen einzigen thread installiere von einem anderen Programm? Kann er dann in der exe bleiben?


  • Mod

    Nein!



  • jetzt verstehe ich das conzept erst. Komisch dass es viel exen gibt die diese Funktion aufrufen obwohl das eigentlich falsch ist. Herzlichen Dank Martin



  • in einer DLL bleibt mein Hook auch nur so lange, wie die DLL noch was außerhalb des Hooks ausführt z. B. in der Funktion die ich vom Hauptprogramm aufrufe, die dann auch den Hook setzt, auch nicht viel besser 😕



  • und mit "Hook" meinte ich die Funktion selber also SetWindowsHookEx,
    kann die Funktion in der Exe bleiben?


Anmelden zum Antworten