定义
特点
1,系统自动调用。
2,只需要编写函数体就行。
JAVA是运行在虚拟机上的,而钩子函数是直接对操作系统进行操作控制的,这也是Java和C的主要区别之一,Java要实现钩子函数比较麻烦,需要使用JNI技术,就是Java本地接口,调用C写的钩子函数,所以你还有学会用C写一个钩子函数,然后再用Java的JNI调用C
钩子函数的原理c/c++
例如键盘钩子,操作系统取得按键输入之后,会把这个按键消息发给当前的激活的窗口程序(例如word),但在发送给窗口程序之前,会先把这个按键消息作为参数调用一个函数,这个函数就是钩子函数,通常情况下,这个函数是一个空函数,如果你安装了钩子函数之后呢,这个函数就会跳转到你自己写的程序上,这时候你自己的程序就可以先处理这个键盘消息。这就是钩子函数的基本工作过程。
钩子函数的钩子函数
一共有两种类型的钩子:局部的和远程的。
局部钩子仅钩挂您自己进程的事件。
远程的钩子还可以将钩挂其它进程发生的事件。
远程的钩子又有两种:
钩子分两种,一种是系统级的全局钩子;一种是线程级的钩子.全局钩子函数需要定义在DLL中,线程级的钩子开始比较简单.
其实钩子函数就三个:
设置钩子:SetWindowsHookEx
释放钩子:UnhookWindowsHookEx
继续钩子:CallNextHookEx
在线程级的钩子中经常用到GetCurrentThreadID函数来获取当前线程的ID
JS钩子函数与回调函数区别
在消息处理机制中必不可少的一组CP,即回调和钩子。
钩子的概念源于Windows的消息处理机制,通过设置钩子,应用程序可以对所有的消息事件进行拦截,然后执行钩子函数,对消息进行想要的处理方式。
接下来是一段js代码,主要用于给btn设置点击的钩子函数
btn.onclick = () => { console.log(“i’m a hook”);钩子是在捕获消息的时候立即执行钩子函数。
下面是一段给btn添加click的监听器。
这是给btn绑定了一个监听器,后面那个函数是它的回调函数,因为消息捕获的过程我们并不能参与,而在捕获执行完毕的时候,回调函数才会执行,我们可以把对消息的处理写在回调函数里。
js由于自身的特殊性(单线程),因而在代码里充满各式各样的异步操作,因此回调函数也是铺天盖地,上面的两段代码都是异步的。
回调函数和钩子函数的区别
根本上,他们都是为了捕获消息而生的,但是钩子函数在捕获消息的第一时间就会执行,而回调函数是在整个捕获过程结束时,最后一个被执行的。
回调函数其实就是调用者把回调函数的函数指针传递给调用函数,当调用函数执行完毕时,通过函数指针来调用回调函数。
一、什么是 Hook 技术
Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
要实现钩子函数,有两个步骤:
1. 利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景下使用)
2.动态代理(使用所有场景)
二、Hook 技术实现的步骤
Hook 技术实现的步骤也分为两步
1.找到 hook 点(Java 层),该 hook 点必须满足以下的条件:需要 hook 的方法,所属的对象必须是静态的,因为我们是通过反射来获取对象的,我们获取的是系统的对象,所以不能够 new 一个新的对象,必须用系统创建的那个对象,所以只有静态的才能保证和系统的对象一致。
2.将 hook 方法放到系统之外执行(放入我们自己的逻辑)