钩子程序的运行机制?c语言怎么写钩子程序

2025-03-10 01:10:01 0

钩子程序的运行机制?c语言怎么写钩子程序

本文目录

钩子程序的运行机制

每一个Hook(钩子)都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。 一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始, 而最早安装的钩子放在最后,也就是后加入的先获得控制权。Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

c语言怎么写钩子程序

钩子函数(Hook)是Windows编程里的东西,跟C语言没有关系,任何语言都可以调用钩子。如果你想用钩子写一些程序的话,可以参考下面这个博文:

c#写钩子程序

C#写HOOK还是延续WINDOWS HOOK的思路的,使用标准的API :SetWindowHookEx....思路很简单:写个类自己定义一个钩子事件然后再自己程序中调用,下面是我以前写的一个NET HOOK框架,网上相关资源也是很多的======================================写多了其他语言实现的HOOK,突然很想写个不一样的,想来想去Net HOOK是最合适的了使用的方法还是传统的 Gui‘Thread Hook : SetWindowsHookEx/CallNextHookExHOOK -- 拦截,一种改变程序执行流程的技术手段,这里我不想过多的去谈如果去改变一个程序的执行流程只是简单的演示下,如何实现一个HOOK在Net里面实现挂钩和在其他语言实现虽然在本质上是相同的,但细节上却是有点不同的NET 采用的是事件驱动(消息机制的封装版),所有要实现一个消息的拦截,你必须实现一个事件,而该事件的作用就是接受和处理=======================================1。开始我们定义一个基础类,实现一些基本的方法和变量namespace Mr.Krcl.BaseHookLibrary{ /* hook library by Mr.krcl 283018011 2010-5-12 BMD : 这里给出的只是一个NET HOOK 模型 并未完全实现功能 */ // ================================================================= // 事件参数类 public class HookEventArgs: EventArgs { //根据需要你可以添加变量或函数实现功能的扩展 } // ================================================================== // 挂钩的消息类型,具体查阅MSDN public enum HookType : int { WH_JOURNALRECORD = 0, WH_JOURNALPLAYBACK = 1, WH_KEYBOARD = 2, WH_GETMESSAGE = 3, WH_CALLWNDPROC = 4, WH_CBT = 5, WH_SYSMSGFILTER = 6, WH_MOUSE = 7, WH_HARDWARE = 8, WH_DEBUG = 9, WH_SHELL = 10, WH_FOREGROUNDIDLE = 11, WH_CALLWNDPROCRET = 12, WH_KEYBOARD_LL = 13, WH_MOUSE_LL = 14 } // ==================================================================== // 导出API : 最烦人的工作了,不像C/C++其他语言直接调用头文件就OK protected static extern int CallNextHookEx(IntPtr hhook, int code, IntPtr wParam, IntPtr lParam); // ==================================================================== // HOOK基类 public abstract class BaseHookLib:IDisposable{ // 事件委托 + 回调函数委托 public delegate CallBackHookProc(int nCode , IntPtr wparam ,IntPtr lparam) ; public delegate HookEventHandler(object sender , HookEventArgs e); public event HookEventHandler InvokeHook ; // 构造函数 public BaseHookLib(HookType hType) { _hookType = hType ; } public BaseHookLib(HookType hType , CallBaseHookProc proc) { _hookType = hType ; callBackFun = proc ; } // 内部变量 protected IntPtr _hhook = IntPtr.Zero; // 判断系统是否已经加载HOOK protected bool _isHook = false ; // 回调函数 protected CallBackHookProc callBackFun ; // 挂钩消息的类型 protected HookType _hookType ; public bool IsHook{ get { return _isHook; } } // 引发时间 protected void OnHook(HookEventArgs e) { if(InvokeHook != null) InvokeHook(this , e); } // 钩子回调函数 protected int CallBackFunction(int nCode ,IntPtr wParam , IntPtr lparam) { if( nCode 《 0) return CallNextHookEx(_hhook , nCode , wParam ,lparam); // 事件参数类实例化 HookEventArgs e = new HookEventArgs(....) ; OnHook(e) ; // ............... // 这里可以做你想做的,作为基类我们总是直接返回 // ................ return CallNextHookEx(_hhook,nCode ,wParam ,lparam); } // 安装钩子 protected void InstallHook() { _hhook = SetWindowsHookEx(_hookType ,callbackFun , Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()),, 0/*(int) AppDomain.GetCurrentThreadId()*/); _hook = true ; } // 卸载钩子 protected void UnInstallHook() { UnhookWindowsHookEx(_hhook); _hhook = IntPtr.Zero; _hook = false ; } // ============================================================================= // // 继承IDisposable接口的目的在于实现Dispose方法 ,该接口继承可在派生类中实现继承 // // =============================================================================}现在我们需要做的就是关键步骤的了实现一个鼠标的HOOK类,该类从BaseHookLib中派生namespace Mr.Krcl.BaseHookLibrary{ // 鼠标时间参数类 public class MouseHookEventArgs{ /* 这里你可以通过添加任何可用的成员变量或方法来实现该类的扩展 当然你也可以同对MouseEventArgs类的继承来扩展,例如: public class MouseHookEventArgs : MouseEventArgs{ ... } */ } // ================================================================================= // 定义鼠标时间委托 // 委托的形式是可变的,这里我们遵循原始的鼠标委托写法 // public delegate void MouseEventHandler(object sender ,MouseEventArgs e) public delegate void MouseHookEventHandler(object sender,MouseHookEventArgs e); // ================================================================================= // 主打类 MouseHookLib // 因为我们要继承BaseHookLib所有我们这里就不需要在进程IDISxxx接口了 public class MouseHookLib { // 构造函数 // HOOK鼠标消息的类型由基类负责传递,利用C#构造函数层分布特点 public MouseHookLib():base(HookType.WH_MOUSE_LL){ callBackFun = new CallBackHookProc(MouseHookCallBackFunction); } public MouseHookLib():base(HookType.WH_MOUSE_LL,new CallBackHookProc(MouseHookCallBackFunction){ } // 析构函数 // 作用通过调用重载的Dispose函数卸载钩钩 ~MouseHookLib(){ Dispose(false); } // 实现Dispose方法 // 如果你在基类已经实现了改方法那么,这里你需要采用重载方式实现,或者直接基类该方法 // 这里假设积累没有实现该方法 protected void Dispose( bool disposing ) { if ( IsInstalled ) Uninstall(); if ( disposing ) GC.SuppressFinalize( this ); } public void Dispose() { Dispose( true ); } /* 积累实现该方法后本类的重载实现 public override void Dispose( bool disposing ) { if ( IsInstalled ) Uninstall(); if ( disposing ) GC.SuppressFinalize( this ); } */ // 事件 // 定义了时间和事件的触发方法 // 单独的定义事件是毫无意义的 // 这里我们以定义两个事件MouseDown ,MouseMove为例,具体根据自己的需要,方法是相同 public event MouseHookEventHander MouseMove ; public void OnMouseMove(MouseHookEventArgs e) { if(MouseMove != null){ MouseMove(this , e); } } public event MouseHookEventHander MouseDown ; public void OnMouseMove(MouseHookEventArgs e) { if(MouseDown != null){ MouseDown(this , e); } } // 鼠标钩子回调函数 public IntPtr MouseHookCallBackFunction(int nCode , IntPtr wParam , IntPtr lparam) { if( nCode 《 0 ) return CallNextHookEx(_hhook , nCode ,wParam ,lParam); MouseHookEventArgs e = new MouseHookEventArgs(.....) ; /* 这里可以根据你自己的需要对拦截的消息进行过滤或者获取你自己需要的信息 例如: if ( code == Win32.HC_ACTION ){ switch ( wParam.ToInt32() ) { case Win32.WM_MOUSEMOVE: OnMouseMove( e ); break; case Win32.WM_LBUTTONDOWN: case Win32.WM_RBUTTONDOWN: case Win32.WM_MBUTTONDOWN: case Win32.WM_XBUTTONDOWN: OnMouseDown( e ); break; } } 这里只是一个模型 ,具体需要具体实现,关键就是根据lparam和wparam参数来实现事件的激活 从而调用事件,对目标消息进行拦截 */ return CallNextHookEx(_hhook , nCode ,wParam ,lParam); } }}

