2024年10月windows钩子(键盘钩子怎么 使用)

 更新时间:2024-10-12

  ⑴windows钩子(键盘钩子怎么使用

  ⑵I:设置钩子设置钩子是通过SetWindowsHookEx()的API函数.原形:HHOOKSetWindowsHookEx(intidHook,HOOKPROClpfn,HINSTANCEhMod,DWORDdwThreadId)idhook:装入钩子的类型.lpfn:钩子进程的入口地址hMod:应用程序的事件句柄dwThreadId:装入钩子的线程标示参数:idHook:这个参数可以是以下值:WH_CALLWNDPROC、WH_CALLWNDPROCRET、WH_CBT、WH_DEBUG、WH_FOREGROUNDIDLE、WH_GETMESSAGE、WH_JOURNALPLAYBACK、WH_JOURNALRECORD、WH_KEYBOARD、WH_KEYBOARD_LL、WH_MOUSE、WH_MOUSE_LL、WH_MSGFILTER、WH_SHELL、WH_SYSMSGFILTER。对于这些参数,我不想一一加以解释,因为MSDN中有关于他们的详细注解。我只挑选其中的几个加以中文说明。WH_KEYBOARD:一旦有键盘敲打消息(键盘的按下、键盘的弹起,在这个消息被放在应用程序的消息队列前,WINDOWS将会调用你的钩子函数。钩子函数可以改变和丢弃键盘敲打消息。WH_MOUSE:每个鼠标消息在被放在应用程序的消息队列前,WINDOWS将会调用你的钩子函数。钩子函数可以改变和丢弃鼠标消息。WH_GETMESSAGE:每次当你的应用程序调用一个GetMessage()或者一个PeekMessage()为了去从应用程序的消息队列中要求一个消息时,WINDOWS都会调用你的钩子函数。而钩子函数可以改变和丢弃这个消息。II:释放钩子钩子的释放使用的是UnhookWindowsHookEx(函数原形:BOOLUnhookWindowsHookEx(HHOOKhhk)UnhookWindowsHookEx(函数将释放的是钩子链中函数SetWindowsHookEx所装入的钩子进程。hhk:将要释放的钩子进程的句柄。III:钩子进程钩子进程使用函数HookProc;其实HookProc仅仅只是应用程序定义的符号。比如你可以写成KeyBoardHook.但是参数是不变的。WinAPI提供了诸如:CallWndProc、GetMsgProc、DebugProc、CBTProc、MouseProc、KeyboardProc、MessageProc等函数,对于他们的详细讲解,可以看MSDN我在此只讲解一下KeyBoardHook的含义。原形:LRESULTCALLBACKKeyBoardHook(intnCode,WPARAMwParam,LPARAMlParam)说明:钩子进程是一些依附在一个钩子上的一些函数,因此钩子进程只被WINDOWS调用而不被应用程序调用,他们有时就需要作为一个回调函数(CALLBACK。参数说明:nCode:钩子代码,钩子进程使用钩子代码去决定是否执行。而钩子代码的值是依靠钩子的种类来定的。每种钩子种类都有他们自己一系列特性的代码。比如对于WH_KEYBOARD,钩子代码的参数有:HC_ACTION,HC_NOREMOVE。HC_ACTION的意义:参数wParam和lParam包含了键盘敲打消息的信息,HC_NOREMOVE的意义:参数wParam和lParam包含了键盘敲打消息的信息,并且,键盘敲打消息一直没有从消息队列中删除。(应用程序调用PeekMessage函数,并且设置PM_NOREMOVE标志)。也就是说当nCode等于HC_ACTION时,钩子进程必须处理消息。而为HC_NOREMOVE时,钩子进程必须传递消息给CallNextHookEx函数,而不能做进一步的处理,而且必须有CallNextHookEx函数的返回值。wParam:键盘敲打所产生的键盘消息,键盘按键的虚拟代码。lParam:包含了消息细节。注意:如果钩子进程中nCode小于零,钩子进程必须返回(return)CallNextHookEx(nCode,wParam,lParam);而钩子进程中的nCode大于零,但是钩子进程并不处理消息,作者推荐你调用CallNextHookEx并且返回该函数的返回值。否则,如果另一个应用程序也装入WH_KEYBOARD钩子,那么该钩子将不接受钩子通知并且返回一个不正确的值。如果钩子进程处理了消息,它可能返回一个非零值去阻止系统传递该信息到其它剩下的钩子或者windows进程。所以最好在钩子进程的最后都返回CallNextHookEx的返回值。IV:调用下一个钩子函数调用下一个钩子函数时使用CallNexHookEx函数。原形:LRESULTCallNextHookEx(HHOOKhhk,intnCode,WPARAMwParam,LPARAMlParam)CallNexHookEx()函数用于对当前钩子链中的下一个钩子进程传递钩子信息,一个钩子进程既可以在钩子信息处理前,也可以在钩子信息处理后调用该函数。为什么使用该函数已在iii钩子进程中的“注意”中,加以了详细的说明。hhk:当前钩子的句柄nCode:传送到钩子进程的钩子代码。wParam:传送到钩子进程的值。lParam:传送到钩子进程的值。参数:hhk:当前钩子的句柄.应用程序接受这个句柄,作为先前调用SetWindowsHookE函数的结果nCode:传送到钩子进程的钩子代码,下一个钩子进程使用这个代码以此决定如何处理钩子信息wParam:传送给钩子进程的wParam参数值,参数值的具体含义与当前钩子链的挂接的钩子类型有关lParam:传送给钩子进程的wParam参数值,参数值的具体含义与当前钩子链的挂接的钩子类型有关返回值:返回值是链中下一个钩子进程返回的值,当前钩子进程必须返回这个值,返回值的具体含义与挂接的钩子类型有关,详细信息请参看具体的钩子进程描述。V建立一个动态连接库(DLL当我们熟悉了以上的各个函数后,现在我们开始编写一个动态连接库(DLL。在这儿我采用的是WINDLL,而不是MFCDLL。而且以下所有的程序也都是采用C语言去编写。这主要是因为使用WINAPI能够更详细、更全面的控制程序的如何执行,而使用MFC,一些低级的控制是不可能实现的(当然,仅对该程序来说,也是可以使用MFC的)。:建立一个动态连接库的.cpp文件。比如我们现在建立一个名为hookdll.cpp的文件。在hookdll.cpp的文件中加上如下内容:#include《windows.h》#include“string.h“#include“stdio.h“HINSTANCEhInst;#pragmadata_seg(“hookdata“)HHOOKoldkeyhook=;#pragmadata_seg()#pragmament(linker,“/SECTION:hookdata,RWS“)#defineDllExportextern“C“__declspec(dllexport)DllExportLRESULTCALLBACKKeyBoardProc(intnCode,WPARAMwParam,LPARAMlParam);DllExportvoidInstallHook(intnCode);DllExportvoidEndHook(void);BOOLWINAPIDllMain(HINSTANCEhInstance,ULONGWhat,LPVOIDNotUsed){switch(What){caseDLL_PROCESS_ATTACH:hInst=hInstance;break;caseDLL_PROCESS_DETACH:break;caseDLL_THREAD_ATTACH:break;caseDLL_THREAD_DETACH:break;}return;}voidInstallHook(intnCode){oldkeyhook=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyBoardProc,hInst,);}DllExportLRESULTCALLBACKKeyBoardProc(intnCode,WPARAMwParam,LPARAMlParam){WPARAMj;FILE*fp;if(lParam&x){j=wParam;fp=fopen(“c:hookkey.txt“,“a“);fprintf(fp,“%d“,j);fclose(fp);}returnCallNextHookEx(oldkeyhook,nCode,wParam,lParam);}voidEndHook(void){UnhookWindowsHookEx(oldkeyhook);}这个动态连接库的源代码hookdll.cpp包含了键盘处理函数,设置钩子,退出钩子函数。并将键盘敲下的键以值的格式存入到c:hookkey.txt文件中。以下是对该文件的详细的解释。使用包含在DLL的函数,必须将其导入。导入操作时通过dllimport来完成的,dllexport和dllimport都是vc(visualC++和bc(BorlandC++所支持的扩展的关键字。但是dllexport和dllimport关键字不能被自身所使用,因此它的前面必须有另一个扩展关键字__declspec。通用格式如下:__declspec(specifier)其中specifier是存储类标示符。对于DLL,specifier将是dllexport和dllimport。而且为了简化说明导入和导出函数的语句,用一个宏名来代替__declspec.在此程序中,使用的是DllExport。如果用户的DLL被编译成一个C++程序,而且希望C程序也能使用它,就需要增加“C”的连接说明。#defineDllExportextern“C“__declspec(dllexport),这样就避免了标准C++命名损坏。(当然,如果读者正在编译的是C程序,就不要加入extern“C”,因为不需要它,而且编译器也不接受它。有了宏定义,现在就可以用一个简单的语句就可以导出函数了,比如:DllExportLRESULTCALLBACKKeyBoardProc(intnCode,WPARAMwParam,LPARAMlParam);DllExportvoidInstallHook(intnCode);DllExportvoidEndHook(void);第一个#pragma语句创造数据段,这里命名为hookdata。其实也可以命名为您喜欢的任意的一个名称。#pragma语句之后的所有初始化的变量都进入hookdata段中。第二个#pragma语句是数据段的结束标志。对变量进行专门的初始化是很重要的,否则编译程序将把它们放在普通的未初始化的段中而不是放在hookdata中。但是链接程序必须直到有一个hookdata段。我们可以在ProjectSetting(vc.对话框中选择Link选项,选中HOOKDLL时在ProjectOptions域(在Release和Debug配置中均可,包含下面的连接语句:/SECTION:hookdata,RWS字母RWS是表明该段具有读、写、和共享属性。当然,您也可以直接用DLL源代码指定链接程序就像HOOKDLL.c那样:#pragmament(linker,“/SECTION:hookdata,RWS“)。由于有些DLL需要特殊的启动和终止代码。为此,所有的DLL都有一个名为DllMain()的函数,当初始化或终止DLL时调用该函数。一般在动态连结库的资源文件中定义此函数。不过如果没有定义它,则编译器会自动提供缺省的形式。原型为:BOOLWINAPIDllMain(HINSTANCEhInstance,ULONGWhat,LPVOIDNotUsed)参数:hInstance:DLL实例句柄What:指定所发生的操作NotUsed:保留参数其中What的值可以为以下值:DLL_PROCESS_ATTACH:进程开始使用DLLDLL_PROCESS_DETACH:进程正在释放DLLDLL_THREAD_ATTACH:进程已创建一个新的线程DLL_THREAD_DETACH:进程已舍弃了一个线程总的来说,无论何时调用DllMain()函数,都必须根据What的内容来采取适当的动作。这种适当的动作可以什么都不做,但不是返回非零值。DllMain()接下来的便是设置钩子,键盘处理,和释放钩子。:建立头文件正如应用程序所使用的其它任何库函数一样,程序也必须包含dll内的函数的原型。所有得Windows程序都必须包含windows.h的原因。所以我们现在建立一个头文件hookdll.h如下:#defineDllImportextern“C“__declspec(dllimport)DllImportvoidInstallHook(intnCode);DllImportLRESULTCALLBACKKeyBoardProc(intnCode,WPARAMwParam,LPARAMlParam);DllImportvoidEndHook(void);使用dllimport主要是为了使代码更高效,因此推荐使用它。但是在导入数据时是需要dllimport的。当完成了上面的程序后,建一个项目工程,不妨为hookdll,然后将hookdll.c插入导项目工程中,编译,则可以生成了hookdll.dll和hookdll.lib。:建立程序主文件我们在上面作的所有得工作都是为现在的主程序打得基础。其实当我们完成了Dll文件后,剩下的就是调用设置钩子函数:InstallHook。如果你对windows编程十分的熟悉,那么你可以在你任何需要的时候来调用InstallHook。但是在你必须记住在你退出程序的时候你需要调EndHook以便释放你所装入的钩子函数。现在我在建立了一个hookspy.cpp,并将生成好的hookdll.dll和hookdll.lib拷贝到从一个目录下,并建立一个hookspy的项目工程。将hookspy.cpp,hookdll.dll,hookdll.lib,hookdll.h插入到项目工程中去。然后在建立windows窗口时就将钩子设置,在退出程序时退出钩子函数。比如:caseWM_CREATE:InstallHook(TRUE);break;();PostQuitMessage();break;

  ⑶HOOK技术是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。

  ⑷钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

  ⑸/iknow-pic.cdn.bcebos./fdabcdafdfdd“target=“_blank“title=“点击查看大图“class=“ikqb_img_alink“》/iknow-pic.cdn.bcebos./fdabcdafdfdd?x-bce-process=image%Fresize%Cm_lfit%Cw_%Ch_%Climit_%Fquality%Cq_%Fformat%Cf_a

  ⑹windows中svn怎么配置钩子代码

  ⑺如果服务器端是windows环境的话,那么钩子实际就是批处理文件(扩展名bat这些钩子都存放在服务器端的hooks文件夹内,比较常用的钩子包括pre-mit.tmpl、post-mit.tmpl等,pre-mit.tmpl是当服务器端接收到mit请求的时候自动调用这个钩子,post-mit.tmpl是当完成mit操作的时候服务器端自动调用这个钩子,在windows环境下钩子程序的扩展名要改成bat,而不能用tmpl至于钩子的内容,就看自己的发挥了,你需要熟悉DOS批处理文件的编写技巧,常见的应用比如:当mit完成后,自动调用钩子程序,通过svnupdate命令,将最新版本发布到服务器上的测试环境中在网上查了,发现都不对,有哪位大哥大姐知道,告一下。也不提示错误,就是同步不了

  ⑻window钩子是什么

  ⑼钩子(Hook是Windows消息处理机制的一个要点(Point。应用程序可以通过钩子机制截获处理Window消息或是其他一些特定事件。同DOS中断截获处理机制类似,应用程序可以在钩子上设置多个钩子函数,由其组成一个与钩子相关联的指向钩子函数的指针列表(钩子链表。当钩子所监视的消息出现时,Windows首先将其送到调用链表中所指向的第一个钩子函数中,钩子函数将根据其各自的功能对消息进行监视、修改和控制,并在处理完成后把消息传递给下一钩子函数直至到达钩子链表的末尾。在钩子函数交出控制权后,被拦截的消息最终仍将交还给窗口处理函数。虽然钩子函数对消息的过滤将会略加影响系统的运行效率,但在很多场合下通过钩子对消息的过滤处理可以完成一些其他方法所不能完成的特殊功能。

  ⑽C语言windowsapi写钩子,错误码是,意思是无效的挂接程序类型怎么改

  ⑾钩子函数(Hook是Windows编程里的东西,跟百C语言没有关系,任何度语言都可以调用钩子。如果你想用钩子写一些内程序的话,可以参考容下面这个博文:当然最好还是去看MSDN!

  ⑿windows应用层钩子在哪里

  ⒀应用程序建立在驱动程序之上消息首先发送给钩子,在发给应用程序,如果在处理钩子的时候不返回消息给应用程序,应用程序就受不到消息

  ⒁this指针存放在主线程的堆栈中,传递到子线程的指针访问的其实是子线程的堆栈,当然不可能获得正确值,其实你直接传递光标坐标即可。在子线程对界面进行处理,会导致线程频繁切换,反而影响效率。HOOK技术即钩子函数,钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

  ⒂钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之前处理它们。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键盘钩子可以截获键盘消息,鼠标钩子可以截获鼠标消息,外壳钩子可以截获启动和关闭应用程序的消息,日志钩子可以监视和记录输入事件。若在dll中使用SetWindowsHookEx设置一全局钩子,系统会将其加载入使用user的进程中,因而它也可被利用为无进程木马的进程注入手段。

您可能感兴趣的文章:

相关文章