【问题标题】:SetWindowsHookEx not injecting DLLSetWindowsHookEx 不注入 DLL
【发布时间】:2014-10-17 07:01:08
【问题描述】:

我要做的就是将我的 DLL 注入到其他一些程序中(在进程创建时)并让它执行 DllMain 函数。 不幸的是,无论我尝试什么代码,它都无法正常工作。

例如,我有这个代码:http://pastebin.com/P4NzLb3X 基本上它只是使用 SetWindowsHookEx 来安装键盘挂钩。 然而,使用 Process Hacker 检查显示 DLL 从未真正注入任何进程。 :(

我已经搜索了一整天的解决方案。我该如何解决这个问题?

【问题讨论】:

  • 您的代码会写入状态消息。您看到的是哪条消息?
  • @Logicrat 这些:link(即一切顺利)
  • 无缘无故的反对,但实际上有人能够回答这个相当重要的问题吗?!
  • 只有将焦点放在相同位数的 GUI 程序上,然后按一个键,才会发生注入。
  • 如果程序死机,显然某事正在发生。使用进程监视器(可从 MS 网站获得)来确认 DLL 是否正在加载,或者最好还是使用调试器来查看究竟发生了什么。您可以通过仅挂钩特定线程或将正在调试的程序(和挂钩程序)放在单独的桌面上来避免破坏调试器;挂钩特定线程会更简单。

标签: c++ windows dll hook inject


【解决方案1】:

我通过这两个链接解决了这个问题:

http://www.gamedev.net/topic/568401-problem-with-loading-dll--setwindowshookex/

Global Keyhook on 64-Bit Windows

需要修复 3 件事:

  • 为 DLL 添加一个 .def 文件并在那里使用导出,因为 Visual Studio 显然喜欢使用 extern "C" __declspec(dllexport) int 进行奇怪的名称修改 - 这可以修复 32 位进程上的 DLL 加载
  • CALLBACK 属性添加到函数 (extern "C" int CALLBACK meconnect(...)) - 这修复了在上述修复后发生在 32 位进程上的崩溃。
  • 像这样在宿主进程(调用SetWindowsHookEx函数的进程)中添加一个消息循环:

    MSG msg;
    while(1) {
        // Keep pumping...
        PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE);
        TranslateMessage(&msg);
        DispatchMessage(&msg);
        Sleep(10);
        SHORT v = GetKeyState(VK_RETURN);
        bool pressed = (v & 0x8000) != 0;
        if(pressed) 
            break;
    }
    

    这修复了 64 位进程中的冻结问题。

【讨论】:

  • 请注意,您的代码应该已经发现了第一个问题,因为它会检查 GetProcAddress 返回的 NULL。你为什么不提这个?另请注意,前两个问题不在您发布的代码中。
  • 我的代码没有发现第一个问题。我无法解释为什么我不了解自己,我认为这是 Visual Studio 中的某个错误。至于源代码,我向 OP 提供了 cmets 中 DLL 的源代码,因为我不相信它与问题有关(因为根据各种进程监视器,DLL 甚至从未打开,我天真地假设DLL 的东西从未被执行)。我只是错过了导出函数可能存在问题。
  • 我怀疑你在 Visual Studio 中发现了一个错误
  • 很好,那么这只是 Visual Studio 中的奇怪行为。然而,它显然不能很好地工作。显然,某些模块可以使用修饰函数,而更深或更晚的模块则说“不”。我可以很好地重现这个问题。如果您不将导出放入 .def 而是将 __declspec(dllexport) 属性放入您的函数,则结果将是“装饰的 C 函数”,它将由 GetProcAddress 正确识别/解析,但显然不是通过实际的注入函数(尽管该函数甚至不应该知道那个名字......)。
猜你喜欢
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 2020-08-08
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多