DebugProc中DEBUGHOOKINFO的成员idThread值总是为当前线程ID

songsu 2011-11-25 08:02:35
下面的代码中debug->idThread的值总是固定不变。
我用SPY++查看时居然也没有变,非常奇怪。
如果是 WH_CALLWNDPROC类型的HOOK,可以检查到目标窗口改变了。现在的问题是如何在DebugProc中得到目标窗口。

LRESULT CALLBACK DebugProc(int nCode, WPARAM wParam, LPARAM lParam) //WH_DEBUG钩子例程
{
DEBUGHOOKINFO *debug=(DEBUGHOOKINFO *)lParam;
//防止键盘被监听
if(debug->idThread!=debug->idThreadInstaller && wParam== WH_KEYBOARD)
{
return 1;
}

return ::CallNextHookEx(DEBUG_hhook, nCode, wParam ,lParam);
}

BOOL APIENTRY DllMain( HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
handle = hModule;
return TRUE;
}

bool WINAPI InstallHook()
{
DEBUG_hhook =::SetWindowsHookEx(WH_DEBUG,(HOOKPROC)DebugProc,handle, NULL);
if(DEBUG_hhook == NULL)
return false;
return true;
}

bool WINAPI UnInstallHook()
{
UnhookWindowsHookEx(DEBUG_hhook);
return true;
}
...全文
153 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
moling126 2012-05-28
  • 打赏
  • 举报
回复
idThread貌似是当前安装WH_DEBUG钩子的线程ID, 你应该用DEBUGHOOKINFO的第二个成员,但是他在windowsNT之后就是一个定值了。呃……我是个新手,也不知道对不对
songsu 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhanshen2891 的回复:]

可以判断啊,你那个DebugProc是在有钩子事件发生的时候才被响应的,并不是一安装钩子就响应。

if(debug->idThread!=debug->idThreadInstaller && wParam== WH_KEYBOARD)
你这个判断是需要有键盘钩子事件发生才有效果,所以你可以这样测试,你在这个if里面加个MessageBox,用SPY察看消息,在你安装了……
[/Quote]

感谢回复,是我搞错了,SPY++不是通过键盘钩子来截取的消息。我是说怎么一直不正确呢。呵呵,结帖。
zhanshen2891 2011-11-25
  • 打赏
  • 举报
回复
可以判断啊,你那个DebugProc是在有钩子事件发生的时候才被响应的,并不是一安装钩子就响应。

if(debug->idThread!=debug->idThreadInstaller && wParam== WH_KEYBOARD)
你这个判断是需要有键盘钩子事件发生才有效果,所以你可以这样测试,你在这个if里面加个MessageBox,用SPY察看消息,在你安装了debug hook的程序上用键盘输入,你就会发现你那个MessageBox弹出来了。我保证这是好用的。
oyljerry 2011-11-25
  • 打赏
  • 举报
回复
idThread
Type: DWORD
A handle to the thread containing the filter function.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644965(v=vs.85).aspx
songsu 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 alfacuton 的回复:]
不是很明白 你的意思..
[/Quote]
简单点说就是如果其它的线程(例如木马程序)安装了一个HOOK用来监听用户在我的程序中输入的密码,这时用户在我的程序中输入了一个字符,那么我程序中的HOOK应该能够拦截到发送到其它的程序中的消息,理论上是在DebugProc中根据debug->idThread来判断消息发到哪里去。但是现在在DebugProc中debug->idThread总是为我自已线程的ID,这样我就没办法判断消息是否会发到别的程序中。

我用SPY++做了一个实验,如果在WH_CALLWNDPROC中是可以判断消息会发到SPY++窗口。为什么DebugProc却无法判断,有点奇怪。
alpha.5 2011-11-25
  • 打赏
  • 举报
回复
不是很明白 你的意思..
songsu 2011-11-25
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 happyparrot 的回复:]
你要捕捉什么啊?
[/Quote]
我的目的主要是为了防止别的线程监听到当前程序的键盘输入。

上面的描述可能有点不准确。在调试中发现debug->idThread的值一直不变,理论上我用SPY++工具监听到程序的消息时,debug->idThread应该会变为SPY++的线程ID才对。
快乐鹦鹉 2011-11-25
  • 打赏
  • 举报
回复
你要捕捉什么啊?
alpha.5 2011-11-25
  • 打赏
  • 举报
回复

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