Process 挂接到windows进程

Process 挂接到windows进程,process,hook,code-injection,dll-injection,Process,Hook,Code Injection,Dll Injection,我需要在应用程序启动之后和退出之前执行一些操作(使用UMDH的某种自动内存泄漏检测) 我已经准备好了DLL,它被注入到所有进程中,在DLL\u进程\u附件上,我正在执行我的第一个操作(就在应用程序启动之后)——所以我的这部分问题得到了解决 问题在于第二部分-在流程即将退出时执行该操作 我已经在DLL_进程_分离中尝试过了,但为时已晚,我需要早点挂接 使用Windows钩子机制,我钩住了WH_GETMESSAGE: hhk = SetWindowsHookEx(WH_GETMESSAGE, (HO

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

我已经准备好了DLL,它被注入到所有进程中,在DLL\u进程\u附件上,我正在执行我的第一个操作(就在应用程序启动之后)——所以我的这部分问题得到了解决

问题在于第二部分-在流程即将退出时执行该操作

我已经在DLL_进程_分离中尝试过了,但为时已晚,我需要早点挂接

使用Windows钩子机制,我钩住了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_退出消息,从来没有

有什么想法吗?当应用程序即将退出时,如何执行一些操作

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

  • 除了
    WH\u GETMESSAGE
    之外,还可以尝试
    WH\u CALLWNDPROC
    。因此,当您收到主应用程序窗口的
    WM_DESTROY
    时,这可能是一个标志

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

  • WM_QUIT
    窗口过程不处理消息。当
    GetMessage
    参见
    WM\u QUIT
    时,它返回
    FALSE
    。所以,可能这就是问题所在。您可以尝试更改IAT表(导入)以覆盖GetMessage[A/W]过程

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

  • 让你的钩子DLL钩住
    DLL\u PROCESS\u ATTACH
    阶段的
    ExitProcess
    函数。我如何将钩子设置为ExitProcess函数?我已经在WH\u CALLWNDPROC上试过了,但在那里我只收到数百个WM\u DESTROY-我需要在应用程序即将退出时钩住,所以这个解决方案对我来说是不够的。我不能重写主窗口过程-我必须钩住所有应用程序,如基准测试、WLK测试等(解决方案必须是通用的)Ok,但我认为没有理由不重写窗口过程。答案已更新。