什么叫钩子过程

就是windows程序对windows操作系统的消息进行了拦截,本来应该发到其它程序的消息,被钩子程序拦截了.或者说被钩到了.钩子程序拦截系统消息的过程就是钩子过程.

钩子程序的基本概念

钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。钩子也可以理解为WINDOWS留给我们的后门,比如你想控制键盘,在DOS时代很简单通过INT即可,而WINDOWS时代不允许我们直接操作硬件;由于WINDOWS是消息驱动,所以我们可以拦截键盘消息以达到控制键盘的目的。控制自己进程的消息固然很简单,但是要控制所有进程消息就要利用钩子了。将钩子函数放在DLL中,所有的有关键盘的消息都必须经过钩子函数过滤,这样你就可以为所欲为了。WINDOWS下的钩子程序就像DOS下的TSR(内存驻留程序)一样,用来截获WINDOWS下的

钩子程序到底是什么

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。   钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控  制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。  钩子也可以理解为WINDOWS留给我们的后门,比如你想控制键盘,在DOS时代很简单通过INT即可,而WINDOWS时代不允许我们直接操作硬件;由于WINDOWS是消息驱动,所以我们可以拦截键盘消息以达到控制键盘的目的。但是控制自己进程的消息固然很简单,要控制所有进程消息要利用钩子了。将钩子函数放在DLL中,所有的有关键盘的消息都必须经过钩子函数过滤,这样你就可以为所欲为了。   WINDOWS下的钩子程序就像DOS下的TSR(内存驻留程序)一样,用来截获WINDOWS下的   特定的消息,进行相应的处理。比如可以截获键盘输入的消息,来获得键盘输入的信息等。钩子程序可以通过API调用来驻留和脱钩。

