SetWindowsHookEx - Dll注入错过了前几个调用

4
我试图使用SetWindowsHookEx来捕获java.dll中API的调用。因此,我创建了另一个dll,并使用setwindowsHookEx将其注入到所有其他进程中。g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, JLoadSetFunc, g_hHookDll, 0)。问题如下:当尝试从进程中捕获调用时,我注意到我的dll在已经执行了几次钩子函数调用之后才附加到该进程上。所以问题是我的钩子机制错过了被钩住API的前几个调用。请指导或评论这个问题。我对这个问题感到非常困扰。

当进程的主线程通过窗口过程接收到消息时,dll 就会被加载。如果这发生在调用你要监视的函数之后,你将会错过一些调用。请尝试访问 http://newgre.net/ninjectlib。 - newgre
以上问题有解决方案吗?您以前使用过ninjectlib吗?它稳定吗? - Akash
你的 DllMain 函数是否在你所引用的函数之后被调用?否则,你应该能够在 DllMain 中钩取/重写 IAT。你注入 DLL 的进程是否在目标进程之后启动? - AppDeveloper
3个回答

3
我建议如下操作:
  1. 使用SetWindowsHookEx()注册你的钩子
  2. 向远程进程发送一条只有你的钩子能理解的特殊消息,使用SendMessage()
  3. 重复上述步骤,直到你的钩子回复
  4. 调用你想要与你的钩子交互的代码
简而言之,在尝试使用钩子之前,请等待钩子安装完成。

1

@MSalters

一个小修正:并不是加载到每个进程中 - 它只被加载到导入/使用user32.dll的进程中,而不是所有进程都使用它(但我同意大多数进程都会使用它)。

有关更多详细信息,请参见使用AppInit_DLLs注册表值


0

有一个非常不正规的方法可以使用注册表键将DLL加载到每个进程中:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs


如果我没记错的话,这在Vista中已被禁用。 - Anders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接