首页 > 编程知识 正文

钩子技术,罗技鼠标左右滚动怎么用

时间:2023-05-03 05:44:15 阅读:62546 作者:4366

以前吃饭的时候,听前辈说要猜测某输入法的挂钩,我们的软件变成了crash,问是不是用户使用的某输入法。 我很好奇钩子是什么。

百度,发现网上有非常多的资料可以查阅,看过一些资料,这里用比较初学者的语言编写钩子,在系统的消息队列前拦截消息,修改、拦截和直接传递消息。 当然,更好的教科书式学习是参考《Windows核心编程》的第22章《DLL注入和API拦截》。 参考网上获取的鼠标挂钩源代码,分析和学习制作简单鼠标挂钩的流程和步骤以及相关知识。

(1) ) ) )。

首先,创建新的DLL模块,在DLL中声明一些全局变量,并将其放置在共享数据段中,如下所示

//共享代码段,所有线程均为//#pragmadata_seg(shared ) )静态hook hhk mouse=null; //鼠标挂钩手柄statichinstanceg _ hinstance=null; //本DLL的实例句柄static HWND g_hWnd=NULL; 调用//dll的主窗口句柄。 SendMessage现在可以在主窗口消息及其参数# pragma data _ seg (# pragma comment (链接器,'/section:SHARED,rws ' )中

首先,在我的个人测试中,这些变量即使作为DLL的全局变量也不影响使用。

1,#pragma data_seg ()通常用于DLL。 这意味着定义由DLL共享并命名的数据段。 最重要的是,此数据段中的全局变量可以由多个进程共享。 否则,无法在多个进程之间共享DLL中的全局变量。

2 )共享数据必须初始化。 否则,Microsoft编译器将未初始化的数据放在. BSS段中,并且多个进程之间的共享操作将失败。

3 .字符rws表示段具有读、写和共享属性

在DLL中定义低级鼠标处理函数是预处理相应消息的“截取函数”,如下文所述:

//低级鼠标挂接函数//lresultcallbacklowlevelmouseproc (int ncode,//hook code WPARAM wParam, //messageidentifierlparamlparam//messageidentifierlparam/=null ncode==HC _ action (:3360 sendmessage ) g_hwnd }returncallnexthookex(HHKmouse,nCode,wParam,lParam ); )扩张问题二:低级是什么? 高级怎么样?

DLL定义了用于安装挂接的函数和用于卸下挂接的函数:

//安装低级鼠标函数以拦截系统上的所有鼠标消息//boolwinapistarthookmouse (hwnd ) {g_hWnd=hwnd的hk mouse=setwindows if (空值==hhk mouse ({ return false; }else{return TRUE; }}////低级鼠标钩//VOID WINAPI StopHookMouse () if ) HHKmouse!=NULL ) :3360 unhookwindowshookex (hhk mouse ); }

为什么要使用DLL函数安装问题:扩展挂接呢? 可以在主程序上安装挂钩吗? (虽然DLL至少可以封装“块函数”。 )

全局挂接必须安装在DLL上,本地挂接可以写在主程序上。 消息队列基于线程。 本地HOOK显示进程中所有线程的消息。 这种实现是轻量的HOOK,因为它不涉及进程上下文的切换。 全局HOOK映射到加载USER32.DLL的所有进程。 实际上,USER32.DLL会为这些进程调用LOADLIBRARY来加载包含HOOK的DLL,并在所有消息都发送到消息处理之前调用HOOKPROC。

的全局挂接对系统中的所有进程都是有效的,当一个进程触发挂接事件时,从挂接链中顺序执行相应的挂接函数,如果挂接链中的全局挂接不出现在进程空间中,则对应的挂接此全局挂接的dll由所有可挂接的触发进程加载,对于exe显然无法实现

接下来需要注意的一个问题是使用def文件。 它用于定义用DLL导出的函数。 例如,在def文件中定义导出的函数:

; hookDll.def :声明DLL的模块参数。 库' mouse hook ' exports; 您可以在此处显式导出starthookmousestophookmouse(2)

MFC的小窗口实现主程序与Hook的技术无关,只要实现按钮和消息即可。

(3) ) )。

DLL与主程序进行通信,主要通过DLL和主程序自定义消息,将DLL的“监听函数”监听到的鼠标信息发送到主程序,允许主程序打印对应的鼠标消息

问四:为什么要进行通信?

这是为了将DLL的“截取函数”捕获到的鼠标信息发送到调用窗口,在调用窗口中显示鼠标消息进行显示。

效果大致如图所示:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。