钩子程序是什么东西

木马钩子其实也是一个dll文件,这个东东讲起来比较麻烦。我尽量说简单点。dll文件叫动态链接库文件,系统正常运行需要调用一些程序就是通过dll文件里的函数来执行的,一个正常运行的系统进程会调用许多的dll文件,而这些dll文件在系统用到某些功能时还会调用其它的dll文件。木马钩子就是这样一种dll文件,通过其内置的函数,使系统进程认为这个dll文件是个正常的需要调用的dll,然后再通过这个dll来启动木马。这就有点象使用钩子一样,先钩住挂靠再贴上去。------说得不是很贴切。

有种木马程序叫“钩子”的谁能说说原理

钩子仅仅是一个处理消息的程序段,通过系统调用,把它自身挂入系统,每当有特定的消息发出时,没有到达窗口前,钩子程序就先截获该消息。钩子是制作木马程序的关键,因为不同的钩子可以截获不同的信息,处理不同的任务。例如键盘钩子可以截获键盘记录,而鼠标钩子可以截获鼠标的运动消息,外壳钩子是截获启动和关闭应用程序消息的关键,而日志钩子则可以监视和记录所有的输入事件

钩子程序的运行机制?c语言怎么写钩子程序

本文编辑:admin

更多文章:


collection官网(gucci官网中国官方网)

collection官网(gucci官网中国官方网)

本文目录gucci官网中国官方网为什么有些东西在ssense forzieri luisaviaroma 在官网却没有舰娘Collection苹果版下载地址卡地亚官网怎么查编号collectionlstoalps是什么牌子香奈儿包包的官网g

2025年3月14日 01:40

平安银行信用卡怎么样(平安银行信用卡怎么样好用吗)

平安银行信用卡怎么样(平安银行信用卡怎么样好用吗)

本文目录平安银行信用卡怎么样好用吗平安银行信用卡怎么样活动多吗平安银行信用卡怎么样平安银行的信用卡怎么样平安银行的信用卡好不好平安信用卡怎么样平安银行的信用卡,怎么样如何使用信用卡平安银行优惠力度大不大平安银行京喜联名信用卡怎么样平安银行信

2025年2月9日 15:30

