message intercepting



  • hi,
    ich muss von einem anderen Programm (in einer dll die ich injecte) die nachrichtenschleife irgendwie abfangen oder ersetzten, da ich auch über die Nachrichten informiert werden will. Hat jemand gute Codes oder nen Link?



  • was wilst du genau machen. welche msg, wieso hookst du nich einfach die entsprechende wndproc oder reicht dies nicht.



  • das versuche ich doch...



  • void SetHook(HWND hWnd)
    {
            myhWnd = hWnd;
    
            if(!ghHook)
            {
                    ghHook = ggSetWindowsHookExA(WH_CALLWNDPROC, (HOOKPROC)BrowserHookProc, hInstDll, 0);
                    if(!ghHook)
                    {
                            MessageBox(NULL,"Hook kann nicht erstellt werden", "FEHLER", MB_OK | MB_ICONERROR);
                    }
            }
            else
            {
                    MessageBox(NULL, "Hook ist bereits erstellt", "Browser Window Hook", MB_OK);
            }
    }
    //---------------------------------------------------------------------------
    void RemoveHook(void)
    {
            ggUnhookWindowsHookEx(ghHook);
    }
    //---------------------------------------------------------------------------
    LRESULT CALLBACK BrowserHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        switch (nCode) 
        {
        case WM_KEYDOWN:
            {
                MessageBox(0,"Key Pressed","you have pressed a key",MB_OK);
            }
        }
    
         return CallNextHookEx(ghHook, nCode, wParam, lParam);
    }
    

    hab diesen Code hier im Forum gefunden, BrowserHookProc wird zwar aufgerufen aber WM_KEYDOWN nicht, obwohl ich bei dem Programm in das ich injecte auf der Tastatur was eingebe...



  • hab noch nen weiteren Code geschrieben, aber auch er erkennt die Tastatur nicht?

    #include <windows.h>
    
    LRESULT HookMain(int code,WPARAM wParam, LPARAM lParam);
    int SetHook(HWND hWnd);
    HHOOK g_hHook;
    HWND hWnd;
    UINT    WM_HOOKEX = 0;
    WNDPROC                OldFlyffProc = NULL;    
    HINSTANCE hDll;
    
    LRESULT CALLBACK    NewProc( HWND,UINT,WPARAM,LPARAM );
    
    BOOL APIENTRY DllMain( HMODULE hModule,
                           DWORD  ul_reason_for_call,
                           LPVOID lpReserved
                         )
    {
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        if (!hWnd) 
        {
    	HINSTANCE hInst = LoadLibrary("user32.dll");
           hWnd= FindWindow(NULL, "windowfromprogram");
        SetHook(hWnd);
    
        }
        if(!WM_HOOKEX)
        {
            WM_HOOKEX = RegisterWindowMessage("WM_HOOKEX_RK");    
        }
        hDll = (HINSTANCE) hModule;
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    
    int SetHook(HWND hWnd)
    {
        g_hHook = SetWindowsHookExA(WH_CALLWNDPROC,(HOOKPROC)HookMain, hDll, GetWindowThreadProcessId(hWnd,NULL));
        if( g_hHook==NULL )
        return 0;
        else
        {
            SendMessage(hWnd, WM_HOOKEX,0,1); // hier bleibt das Programm hängen
        return 1;
        }
    }
    
    #define pCW ((CWPSTRUCT*)lParam)
    LRESULT HookMain(int code,WPARAM wParam, LPARAM lParam)
    {
        if((pCW->message == WM_HOOKEX) && pCW->lParam) 
        {
            MessageBox(hWnd,"Hooked","I'm Hooked!",MB_OK);
            UnhookWindowsHookEx(g_hHook);
    
            char lib_name[MAX_PATH]; 
            GetModuleFileName(hDll,lib_name,MAX_PATH);
    
            if(!LoadLibrary(lib_name))
            {
               return CallNextHookEx(g_hHook, code, wParam, lParam);    
            }
    
            OldProc = (WNDPROC)SetWindowLong(hWnd, GWL_WNDPROC, (long)NewProc);
            if(!OldProc)
            {
                FreeLibrary(hDll);
            }
        }
        return CallNextHookEx(g_hHook, code, wParam, lParam);
    }
    
    LRESULT CALLBACK NewProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        switch (uMsg) 
        {
        case WM_KEYDOWN:
            {
                MessageBox(hwnd,"Key Pressed","NewProc",MB_OK);
                 // warum komme ich hier nicht her wenn ich nen Key drücke?
            }
        }
        return CallWindowProc( OldFlyffProc,hwnd,uMsg,wParam,lParam ); 
    }
    


  • lies die MSDN, der 1.code ist doch totaler schwachsinn. nCode beinhaltet doch nicht die window message. der 2.ruft allerlei krempel und library funktionen in DLL_PROCESS_ATTACH auf. nicht der grund, warum es nicht geht, aber das ist nicht erlaubt und kann ernsthafte probleme verursachen. solche frickeleien führen dann eben zu sowas. lies die MSDN zu hooks und zwar von anfang bis ende und nicht die ersten 2 zeilen, dann klappts auch mit dem hooken.

    außerdem würd ich einfach in der Dll die Wndproc des fenster mit SetWindowLong h00ken, is doch viel einfacher und ned so'ne h00k frickelei



  • also brauch ich den hook mist gar nicht? Aber wie soll das nur mit SetWindowLong gehen? Wäre sehr dankbar für mehr Hilfe 🙂



  • danke L0rd!! Warum sagen alle ich muss so nen gefrickel machen wenn ein simpler call zu SetWindowLong ausreicht 😕 -.-



  • also ich Zeige euch mal meinen Code:

    OldProc = (WNDPROC)SetWindowLong(FindWindow(0, TEXT("name")), GWL_WNDPROC, (LONG)NewProc);
    ////
    LRESULT CALLBACK NewProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
    {
        switch (uMsg) 
        {
        case WM_KEYDOWN:
    
    		  switch(wParam)
    		  {
    		  case VK_F1:
                              Beep(2000, 2000);
    			  break;
    		  }
    		  return 0;
        }
        return CallWindowProc(OldProc,hwnd,uMsg,wParam,lParam ); 
    }
    

    alles Funktioniert gut, ABER es hat den seltsamen Nebeneffekt, dass Entf und löschen nicht mehr funktioniert? Das heißt das Programme zeigt keine Reaktion wenn ich diese drücken, ohne der dll tut es das aber.



  • das return 0; verhindert ja auch dass CallWindowProc aufgerufen wird. mach das mal zu break;



  • L0rd Crush3r so klappt es!! Vielen Dank für deine HIlfe 🙂 👍


Anmelden zum Antworten