鱼C论坛

 找回密码
 立即注册
查看: 5295|回复: 5

为什么hook 要在dll中,不理解?

[复制链接]
发表于 2012-10-3 22:24:51 | 显示全部楼层 |阅读模式
1鱼币
为什么不能这样:
LRESULT CALLBACK Gameproc(
                                                  int code,       // hook code
                                                  WPARAM wParam,  //按键代码 =VK_F12 VK_HOME
                                                  LPARAM lParam   // 31位为0 则是被按下
                                                  )
{
//比如说 按下VK_HOME
if ((wParam==VK_HOME)&&((lParam&(1<<31))==0))
{
                AfxMessageBox("按下Home键");
       
       
}
return CallNextHookEx(0,code,wParam,lParam);
}
#define GameCaption "有道词典"
void CMFC_hookDlg::OnButton1() //按钮被按下时 执行hook函数
{
       
        HWND h=::FindWindow(NULL,GameCaption);
        DWORD tid=::GetWindowThreadProcessId(h,0);
   ::SetWindowsHookEx(WH_KEYBOARD,&Gameproc,NULL,tid);

       
}

在自己编写的程序中,安装hook函数为什么不能得到想要的结果,在这题就是 为什么在 有道词典中 按下home键时  没有任何响应呢,而把 hook放在dll中 然后 我们再调用这个dll中的函数 就能得到 为什么呢??不明白啊,这里 不也是在 有道词典这个程序中安装了hook函数吗 为什么就不能勾到呢??求解答

最佳答案

查看完整内容

我也正在学习关于HOOK的知识,给你一段我学的书中的内容吧 “钩子分为局部钩子和全局钩子,局部钩子是针对一个线程的,而全局钩子则是针对整个操作系统内基于消息机制的应用程序的。全局钩子需要使用DLL文件,DLL文件里存放了钩子函数的代码。 “在操作系统中安装了全局钩子以后,只要进程接收到可以发出钩子的消息后,全局钩子的DLL文件会被操作系统自行或强行地加载到该进程中。由此可见,设置消息钩子也是一种可以进行DLL注入 ...
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-10-3 22:24:52 | 显示全部楼层
我也正在学习关于HOOK的知识,给你一段我学的书中的内容吧
“钩子分为局部钩子和全局钩子,局部钩子是针对一个线程的,而全局钩子则是针对整个操作系统内基于消息机制的应用程序的。全局钩子需要使用DLL文件,DLL文件里存放了钩子函数的代码。
“在操作系统中安装了全局钩子以后,只要进程接收到可以发出钩子的消息后,全局钩子的DLL文件会被操作系统自行或强行地加载到该进程中。由此可见,设置消息钩子也是一种可以进行DLL注入的方法”
我的理解是:如果不写成DLL文件,HOOK就只在你自己的程序里起作用,跟外界是隔绝的,其他程序中的操作根本无法影响HOOK函数。而使用DLL之后,DLL文件被加载到其他程序中,其他程序消息处理时才能调用你的HOOK函数,这样,你在其他程序中的操作才能被拦截,并发送给你自己的程序
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-3 23:15:33 | 显示全部楼层
全局hook必须要在dll中吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-4 01:03:55 | 显示全部楼层
我想这是出于系统安全考虑。调用hook的动态链接库,会被360监控。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-10-4 08:57:07 | 显示全部楼层

意思是 不写成dll只能hook自己 不能hook其它任何程序是吗??但是操作系统为什么要这样啊?SetWindowsHookEx()函数 只要里面填写的是其它进程的id 就能在其它进程中安装hook该多好啊,而且也易于理解吗,进程id是谁的,就在谁那安装了钩子??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2012-10-4 10:02:42 | 显示全部楼层
你自己程序的消息队列与其他程序的消息队列是独立的,在其他程序中的操作会进入其对应的消息队列,你在自己的程序内写的函数只能影响你自己的消息队列,即使有其他程序的句柄,你在其他程序中的操作也只会进入其他程序的消息队列,对你的程序没有影响
使用了DLL之后就把两个程序联系起来了,其他程序中的操作通过DLL中的函数发送消息给自己的程序
其实在程序里写函数应该也是可能的,不过微软应该不想让这实现,会降低安全性
个人理解,可能会有些错误
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-11 00:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表