2016-02-26 3 views
0

Я пишу программу, которая контролирует нажатия клавиш целевого процесса с использованием SetWindowsHookEx. (IDE: Visual Studio 2013) Вот краткий обзор моей программы:Включение программы SetWindowsHookEx в режиме деблокирования, но работало в режиме отладки

  1. Получить HWND целевого процесса с использованием FindWindow().
  2. Если HWND действительно, получить идентификатор процесса с помощью GetWindowThreadProcessId()
  3. Получить идентификатор потока путем обхода списка потоков с CreateToolhelp32Snapshot(TH32CS_THREAD)
  4. Зов 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

Когда вы говорите «в режиме отладки» - означает ли это, что вы отлаживаете внутри VS? Если это так, я предполагаю, что проблема может быть в наборе разрешений - вы можете запускать VS с повышенными разрешениями или под другим пользователем/группой. Попробуйте запустить версию версии приложения в режиме администратора. В противном случае это был бы недостаток безопасности, если какой-либо процесс может вводить код в любой другой процесс.

+0

Это комментарий, а не ответ. –

+0

Я не перезапускал свою визуальную студию, поэтому разрешения для обоих режимов одинаковы. Плюс я просто дважды проверял: я все время работаю в режиме администратора, поэтому разрешение, безусловно, не проблема. –

+0

Я хотел бы прокомментировать, но у меня нет 50 репутации, чтобы сделать это –

Смежные вопросы