Hook in DLL wirft keine Events



  • Hallo,

    ich versuche, einen WH_MOUSE Hook zu schreiben. Ich habe eine DLL geschrieben, die alles nötige nach außen legt und so weiter. Er lädt die DLL, findet die exportierten Funktionen, aber der Hook geht iwie nicht?!

    Das verrückte: Meine Firewall sagt mir, dass ich einen Hook installiere, aber er geht nicht.

    Hier meine DLL:

    main.cpp:

    #include <windows.h>
    #include <stdio.h>
    
    #ifdef BUILD_DLL
    #define DLL extern "C" __declspec(dllexport)
    #else
    #define DLL extern "C" __declspec(dllimport)
    #endif
    
    HMODULE hMod;
    HHOOK hHook;
    
    DLL BOOL InstallHook();
    DLL BOOL UninstallHook();
    
    static LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam);
    
    LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    		printf("Event\n");
    	if (nCode <0)
    		CallNextHookEx(hHook,nCode,wParam,lParam);
    
    	/*if (wParam == WM_LBUTTONDOWN)
    	{
    		printf("Send!");
    		SendMessage(HWND_BROADCAST,WM_USER+42,0,0);
    	}*/
    
    	return CallNextHookEx(hHook,nCode,wParam,lParam);
    }
    
    DLL BOOL InstallHook()
    {
    	printf("\nDLL Install with hMod %x\n",hMod);
    	hHook=SetWindowsHookEx(WH_MOUSE,MouseProc,hMod,0);
    
    	if (!hHook)
    		return FALSE;
    
    	printf("Success %x\n", hHook);
    	return TRUE;
    }
    DLL BOOL UninstallHook()
    {
    	return UnhookWindowsHookEx(hHook);
    }
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
    					 )
    {
    	switch (ul_reason_for_call)
    	{
    	case DLL_PROCESS_ATTACH:
    		printf("DLL_PROCESS_ATTACH\n");
    		hMod=hModule;
    		break;
    	case DLL_THREAD_ATTACH:
    		printf("DLL_THREAD_ATTACH\n");
    		break;
    	case DLL_THREAD_DETACH:
    		printf("DLL_THREAD_DETACH\n");
    		break;
    	case DLL_PROCESS_DETACH:
    		printf("DLL_PROCESS_DETACH\n");
    		break;
    	}
    
    	return TRUE;
    }
    

    und hier (in einem anderen Programm, eine Konsolenanwendung) möchte ich den Hook nutzen:

    #include <windows.h>
    #include <stdio.h>
    
    typedef BOOL (*DLLFunction) (void);
    
    DLLFunction InstallHook;
    DLLFunction UninstallHook;
    
    int main()
    {
    	HMODULE hinstDLL; 
    	HOOKPROC hkprcSysMsg; 
    	HHOOK hhookSysMsg; 
    
    	hinstDLL = LoadLibrary(TEXT("HookTest.dll")); 
    	InstallHook = (DLLFunction)GetProcAddress(hinstDLL, "InstallHook"); 
    	UninstallHook = (DLLFunction)GetProcAddress(hinstDLL, "UninstallHook"); 
    
    	printf("Install\n");
    
    	bool b=InstallHook();
    	printf("Result: %d\n",b);
    
    	MSG strMessage;
    	while(GetMessage(&strMessage,NULL,0,0))
    	{
    		if (strMessage.message == WM_USER+123)
    		{
    			printf("Blubb\n");
    		}
    		TranslateMessage(&strMessage);
    		DispatchMessage(&strMessage);
    	}
    
    	UninstallHook();
    	FreeLibrary(hinstDLL);
    
    	return 0;
    }
    

    Ich sehe einfach den Fehler nicht, warum nicht eineinziges Mal "Event" ausgegeben wird?!

    Hoffe, ihr könnt mir helfen.

    Gruß
    tsp



  • DllMain wird nur zum Einrichten und Beenden einer DLL-Instanz aufgerufen. Hier bringt man Initialisierungen und Aufräumarbeiten unter. Alles andere muss in DLL-Funktionen erfolgen. Ich bezweifle, ob man in einer DLL überhaupt Hooks unterbringen kann, denn dort hat man keine Message-Loop.


  • Mod

    Weil printf in einem Anderen prozess drin ist und Deine Console in der Deine EXE läuft gar kennt.

    Wie wäre es wenn Du Dir erst mal Gründzüge von Prozessen, DLLs und Injection zu Gemüte führen würdest... wär doch was... aber nein es muß ja gleich ein Trojaner gebaut werden... 🤡


Anmelden zum Antworten