×

钩子程序

c#写钩子程序?钩子程序到底是什么

admin admin 发表于2023-09-18 22:18:03 浏览57 评论0

抢沙发发表评论

本文目录

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); } }}

钩子程序到底是什么

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

钩子程序的基本概念

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

钩子程序的运行机制

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

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

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

c语言怎么写钩子程序

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

什么叫钩子过程

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

钩子程序是什么东西

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