欢迎来到朵拉利品网
知识中心
资讯
  • 资讯
  • 产品
  • 供应商
您的位置: 朵拉利品网 >  知识中心 > hook钩子 HOOK钩子怎么用、专业人士来.
hook钩子 HOOK钩子怎么用、专业人士来.
2020-05-06 10:21:26 来源:朵拉利品网

1, HOOK钩子怎么用、专业人士来.



钩子函数属于回调函数的一个特例。钩子就是在正常的处理之前先获取该消息,并对该消息进行处理,钩子是有优先级的,类似与栈,最后注册的优先级最高。
钩子函数,举个例子吧,假设你设计了一个程序,它的关键模块是A模块,而A模块中的主要函数是a()函数,
由于这个模块会因为软件的升级需要更新一些功能,而你更新功能的时候又不希望A模块被完全的替换,这时可以采用这样的策略。
在A模块中定义一个函数指针,void(*a)(void);
在调用a()函数的地方使用这样的语句:
if(a) a();
在B模块中实现具体的功能,并且在B模块初始化的时候讲外部定义的函数指针a赋初值,这样当a模块需要更新的时候只要改变B模块中的定义就可以了。
归纳一下:钩子函数就是在真正的模块中只是一个函数指针,而这个指针的赋值是再其它模块中实现的。

2, 系统钩子是什么??



从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前处理些Windows消息。
例子:有一个Form,Form里有个TextBox,我们想让用户在TextBox里输入的时候,不管敲键盘的哪个键,TextBox里显示的始终为“A”,这时我们就可以利用钩子监听键盘消息,先往Windows的钩子链表中加入一个自己写的钩子监听键盘消息,只要一按下键盘就会产生一个键盘消息,我们的钩子在这个消息传到TextBox之前先截获它,让TextBox显示一个“A”,之后结束这个消息,这样TextBox得到的总是“A”。
消息截获顺序:既然是截获消息,总要有先有后,钩子是按加入到钩子链表的顺序决定消息截获顺序。就是说最后加入到链表的钩子最先得到消息。
截获范围:钩子分为线程钩子和全局钩子,线程钩子只能截获本线程的消息,全局钩子可以截获整个系统消息。我认为应该尽量使用线程钩子,全局钩子如果使用不当可能会影响到其他程序

3, 安装全局钩子和HOOK有什么区别?



WINDOW下可进行挂接的过滤函数有
WH_CALLWNDPROC,WH_CBT ,WH_DEBUG,WH_GETMESSAGE ,
WH_HARDWARE ,WH_JOURNALPLAYBACK ,
WH_JOURNALRECORD ,WH_MOUSE ,
WH_MSGFILTER ,WH_SYSMSGFILTER ,
WH_KEYBOARD
键盘过滤函数 WH_KEYBOARD 是最常用最有用。
利用函数SetWindowsHookEx()将其挂接在函数链首。
拦+截到消息是否传递给函 数链的下一个函数是由每个具体函数功能确定,用API函数的CallNextHookEx()来传递。
挂接函数是全局的,那么必须将其放在一个.DLL 动态链接库中。
键盘挂钩函数为例:
int FAR PASCAL KeyboardProc( int nCode,WORD wParam,DWORD lParam)
其中KeyboardProc为定义挂接函数名,该函数必须在模块定义文件中利用 EXPORTS命 令进行说明;nCode决定挂接函数是否对当前消息进行处理;wParam和lParam为具体 的消息内容。
卸钩 调用一次 UnhookWindowsHookEx(iProc)
动态链接库调用有3种方法。
1.在DEF定义文件中直接用函数名或序号说明:
EXPORTS WEP @1 RESIDENTNAME InitHooksDll
@2 InstallFilter
@3 KeyboardProc
@4
用序号说明格式为:链接库名.函数名(如本例中说明方法为KEYDLL.KeyboardProc)。
2.在应用程序中利用函数直接调用:
首先在应用程序中利用LoadLibrary(LPSTR "链接库名")将动态链接库装入,并取得 装载库模块句柄hInst,
然后直接利用GetProcAddress(HINSTANCE hInst,LPSTR "函 数过程名")获取函数地址,然后直接调用该地址即可,
程序结束前利用函数 FreeLibrary( )释放装入的动态链接库即可。
3.利用输入库.LIB方法 利用IMPLIB.EXE程序在建立动态链接库的同时建立相应的输入库.LIB,然后直接在 项目文件中增加该输入库。
打字 太麻烦了,不写了。。。。

名词解释


WH

Wh一般表示新西兰毛利语的一个字母,代表着/f/音。英文中,其表示简写,如White House。

函数

函数(function)在数学中为两不为空集的集合间的一种对应关系:输入值集合中的每项元素皆能对应唯一一项输出值集合中的元素。 其定义通常分为传统定义和近代定义,前者从运动变化的观点出发,而后者从集合、映射的观点出发。其近代定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示。函数概念含有三个要素:定义域A、值域C和对应法则f。