电脑哪个键是中英文切换?电脑英文要怎么转换成中文版本

电脑哪个键是中英文切换?电脑英文要怎么转换成中文版本

本文目录电脑哪个键是中英文切换电脑英文要怎么转换成中文版本英文怎么中文转换电脑如何把中文版转换成英文版的电脑中英文转换按键有什么可以把中文翻译成英文的软件在Word文档里怎样转换中英文电脑打字如何快速实现中英文转换电脑哪个键是中英文切换  

2025年2月10日 03:10

thr什么意思(词根thr什么意思)

thr什么意思(词根thr什么意思)

本文目录词根thr什么意思股票 thr是什么意思词根thr什么意思thr好像不是很典型的词根或词缀。但还是有几个,主要是三、多、还有穿过的意思。英文最早也是像形文字,我们来分析一下:T(t),是大树的意思。H(h)是栅栏、梯子、台阶的意思,

2025年2月10日 23:50

grand total(grand total是什么意思)

grand total(grand total是什么意思)

本文目录grand total是什么意思计算器频幕上grand total 什么意思GrandTotal Mac版财务软件好用吗有的计算器上“grand total”是什么意思啊grand total是什么意思grand total英 Th

2025年3月24日 13:10

gateone几线品牌(blackgateone是奢侈品吗)

gateone几线品牌(blackgateone是奢侈品吗)

本文目录blackgateone是奢侈品吗Blackgateone风格是怎样价位如何blackgateone是奢侈品吗blackgateone是奢侈品,BLACKGATEONE是法国的时尚品牌GATEONE推出的男装品牌。BLACKGATE

2025年3月15日 00:10

ctrl键用法大全(怎样用ctrl键)

ctrl键用法大全(怎样用ctrl键)

本文目录怎样用ctrl键Ctrl键是什么意思快捷键ctrl放大ctrl键是什么意思ctrl+n、ctrl+c、ctrl+v、ctrl+w这些快捷键都是干什么用的Ctrl加各键的用法电脑键盘ctrl键的功能ctrl用法:怎样用ctrl键ctr

2025年3月10日 20:50

html标签查询(HTML中哪个标签是用于方便其他网站搜索的呢)

html标签查询(HTML中哪个标签是用于方便其他网站搜索的呢)

本文目录HTML中哪个标签是用于方便其他网站搜索的呢的是html代码,怎么模糊查询标签内的内容HTML中哪个标签是用于方便其他网站搜索的呢meta是html语言head区的一个辅助性标签。几乎所有的网页里,我们可以看到类似下面这段的html

2025年2月20日 19:00

wsdl url is not valid(The URL is not valid and cannot be loaded.是什么意思)

wsdl url is not valid(The URL is not valid and cannot be loaded.是什么意思)

本文目录The URL is not valid and cannot be loaded.是什么意思使用Eclipse解析WSDL文件出错了大虾帮看看soapui工具添加wsdl时候报错,java.lang.Exception: Fail

2025年4月5日 00:20

go下载电影网(哪里能在线看最新电影)

go下载电影网(哪里能在线看最新电影)

本文目录哪里能在线看最新电影有哪些能看vip电影的网站或公众号哪里能在线看最新电影一、Neets.cc--一款相见恨晚的在线视频观看网站。聚合全网搜索链接,电影、动漫、电视剧、综艺...不论是新出的电影还是最热的电视剧或者综艺,都可以在线观

2025年3月21日 20:20

error音 是什么意思(error音色是什么声音)

error音 是什么意思(error音色是什么声音)

本文目录error音色是什么声音VIXX的歌曲error到底是什么意思啊赫兹声音鉴定error音是什么英语发音air与error在美式发音上有什么区error音色是什么声音error音色是失真灯亮声音。error音色的用途不同,采用压缩的质

2025年3月10日 21:00

rs触发器和sr触发器的区别(rs触发器中的r和s分别代表什么意思呢)

rs触发器和sr触发器的区别(rs触发器中的r和s分别代表什么意思呢)

