WM_PAINT einer Anwendung abfangen



  • Hi,

    ich habe eine 0815-Hello-World-Dialog-Anwendung mit der WinAPI geschrieben.

    (...)
    	hDlg = CreateDialogParam(hInst, MAKEINTRESOURCE(IDD_DIALOG1), 0, DialogProc, 0);
    	ShowWindow(hDlg, nCmdShow);
    
    	while((ret = GetMessage(&msg, 0, 0, 0)) != 0) {
    		if(ret == -1)
    			return -1;
    
    		if(!IsDialogMessage(hDlg, &msg)) {
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    
    	return 0;
    

    In der DialogProc-Funktion zeichne ich mittels WM_PAINT ein rotes Rechteck in den Dialog.
    Nun möchte ich eine DLL laden, welche mittels Hook die Zeichnung auf dem Dialog erweitert (zum Sinn: später soll die eigene Test-Dialoganwendung durch eine externe Anwendung ersetzt werden, bei der ich keinen Sourcecode habe).

    Dazu versuche ich, SetWindowsHookEx zu verwenden.

    Zunächst definiere ich eine DLL-Funktion install_hook, welche die Thread-ID des Dialog-Prozesses erhält und damit den Hook initialisiert. hinst ist die HINSTANCE-Instanz, welche ich von DllMain erhalten habe:

    BOOL __stdcall install_hook(DWORD targetThreadId) {
    	h = SetWindowsHookEx(WH_CALLWNDPROCRET, (HOOKPROC)callback_handle, hinst, targetThreadId);
    
    	return TRUE;
    }
    

    Und dazu der Hook-Callback callback_handle:

    LRESULT __declspec(dllexport) __stdcall CALLBACK callback_handle(int ncode, WPARAM wp, LPARAM lp) {
    
    	if(ncode == HC_ACTION) {
    		CWPRETSTRUCT* cwp = (CWPRETSTRUCT*)lp;
    		if(cwp != NULL) {
    			HWND hwndTrg = cwp->hwnd;
    
    			switch(cwp->message) {
    
    			case WM_PAINT:
    				MessageBox(NULL, "LMAO", "LMAO", MB_OK);
    				break;
    			}
    		}
    	}
    
    	LRESULT res = CallNextHookEx(h, ncode, wp, lp);
    	return res;
    }
    

    In meiner Dialog-Anwendung rufe ich nun entsprechend install_hook auf.
    Kompiliert, die Anwendung läuft. Nur wird mein WM_PAINT in callback_handle niemals aufgerufen. callback_handle an sich wird jedoch ein paar mal aufgerufen.

    Warum kann ich WM_PAINT so nicht abfangen?



  • Hallo, DLL-Injection mit SetWindowsHookEx habe ich bisher noch nicht gemacht ich habe aber ein Buch wo drin steht wie es geht, ich habs aber gerade nicht neben mir liegen.

    Du könntest das ganze jedoch mit CreateRemoteThread machen.

    DLL-Injector + Quellcode: http://lowlevel.bplaced.de/Downloads/DLL Injector.rar

    Hook-Tutorial: http://www.vivid-abstractions.net/category/programming/tutorials/

    Nachdem du dir die Sachen angeschaut hast solltest du es auch ohne SetWindowsHookEx hinbekommen falls ich lust habe schreibe ich mal den Quelltext aus dem Buch ab aber jetzt gerade hab ich kb.^^



  • Danke, aber mich ärgert, dass mein Lösungsweg generell funktionieren sollte. Ohne handfesten Grund, warum es so nicht geht, wollte ich ungern auf eine andere Lösung umsteigen.

    Martin Richter, wo bist du? 😉


  • Mod

    Ich antworte nie auf Fragen zu Hooks und Injection!
    Das sollte doch schon aufgefallen sein 😉



  • Poste doch mal den kompletten Code von deiner DLL.



  • Martin Richter schrieb:

    Ich antworte nie auf Fragen zu Hooks und Injection!
    Das sollte doch schon aufgefallen sein 😉

    Weil das Thema sonst seine Mystik verlieren und sich keiner mehr dafür interessieren würde 😉





  • Martin Richter schrieb:

    Ich antworte nie auf Fragen zu Hooks und Injection!
    Das sollte doch schon aufgefallen sein 😉

    Ist es denn für andere erlaubt zu antworten?
    Wenn ja, warum antworten sie (Martin Richter) nicht?
    (Bitte um eine offizielle Antwort)


Anmelden zum Antworten