首先明确一点:hook是一个编程机制,与语言无关。个人的简单理解hook就是钩子,之所以说是钩子,是因为你可以往钩子上挂任何东西,程序执行到hook的时候,你预先挂上/勾上(hook)的是什么,就执行什么。
比如 Mesa defines hooks for the parts where drivers may need to do hardware specific stuff, for example in the implementation of glDrawArrays().
贴一段维基百科中对钩子的定义:
钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术。处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。
Hook
原意是指钩子
,它表示的就是在某个函数的上下文做自定义的处理来实现我们想要的黑科技
。
生搬硬套的理解HOOK,其实容易一知半解。要想要比较好的理解HOOK,最好是结合相应的语言/技术栈。
对 于Windows系统,它是建立在事件驱动机制上的,说白了就是整个系统都是通过消息传递实现的。hook(钩子)是一种特殊的消息处理机制,它可以监视 系统或者进程中的各种事件消息,截获发往目标窗口的消息并进行处理。所以说,我们可以在系统中自定义钩子,用来监视系统中特定事件的发生,完成特定功能, 如屏幕取词,监视日志,截获键盘、鼠标输入等等。
Hook大概原理
创建一个代理对象,然后把原始对象替换为我们的代理对象,这样就可以在这个代理对象为所欲为,修改参数或替换返回值。
正常调用:
HOOK调用:
打比方
在编程的世界中,HOOK(钩子)是一个强大而有趣的概念。想象一下,你正在参加一个聚会,突然有人告诉你:“等一下,让我先给你挂个钩子。”这里的“钩子”并不是用来钓鱼的那种,而是一种比喻,指的是一种机制,可以让你在某个特定的时刻插入自己的代码或者行为。
那么,什么是HOOK呢?简单来说,HOOK就是一段代码或者函数,它可以“钩住”程序的执行流程,让我们能够在特定的点上执行自定义的操作。这就像是在一条流水线上安装了一个特殊的装置,当产品经过这个装置时,我们可以对其进行一些额外的处理。
为了更好地理解这个概念,我们可以用一个生活中的例子来打比方。假设你是一个电影院的工作人员,每当有观众进入电影院时,你需要检查他们的电影票。这个过程可以看作是程序的正常执行流程。现在,假设你想要在检查电影票的同时,给每一位观众发放一张优惠券。为了实现这个目标,你可以在检查电影票的环节中加入一个“钩子”,也就是一个额外的步骤。当观众的电影票被扫描后,这个“钩子”就会触发,自动打印并发放优惠券。
在编程中,HOOK的实现方式有很多种。例如,在Web开发中,我们经常使用事件监听器来实现HOOK。当用户点击一个按钮时,我们可以设置一个事件监听器,当按钮被点击时,这个监听器就会被触发,执行我们定义的代码。
另一个例子是在操作系统中。Windows操作系统有一个叫做“钩子链”的机制,允许开发者在系统级别的事件(如键盘敲击、鼠标移动等)发生时插入自己的处理逻辑。这样,开发者就可以创建出各种有趣的应用程序,比如屏幕录制软件、游戏辅助工具等。
总之,HOOK是一种非常强大的工具,它允许我们在不修改原有代码的情况下,向程序中添加新的功能或者改变其行为。通过使用HOOK,我们可以实现很多有趣和实用的功能,让我们的应用程序变得更加丰富和多样化。
作者理解
HOOK,类似于一套正常流程关系中的拦截代理器
例如
1.我在网页教学JavaScript解密的时候经常会对某个function 进行短点 然后再进行
假设原函数
function Add(){x,y
return x+y
}
现在我改成
function Add(){x,y
console.log(“这是形参X:”+x);
console.log(“这是形参Y:”+y)
return x+y;
}
这其中的变化就是 我在调用的时候 中间增加了劫持手段 使得函数在走原来路径的时候增加了一段输出内容
2.常见的微信HOOK框架,有在使用的小伙伴们都知道,常见的框架 可爱猫等……
能通过使用框架来对sdk进行开发 从而可以控制PC端应用程序进行发信息,加好友,收红包等相应对吧
这其中也是HOOK技术 微信安装运行目录下的 WeChatWin.dll 内部的很多方法 通过汇编 抓包解密 可拦截到 微信每个动作后内存基址等变化,就能找到对应操作
通过HOOK代理拦截,就能指导其中的代码行为,进而对此行为进行拦截 比如我知道了发消息 wxid 文本 等参数 函数。就能自主模拟调用了对吧{这是个人拙见,做个比方实际上没这么简单,大家就假设性理解就行 别让我误人子弟哈-小岑感谢各位}