本文目录rs触发器中的r和s分别代表什么意思呢西门子plc中sr触发器有什么用STEP7两种触发器:RS触发器和SR触发器有什么区别,谢谢!rs触发器中的r和s分别代表什么意思呢R和S是R触发器的两个输入端,R通常称为置0端或复位端,S为置

2025年3月13日 01:20

模板网站源码(网站模板和源码的区别是什么)

模板网站源码(网站模板和源码的区别是什么)

本文目录网站模板和源码的区别是什么网站源码和网站模板有什么区别网站源码和网站模板是一样么网站模板和源码的区别是什么模板就是别人做好的.你下载下来.就可以使用.也可以在模板上再加一代码.源码和代码意思是一样的.代码则是一段(没有学过的人)看不

2025年2月28日 10:30

array工艺流程图(油漆施工工艺流程有哪些)

array工艺流程图(油漆施工工艺流程有哪些)

本文目录油漆施工工艺流程有哪些关于JAVA程序流程图的编写油漆施工工艺流程有哪些在家庭装修中,油漆工程占据很重要的一部分,涂料施工工程的出现基本就已经表示装修以及过半了,一般涂料施工工艺都是为了室内表面更有看点,那么油漆施工工艺流程具体有哪

2025年3月17日 11:00

vbscript编译器(Microsoft VBScript编译器错误)

vbscript编译器(Microsoft VBScript编译器错误)

本文目录Microsoft VBScript编译器错误Microsoft VBScript 编译器错误 错误 ’800a0411’ 名称重定义 /sql.Asp,行 20 dimMicrosoft VBScript 编译器错误错误 ’800

2025年2月13日 19:30

dedecms是干嘛的(dedecms是什么东西)

dedecms是干嘛的(dedecms是什么东西)

本文目录dedecms是什么东西eaea淘宝客程序是做什么dedecms又是干嘛的请问dedecms是不是什么网站都可以建立出来学习dedecms需要有哪方面的基础dedecms是什么东西织梦内容管理系统,他将是您轻松建站的首选利器。采用X

2025年3月6日 04:50

sounds great(sounds great的英汉互英)

sounds great(sounds great的英汉互英)

本文目录sounds great的英汉互英sounds great什么意思什么时候用sounds greatsound great和sounds great有什么区别Sounds great 怎么回复Sounds great算不算系表结构s

2025年3月1日 08:30

找一款比较好的在线表单设计工具?表单设计器中,如何单独编辑命令按钮组、选项按钮组中各个按钮

找一款比较好的在线表单设计工具?表单设计器中,如何单独编辑命令按钮组、选项按钮组中各个按钮

本文目录找一款比较好的在线表单设计工具表单设计器中,如何单独编辑命令按钮组、选项按钮组中各个按钮怎样在表单设计器中把属性或方法添加到表单中vf中打开表设计器的命令是什么在表单设计器界面中,设置文本框控件名称的属 性是国内有没有类似Wufoo

2025年3月1日 21:50

fastjson和jackson(spring mvc使用fastjson好还是jackson)

fastjson和jackson(spring mvc使用fastjson好还是jackson)

本文目录spring mvc使用fastjson好还是jacksonFastjson究竟有多快Jackson和FastJson性能谁更快spring必须依赖jackson吗jackson fastjson gson哪个好spring mvc

2025年3月25日 21:20

请问物化视图怎么解释谢谢!?物化视图的物化视图分类

请问物化视图怎么解释谢谢!?物化视图的物化视图分类

本文目录请问物化视图怎么解释谢谢!物化视图的物化视图分类什么是物化视图,如何定义,如何使用,请举例说明物化视图的介绍oracle物化视图如何在上亿的表建立什么是Oracle的物化视图物化视图与一般视图有何区别物化视图和普通视图的区别是什么如

2025年3月9日 06:10

近期文章

本站热文

harbor,port,pier的区别?谁能解释“harbour“(港口)与“pier“(码头)的区别
2025-02-22 17:40:03 浏览:18
ibatis foreach(ibatis 批量update操作)
2025-02-10 23:40:06 浏览:7
endless rain(endless rain表达什么情感)
2025-02-14 06:00:02 浏览:6
标签列表

热门搜索