挂钩到windows进程

时间:2012-07-25 10:26:53

标签: process hook code-injection dll-injection

我需要在应用程序启动之后和退出之前执行某些操作(使用UMDH进行某种自动内存泄漏检测)。

我已经准备好了DLL,它被注入到所有进程和DLL_PROCESS_ATTACH我正在执行我的第一个操作(就在应用程序启动之后) - 所以我的问题的这一部分已经解决了。

问题在于第二部分 - 当进程即将退出时执行操作。

我在DLL_PROCESS_DETACH中尝试过,但为时已晚,我需要先挂钩。

使用Windows Hooks机制,我已经迷上了WH_GETMESSAGE:

hhk = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) &GetMsgProc, NULL , GetCurrentThreadId());

和GetMsgProc()函数:

LRESULT CALLBACK GetMsgProc(int nCode,WPARAM wParam,LPARAM lParam)
{
  if( nCode == HC_ACTION )
  {
        PMSG msg = (PMSG) lParam;
        if( msg->message == WM_CLOSE )
        {
              OutputDebugString(L"WM_CLOSE");
        }
        if( msg->message == WM_QUIT )
        {
              OutputDebugString(L"WM_QUIT");
        }
        if( msg->message == WM_DESTROY )
        {
              OutputDebugString(L"WM_DESTROY");
        }
  }
  return CallNextHookEx(hhk, nCode, wParam, lParam);
}

但是使用这种方法,我只检测WM_CLOSE消息(当我使用“X”按钮关闭应用程序时)。我不知道为什么我没有检测到WM_QUIT消息,从不。

任何想法,如何在应用程序即将退出时执行某些操作?

(我知道Detours,但不能在我的项目中使用它们......)

1 个答案:

答案 0 :(得分:0)

  1. WH_CALLWNDPROC外,请尝试WH_GETMESSAGE。因此,当您收到主应用程序窗口的WM_DESTROY时 - 这可能是一面旗帜。

  2. 我认为,理想情况下,您必须覆盖主应用程序窗口的窗口过程(如果可能)。 Smth喜欢

  3. 窗口过程不处理
  4. WM_QUIT消息。当GetMessage看到WM_QUIT时,它会返回FALSE。所以,这可能就是问题所在。您可以尝试更改IAT表(导入)以覆盖GetMessage [A / W]过程。

    WNDPROC gpfnOldProc = (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)YourWndProc);