SetWindowsHookEx注入在发布模式下失败,但在调试模式下工作

时间:2016-02-26 19:17:35

标签: c windows visual-studio-2012

我正在编写一个程序,使用SetWindowsHookEx监视目标进程的击键。 (IDE:Visual Studio 2013)以下是我的程序概述:

  1. 使用HWND获取FindWindow()目标流程。
  2. 如果HWND有效,请使用GetWindowThreadProcessId()
  3. 获取流程ID
  4. 通过使用CreateToolhelp32Snapshot(TH32CS_THREAD)
  5. 遍历线程列表来获取线程ID
  6. 致电SetWindowsHookEx()
  7. 实际代码:

    //obtain the window handle
    HWND hwnd = FindWindowA(NULL, "A valid title");
    DWORD pid = 0;
    //obtain the process id.
    GetWindowThreadProcessId(hwnd, &pid);
    //obtain the thread id.
    DWORD threadId = GetThreadId(pid);
    printf("Injecting to Process: %d Thread: %d\n", pid, threadId);
    HMODULE hDll = LoadLibraryA("TestDLL.dll");
    if (hDll == INVALID_HANDLE_VALUE)
    {
        printf("LoadLibrary() failed! %d!\n", GetLastError());
        return 0;
    }
    HOOKPROC hookproc = (HOOKPROC)GetProcAddress(hDll, "KeyboardProc");
    if (!hookproc)
    {
        printf("GetProcAddress() failed\n");
        return 0;
    }
    
    HHOOK hook = SetWindowsHookEx(WH_CALLWNDPROC, hookproc, hDll, threadId);
    if (!hook)
    {
        printf("SetWindowsHookEx() failed! %d\n", GetLastError());
        return 0;
    }
    //post a message. This will trigger the hook and cause the target process 
    //to load my dll. Actual key monitoring code is inside the dll.
    printf("SendMessage() returns:%d", SendMessage(hwnd, WM_NULL, 0, 0));
    
    printf("Success!\n");
    UnhookWindowsHookEx(hook);
    getchar();
    

    在调试模式下,输出显示:

    Injecting to process 4052 Thread:460
    SendMessage() returns:0
    Success!
    

    一个简单的分析表明目标进程确实加载了我的dll。这意味着该计划有效。但是,在释放模式下,输出相同但dll未加载到目标进程中。我每次尝试重启目标进程多次。但仍然行不通。 我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

当您在调试模式下说"" - 这是否意味着你在VS里面调试? 如果是这样,我猜测问题可能在权限集中 - 您可以使用提升的权限或在其他用户/组下运行VS.尝试在管理员模式下运行应用程序的发布版本。否则,如果任何进程可以将代码注入任何其他进程,那将是一个安全漏洞。