【问题标题】:SetWindowsHookEx - Dll Injection misses out on the first few callsSetWindowsHookEx - Dll 注入错过了前几次调用
【发布时间】:2010-11-02 23:05:48
【问题描述】:

我正在尝试使用 SetWindowsHookEx 来捕获对 java.dll 中 API 的调用。

所以我创建了另一个 dll,并使用 setwindowsHookEx 注入到所有其他进程中

g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, JLoadSetFunc, g_hHookDll, 0)

问题如下:

在尝试捕获来自进程的调用时,我注意到我的 dll 在已经执行了几次对挂钩函数的调用后附加到该进程。

所以问题是我的挂钩机制错过了挂钩 API 的前几次调用。

请对此问题提出建议或评论以指导我。 我被这个卡住了。

【问题讨论】:

  • 进程的主线程通过窗口过程接收到消息后立即加载dll。如果这发生在您要监视的函数被调用之后,您将错过一些调用。试试newgre.net/ninjectlib
  • 以上问题有解决办法吗?你以前用过ninjectlib吗?稳定吗?
  • 你的 DllMain 是在你所指的几个函数之后调用的吗?否则您应该能够在 Dll 主程序中挂钩/重新编写 IAT 您的注入 dll 的进程是否在目标进程之后启动?

标签: c++ winapi hook


【解决方案1】:

我建议如下:

  1. 使用 SetWindowsHookEx() 注册您的挂钩
  2. SendMessage() 向远程进程发送一条只有你的钩子才能理解的特殊消息
  3. 重复此操作,直到您的钩子回复
  4. 调用您希望钩子与之交互的代码

简而言之,请等待钩子完成安装后再尝试使用它。

【讨论】:

    【解决方案2】:

    @MSalters

    一点更正:不是每个进程 - 它仅加载到导入/使用 user32.dll 的进程,并且并非所有进程都使用它(但我同意大多数进程都使用它)。

    更多详情请见Working with the AppInit_DLLs registry value

    【讨论】:

      【解决方案3】:

      使用注册表项将 DLL 加载到每个进程中是一种非常肮脏的 hack:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs

      【讨论】:

      • IIRC 这已在 Vista 中被禁用
      猜你喜欢
      • 2014-10-17
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2013-10-20
      • 1970-01-01
      • 2020-08-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多