Abfangen der WM_GETMINMAXINFO Nachricht der notepad.exe klappt nicht!



  • Hallo,

    ich würde gerne die WM_GETMINMAXINFO Nachricht abfangen, bevor sie der Windows-Editor (notepad.exe) erhält. Dafür habe ich in C eine DLL mit einem Hook geschrieben. Diese DLL soll von meinem C#-Programmm aufgerufen werden.

    Folgendes steht bis jetzt in dem C-Programm:
    dll.h:

    #ifndef _DLL_H_
    #define _DLL_H_
    
    #include <windows.h>
    
    #if BUILDING_DLL
    # define DLLIMPORT __declspec (dllexport)
    #else /* Not BUILDING_DLL */
    # define DLLIMPORT __declspec (dllimport)
    #endif /* Not BUILDING_DLL */
    
    #define SHARED __attribute__((section(".shr"), shared))
    
    DLLIMPORT BOOL InstallHook(int i);
    DLLIMPORT BOOL UninstallHook();
    static LRESULT CALLBACK MyWndProc(int nCode, WPARAM wParam, LPARAM lParam);
    
    #endif /* _DLL_H_ */
    

    dll.c

    /* Replace "dll.h" with the name of your header */
    #include "dll.h"
    #include <stdio.h>
    
    HHOOK hHook SHARED = NULL; // Handle des Hooks
    HINSTANCE hInstance SHARED = NULL; // Handle der DLL
    FILE *fp SHARED;
    
    BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                           DWORD reason        /* Reason this function is being called. */ ,
                           LPVOID reserved     /* Not used. */ )
    {
        hInstance = hInst;
    
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    
    static LRESULT CALLBACK MyWndProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
            if (nCode < 0)
               CallNextHookEx(hHook, nCode, wParam, lParam);
    
            CWPSTRUCT* cw = (CWPSTRUCT*)(lParam);  
               if ( (cw->message == WM_GETMINMAXINFO))
               {
                  fprintf(fp, "GETMINMAX! \n"); // Wird nicht aufgerufen!
               }
            return CallNextHookEx(hHook, nCode, wParam, lParam);
    }
    
    DLLIMPORT BOOL UninstallHook()
    {
     UnhookWindowsHookEx(hHook);
     hHook = NULL;
     return TRUE;         
    }
    
    DLLIMPORT BOOL InstallHook(int i)
    {
              fp = fopen("log.txt", "w");
    
              hHook = SetWindowsHookEx(WH_CALLWNDPROC, MyWndProc, hInstance, i);
              if (hHook == NULL)
                 return FALSE;   
    
              return TRUE;          
    }
    

    Dabei kompiliere ich das ganze mit dem Dev++ Tool.

    Der Abschnitt in meinem C#-Programm sieht folgendermaßen aus:

    [DllImport("Hook.dll")]
            public static extern bool InstallHook(int i);
    ...
    
    Process process = new Process();
                process.StartInfo.FileName = "notepad.exe";
                process.Start();
    
                bool b = InstallHook(process.Threads[0].Id);
                if (b == false)
    

    Was mache ich bloß falsch? Die Dll wird einfach nicht benachrichtig, wenn sich die Größe des Notepad-Fensters ändert...

    Wäre lieb, wenn jemand eine Lösung hätte 😋

    Schöne Grüße,
    Sandra



  • Hallo,

    ich muss hinzufügen, dass ich soeben gemerkt habe, dass die Methode MyWndProc erst gar nicht aufgerufen wird.

    Ich bekomme also keine Messages über notepad.exe, woran mag das liegen?



  • Du könntest doch Detours nutzen und manuell hooken, so kannst du sicher gehen.

    Dann müsstest du allerdings auch dafür sorgen dass deine DLL in den Prozess kommt, aber dafür gibts ja Möglichkeiten ( Ein Beispiel unter C# : http://dl.getdropbox.com/u/2660220/Injector.rar)



  • Hallo Icematix,

    danke für deinen Tipp.
    Spy++ oder Winspector Spy können so etwas ja ebenfalls. Sie lauschen alle Nachrichten von jedem beliebigen Thread. Meinst du wirklich, diese Tools arbeiten auch mit DLL Injection?

    Ich hoffe, es gibt noch einen anderen Weg. 🙂


  • Mod

    Woher weist Du, dass Deine Hook Proc nicht aufegrufen wird.
    Wiel nichts in Deine Datei geschrieben wird?

    Wie kommst Du darauf, dass Du einen FILE* zwischen mehreren Prozessen sharen könntest? Dass Deine Anwendung den Notepad nicht zum abschmieren bringt ist ein Wunder!

    Werde Dir ertsmal klar was DLL Injekction bedeutet und was es heißt das es unterschiedliche Prozesse gibt.

    Arbeite mit OutputDebugString
    http://msdn.microsoft.com/en-us/library/aa363362(VS.85).aspx



  • Hallo Martin,

    danke für deinen kritischen Kommentar. Du hattest Recht, es liegt an dem File-Pointer. War ja auch eine echt blöde Idee von mir.

    Dll Injection brauche ich also nicht, da durch SetWindowsHookEx die Dll sowieso im Memory der Zielapplikation landet.

    Danke!


  • Mod

    Ein globaler Hook ist eine DLL-Injection!


Anmelden zum Antworten