我正在编写一个程序,使用SetWindowsHookEx
监视目标进程的击键。 (IDE:Visual Studio 2013)以下是我的程序概述:
HWND
获取FindWindow()
目标流程。HWND
有效,请使用GetWindowThreadProcessId()
CreateToolhelp32Snapshot(TH32CS_THREAD)
SetWindowsHookEx()
。实际代码:
//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未加载到目标进程中。我每次尝试重启目标进程多次。但仍然行不通。 我该如何解决这个问题?
答案 0 :(得分:0)
当您在调试模式下说"" - 这是否意味着你在VS里面调试? 如果是这样,我猜测问题可能在权限集中 - 您可以使用提升的权限或在其他用户/组下运行VS.尝试在管理员模式下运行应用程序的发布版本。否则,如果任何进程可以将代码注入任何其他进程,那将是一个安全漏洞。