hook怎么工作?

chenxs03 2010-06-06 05:42:52
用hook一定要写成dll吗?
不太理解hook的工作原理。
KEYBOARD是把一切键盘操作都拦截下来吗?
我的程序好像不行呀。

HHOOK glhHook=NULL;
HINSTANCE glhInstance=NULL;

LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
glhInstance = hInstance;
Manager* manager = new Manager;
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInstance,0);
manager->MainLoop();//这里就是一个死循环。
return 1;
}

LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
...全文
207 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
chaosfun 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mydo 的回复:]

引用 13 楼 chaosfun 的回复:

必须把HOOK程序做成DLL的形式,因为全局注册实际上是把这个DLL注入到所有的系统进程中去。


完全错误。

1 一些底层系统hook由NT内核负责进程间的切换处理,不需要DLL

2 进入RING 0 之后,你可以分配一片全局的page,然后映射到user层,
这样所有进程都会flush该视图。

3 你可以关闭系统……
[/Quote]

拜托,你没看他现在用的是SetWindowsHook吗?
当然,你可以把你那些牛x的办法都贴给楼主。
大熊猫侯佩 2010-06-08
  • 打赏
  • 举报
回复
用hook的方法多了去了,不必局限于SDK中的HOOK方法。

广义来说,只要是可以实现的hook的一切方法,都可以称为钩子。
大熊猫侯佩 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 chaosfun 的回复:]

必须把HOOK程序做成DLL的形式,因为全局注册实际上是把这个DLL注入到所有的系统进程中去。
[/Quote]

完全错误。

1 一些底层系统hook由NT内核负责进程间的切换处理,不需要DLL

2 进入RING 0 之后,你可以分配一片全局的page,然后映射到user层,
这样所有进程都会flush该视图。

3 你可以关闭系统的W-On-W机制,这样hook系统dll会在全局中生效
chaosfun 2010-06-08
  • 打赏
  • 举报
回复
你先写一个DLL,把SetWindowsHook封装到一个注册函数里,然后,写一个程序加载这个DLL并调用注册函数。
chaosfun 2010-06-08
  • 打赏
  • 举报
回复
必须把HOOK程序做成DLL的形式,因为全局注册实际上是把这个DLL注入到所有的系统进程中去。
hzy694358 2010-06-08
  • 打赏
  • 举报
回复
SetWindowsHookEx

全局的钩子要用dll
不是全局的可以不用
nodiebirdcomeback 2010-06-06
  • 打赏
  • 举报
回复
新安装的钩子一直处于最前的位置,
系统在处理的使用必然先调用该钩子,
可以在该钩子函数里,处理有些东西,
如果想让这些东西可以被后面的钩子使用
可以在钩子处理完成后,调用CallNextHookEx(glhHook,nCode,wParam,lParam);
如果想把它拦截下来,就直接返回,没必要调用CallNextHookEx(glhHook,nCode,wParam,lParam);
wltg2001 2010-06-06
  • 打赏
  • 举报
回复
manager->MainLoop();//这里就是一个死循环。
==========
原来你上面这个里面不是消息循环啊?你这个不是全局钩子,只是针对本进程的钩子,没有消息循环,没办法工作啊
chenxs03 2010-06-06
  • 打赏
  • 举报
回复
我也搞不清为什么:
如果我new了windows窗口,又写了
while(1)
{
if(GetMessage(&msg,NULL,0,0))
{
}
}
hook 就能工作了。
不明白hook是从那里把消息截出来的
wltg2001 2010-06-06
  • 打赏
  • 举报
回复
你执行完了之后,进程结束了吗?
csl312211865 2010-06-06
  • 打赏
  • 举报
回复
MSDN里这么解释的:
You must place a global hook procedure in a DLL separate from the application installing the hook procedure.The installing application must have the handle to the DLL module before it can install the hook procedure. To retrieve a handle to the DLL module, call the LoadLibrary function with the name of the DLL. After you have obtained the handle, you can call the GetProcAddress function to retrieve a pointer to the hook procedure. Finally, use SetWindowsHookEx to install the hook procedure address in the appropriate hook chain. SetWindowsHookEx passes the module handle, a pointer to the hook-procedure entry point, and 0 for the thread identifier, indicating that the hook procedure should be associated with all threads in the same desktop as the calling thread. This sequence is shown in the following example.
chenxs03 2010-06-06
  • 打赏
  • 举报
回复
LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
MessageBox(NULL,"???", "???",MB_YESNO|MB_ICONQUESTION);
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
还是没反应
黑色队长 2010-06-06
  • 打赏
  • 举报
回复
你这个不是底层钩子!只能钩到你程序窗口的按键消息。
我csdn blog上有篇关于 写底层键盘钩子(全局键盘钩子)需要了解的一些东西和winio的使用。

至于要不要写在dll我就是在不清楚了。当初我也存在这个疑问呢!当时在dll上写完就算了..都没有在主程序写全局钩子来试试...楼主先试试写在dll吧.我和你一样在等高手来解惑.
wltg2001 2010-06-06
  • 打赏
  • 举报
回复
你在LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}里面用MessageBox弹出个对话框不就知道有没有成功了
chenxs03 2010-06-06
  • 打赏
  • 举报
回复
glhHook = SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,hInstance,0);
这句的意思是只要按键盘就调用KeyboardProc吧
我在调试的时候按了键盘,结果直接在代码行打了几个字
chenxs03 2010-06-06
  • 打赏
  • 举报
回复
我在
return CallNextHookEx(glhHook,nCode,wParam,lParam);
设置了断点,但是按键盘后没到这里
soswaidao 2010-06-06
  • 打赏
  • 举报
回复
LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
什么都没做
csl312211865 2010-06-06
  • 打赏
  • 举报
回复
LRESULT WINAPI KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
return CallNextHookEx(glhHook,nCode,wParam,lParam);
}
你什么工作也没做,当然不行了。。

15,471

社区成员

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

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