2017-11-18 5 views
-1

dllから私の作成したウィンドウにKeyboardProcをdll注入を使って接続したいと思っています。フォーカスされた注入ウィンドウでキーを押すとメッセージボックスが表示されますが、コードが正常に動作しません。Dllプロセスフックが機能していません

注入窓コード:

#include <windows.h> 
#include <iostream> 

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (lParam) 
    { 
    default: 
     return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszArgs, int nCmdShow) 
{ 
    HWND hwnd; 
    LPCTSTR className = L"WNDCLASS"; 
    LPCTSTR windowName = L"Window"; 

    WNDCLASSEX wcex; 
    memset(&wcex, 0, sizeof(wcex)); 

    wcex.cbSize = sizeof(wcex); 
    wcex.hInstance = hInstance; 
    wcex.lpszClassName = className; 
    wcex.style = CS_DBLCLKS; 
    wcex.lpfnWndProc = WndProc; 
    wcex.hbrBackground = CreateSolidBrush(RGB(255, 255, 255)); 

    if (!RegisterClassEx(&wcex)) 
    { 
     return -1; 
    } 

    hwnd = CreateWindowEx(NULL, className, windowName, WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL); 

    if (!hwnd) 
    { 
     return -2; 
    } 

    MSG msg; 

    ShowWindow(hwnd, SW_NORMAL); 
    UpdateWindow(hwnd); 

    while (GetMessage(&msg, hwnd, 0, 0) > 0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    return 
     msg.lParam; 
} 

DLLコード:

// dllmain.cpp : Defines the entry point for the DLL application. 
#include "stdafx.h" 
#include <iostream> 
#include <Windows.h> 
#include <TlHelp32.h> 
#include <tchar.h> 

HHOOK hhkKb; 

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if (wParam == WM_KEYDOWN) 
    { 
     MessageBox(0, L"DOWN", L"keyboard key down in dll", MB_ICONINFORMATION); 
    } 
    else if (wParam == WM_KEYUP) 
    { 
     MessageBox(0, L"UP", L"keyboard key up in dll", MB_ICONINFORMATION); 
    } 

    return 
     CallNextHookEx(hhkKb, nCode, wParam, lParam); 
} 

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    switch (ul_reason_for_call) 
    { 
     case DLL_PROCESS_ATTACH: 
     { 
      HWND windowHandle = FindWindow(NULL, L"Window"); 

      if (windowHandle == NULL) 
      { 
       MessageBox(NULL, L"Error", L"Handle is null", MB_ICONERROR); 
       return TRUE; 
      } 

      DWORD threadId = GetWindowThreadProcessId(windowHandle, NULL); 
      hhkKb = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hModule, threadId); 
      MessageBox(NULL, L"Success", L"Sucessfully injected dll", MB_ICONINFORMATION); //shows that message 

      break; 
     } 
     case DLL_PROCESS_DETACH: 
     { 
      UnhookWindowsHookEx(hhkKb); 
      break; 
     } 
    } 
    return TRUE; 
} 

私はメッセージ "Sucessfullyは、DLLを注入された" が、私は注入されたウィンドウにキーを押していたときに、KeyboardProcが呼び出されない参照、私は間違って何をしているのですか?

答えて

1

あなたはこのDLLインジェクションを行うが、あなたの前のquestionに基づいてどのようにDLLインジェクション

不明確を使用すると、手動LoadLibraryACreateRemoteThreadして、DLLを注入することを想定することができます。いずれにしても、dllエントリポイントからのSetWindowsHookExコールは意味的にエラーです。

正式にスレッドの場合、SetWindowsHookEx出口 - フックが自動的に削除されます。出口スレッド間接呼び出しではUnhookWindowsHookExと言えるでしょう。あなたはからdbgprint閲覧できることを確認して、この明確に文書化されていますが、(この変形が選択した場合は、「私を閉じて」またはあなたがMessageBoxW Lを閉じるまで)次の単にテスト

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    DbgPrint("%x>KeyboardProc(%x)\n", GetCurrentThreadId(), wParam); 

    return CallNextHookEx(0, nCode, wParam, lParam); 
} 

ULONG HookThread(PVOID threadId) 
{ 
    DbgPrint("%x>HookThread(%x)\n", GetCurrentThreadId(), (ULONG)(ULONG_PTR)threadId); 
    if (HHOOK hhk = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, (HINSTANCE)&__ImageBase, (ULONG)(ULONG_PTR)threadId)) 
    { 
     Sleep(10000);//10 sec 
     //MessageBoxW(0,0,L"Close Me", MB_ICONWARNING); 
    } 
    return 0; 
} 

void test() 
{ 
    if (HANDLE hThread = CreateThread(0, 0, HookThread, (PVOID)(ULONG_PTR)GetCurrentThreadId(), 0,0)) 
    { 
     CloseHandle(hThread); 
     MessageBoxW(0,0,L"Press Buttons here", MB_ICONINFORMATION); 
    } 
} 

最初の数秒で表示することができません最初のメッセージボックスのボタンを押すと、KeyboardProcが表示されます。 HookThread終了後 - これ以上KeyboardProcが呼び出されません。

あなたはCreateRemoteThread経由でDLLを注入場合はそう - このスレッドの呼び出しLoadLibraryを、そしてSetWindowsHookExはこのスレッドで呼び出され、最終的にはちょうど終了スレッド - これはコールSetWindowsHookExの影響を取り除く - フックは削除されます。

ただし、SetWindowsHookExを使用する場合は、手動で処理するDLLを挿入する必要はありません。 visa versa - リモートプロセスに自動的にdllを注入するためのこのapi特別設計。もちろん、SetWindowsHookExをdllエントリポイントから呼び出さないでください。これはナンセンスです。リモートプロセスからSetWindowsHookExを呼び出す必要があります。その結果、dllがターゲットプロセスに注入されます。再読Installing and Releasing Hook Procedures

関連する問題