很多软件的事件回调都叫钩子,也就是 hook,例如 SVN 和 Git
不理解为什么叫钩子,感觉不是很好理解,难道这有什么故事
1
ericgui 2021-06-04 16:20:50 +08:00
或者事故
|
2
wafm 2021-06-04 16:22:19 +08:00
原本:
1+1 =2 ----------------------------------- HOOK: 1+1 =2 ----------- ---------- |--------------| 1+1=2 了,要干点啥吗? 类似把程序链条勾起来再套回去 |
3
wafm 2021-06-04 16:23:18 +08:00 2
HOOK:
1+1 =2 ----------- ---------- |--------------| 1+1=2 了,要干点啥吗? 类似把程序链条勾起来再套回去 |
4
balabalaguguji OP @wafm #2 太牵强
|
5
asdasdasdzxc 2021-06-04 16:24:16 +08:00
可以看看 AOP 的概念
|
6
wafm 2021-06-04 16:24:43 +08:00
@balabalaguguji 那是因为现在的各种组件和库封装的太好了,稍微学习一下汇编,你会很快理解为啥叫 HOOK,钩子
|
7
falcon05 2021-06-04 16:25:21 +08:00 via iPhone 1
因为可以挂东西,Wordpress 里特别典型
|
8
chinvo 2021-06-04 16:26:52 +08:00 3
就是程序本身是条 pipeline, hook (钩子) hook (挂) 到 pipeline 上面
|
9
kop1989 2021-06-04 16:31:34 +08:00
我认为钩子和回调,在逻辑上没有本质区别。
区别应该只存在于开发端。 钩子往往是将逻辑填充到预定的方法体 /空函数中。 而回调是传递函数指针。 |
10
suiterchik 2021-06-04 16:31:39 +08:00 13
这个应该来源于设计模式中的模板模式和好莱坞准则,也就是上层定义一个未实现的方法(也就是钩子方法),留给下层实现,在需要的时候上层调用这个钩子方法
就好比二楼的住户在窗口放了一个篮子下楼,楼下的人把食物放到篮子上,当二楼的住户饿了就把篮子拉上去,如果不饿,那就在那放着。在这个比喻中,二楼就是上层实现,一楼是底层实现,篮子就是钩子方法,食物就是钩子的具体逻辑。低层组件将自己挂钩到系统上,高层组件决定什么时候和如何调用低层组件 |
11
IgniteWhite 2021-06-04 16:35:25 +08:00
突出钩子的这么一个特点:比如你在一根管子里,如果你向前伸出一个钩子,它的钩尖是反向的。比钩子大的东西,在通过管道的时候就容易被勾住。有人会想,滤网不也是这样吗,是,但是钩子钩到东西以后,你一拉它,挂载钩子上的东西就能跟着拉出来。
|
12
ztxcccc 2021-06-04 16:40:47 +08:00
一个正常的流程就像箱子在传送带上,hook 会在需要的时候把箱子勾走做别的事情,然后放回去
|
13
skinny 2021-06-04 16:44:56 +08:00
其实不少词比较难理解,翻译要占大部分原因。
|
14
EgoTao 2021-06-04 16:48:30 +08:00 1
感觉是个语言问题,而不是题主不理解什么是钩子,只是不理解为什么叫钩子。 很多词都是不太理解英语的话就很难理解,单纯的从英语直译中文都不好理解。 比如 hook (钩子)、socket (套接字)等等。这种翻译还是挺多的吧,就是翻译成中文以后,并不能直观的理解这个东西是啥。 可能需要大佬解释一下 hook 实际的使用(语言)场景之类的才好理解。
|
15
SlipStupig 2021-06-04 16:49:47 +08:00
|
16
SlipStupig 2021-06-04 16:54:07 +08:00
@kop1989 hook 和 callback 虽然很多时候用法一样,但是并不完全一样啊,hook 会改变原有流程
|
17
freakxx 2021-06-04 17:06:15 +08:00
计算机英语中总出现的"hooks" 是什么意思? "钩子" ? 这个钩子应该怎么理解? 是回调的意思? - 凌霜的回答 - 知乎
https://www.zhihu.com/question/20610442/answer/128226574 |
18
oneisall8955 2021-06-04 17:12:17 +08:00
想起 handle,句柄,把手?
|
19
rioshikelong121 2021-06-04 17:21:59 +08:00 1
"In computer programming, the term hooking covers a range of techniques used to alter or augment the behaviour of an operating system, of applications, or of other software components by intercepting function calls or messages or events passed between software components. Code that handles such intercepted function calls, events or messages is called a hook."
https://en.wikipedia.org/wiki/Hooking |
20
balabalaguguji OP @oneisall8955 #18 是的,当年学 C++时,经常碰到句柄,什么文件句柄,就感觉完全不知道是什么
|
21
touchwithe 2021-06-04 17:50:00 +08:00 via iPhone
会想起以前的青葱岁月,回调和句柄真是令我百思不得其解
|
22
Jooooooooo 2021-06-04 17:52:49 +08:00 3
@balabalaguguji 句柄真的是翻译的太差了.
|
23
X0ray 2021-06-04 17:56:23 +08:00 1
@Jooooooooo 套接字不服
|
25
raaaaaar 2021-06-04 18:02:14 +08:00 via Android
好莱坞模式是个啥。。
|
26
stabc 2021-06-04 18:03:20 +08:00 1
翻译成“挂钩”会更加直观。“钩子”会让人误解为那种带个绳子的钩子。 而实际上墙上的挂钩。
|
27
fs418082760 2021-06-04 18:05:19 +08:00
你知道”卖钩子的“是什么意思吗?
|
28
dianso 2021-06-04 18:09:38 +08:00
北方程序员表示我们叫轮子
|
29
RainyH2O 2021-06-04 18:10:02 +08:00 1
计算机有不少概念虽然在不同上下文环境下叫不同的名字,但在抽象的层面上实际上就是一回事。
至于钩子的理解,形象点就好比正常走路,衣服被钩子钩住了不得不停下来处理,改变了原来的走路过程。就这么理解着呗。 换个上下文可能就叫中断、劫持、注入、回调、生命周期函数、模板方法、过滤器、拦截器、切面、异常控制流等等了。 具体细节上可能有些有很大区别,但抽象起来无非一个定义好的过程某个位置被加了另一段过程呗。 来源的话可就难考究了。 |
30
hubqin 2021-06-04 18:24:16 +08:00 via Android
hook 不就是事件,观察者模式么
|
31
BeautifulSoap 2021-06-04 18:25:39 +08:00 32
哎,这贴看下来真的觉得楼上太多人都对本地程序的开发没了解了
hook 这个词和翻译没关系,lz 明显没有做过原生类软件的开发,hook 不等于 callback,lz 搞错了这两者的区别了,所以对 hook 的理解有点偏差 HOOK 一般是用来形容软件开发中与 "截取" 有关的技术的词语。注意不是回调,而是截取,这里的截取尤其是指截取 API 比如在 Windows 下,你可以写个程序把自己的 dll 注入到目标进程中,这样每当目标程序调用系统的 API 或自己程序内部的函数的时候,你都可以直接截取到目标程序的 API 调用,你可以在程序调用 API 前随意修改传给系统的参数,也可以修改系统 API 返回给目标程序的数据。利用 HOOK 你可以在不修改目标程序的情况下,任意修改它的所有输入输出。这就叫 HOOK Android 的 Xposed 框架就是个 HOOK 框架,可以不修改 app 任意 HOOK 安卓系统的 API,功能才如此强大 所以钩子这个词其实是非常形象且准确的,你把钩子扔进目标程序里(甚至直接扔到整个系统里都行),当对应的 API 被调用时候,就自动上钩了,上钩后执行你的程序,这就是“钩子”这个词的意思 框架里说的钩子同理,只不过框架的钩子是开发者事先就埋好的你可以随意调用。实现方式可能和回调很像,但并不等于回调 |
32
danhahaha 2021-06-04 18:25:41 +08:00
钩子就是自动化流水线上的打工仔,机器处理不了的,放几个打工仔,这里拧个螺丝,那里做下质检,程序员就是车间主任,整天来回折腾这些打工仔
|
33
hubqin 2021-06-04 18:25:48 +08:00 via Android
@Jooooooooo 当年学 c+
+看到这个 句柄 很长时间难以理解 |
34
balabalaguguji OP @BeautifulSoap #31 嗯,感谢科普
|
35
Helsing 2021-06-04 19:17:36 +08:00 via iPhone
@BeautifulSoap #31
这个是最好的解释了,Android 如果了解过插桩和插件化对这个就比较好理解了 |
36
aaniao002 2021-06-04 19:21:24 +08:00 via Android
所以别看中文书籍。真看不懂。
|
37
foMM 2021-06-04 19:21:25 +08:00
我还以为楼主刚到西北地区
|
38
expkzb 2021-06-04 22:30:02 +08:00
特定事件理解为鱼,钓鱼的过程叫 hook
|
39
irytu 2021-06-05 02:35:52 +08:00 via iPhone
玩过 iOS 越狱开发吗,全是 hook…… 记得上古时期有个上手的工具就直接叫 captainhook😂,或者去了解一下 Linux 下面的库打桩机制,比如利用 LD_PRELOAD 来 hook 标准库的一些函数调用
|
40
ragnaroks 2021-06-05 08:47:59 +08:00 1
callback+inject=hook
|
41
xiaofan305 2021-06-05 09:17:23 +08:00 via iPhone
歪一个楼,我觉得 handle 可以翻译成“抓手”,形象贴切
|
42
TinyWang 2021-06-05 10:06:28 +08:00
我还以为楼主问的是屁股
|
43
Cloutain 2021-06-05 10:44:52 +08:00 1
安全选手的眼中,callback 是系统或框架或某某程序提供的官方接口,hook 是自己硬塞进去的
|
44
chenyu8674 2021-06-05 11:25:02 +08:00
玩过黄金矿工没
|
45
ming159 2021-06-05 11:25:38 +08:00
主要是为了 扩展性 . 比如你设计一个框架可以这样来做
// 可以是接口,也可以是函数,或者是其他 [函数|接口] hook=null; // 注册钩子函数 function addHook([函数|接口] hook){ this.hook=hook; } // 此函数就可以由于钩子函数的存在,在不修改代码的基础上通过传入不同的钩子实现不同的逻辑 function something(Object args){ // 比如首先参数验证,然后做一些处理 if(this.hook!=null){ args = this.hook(args); // 调用钩子函数 } // 后续的操作 // 如果没有注册钩子函数,则系统就是默认行为. // 如果之前添加了自定义的钩子函数,可以对系统默认行为作出自定义 } |
46
winglight2016 2021-06-05 11:50:46 +08:00
个人理解:回调是嵌入到主线程的代码(耦合),而回调是第三方主线程来控制被 hook 的进程在状态触发时去调用 hook 的,所以差别非常大,在架构上不是一回事儿。
|
47
winglight2016 2021-06-05 11:52:40 +08:00
@winglight2016 修正一下:“而回调”应该是“而 hook”
|
48
wupher 2021-06-05 12:01:09 +08:00
最早写 VC 的时候,远在上个世纪,MSDN 的文档就称相关机制及 API 为 API Hook,Dll Hook 。
我觉得是相承下来的吧。 |
49
johnsona 2021-06-05 14:16:39 +08:00 via iPhone
钩子中间件 aop 就是调另外一个东西之前把你钩住 执行完我的方法再走
|
50
shayuvpn0001 2021-06-05 17:20:24 +08:00
@BeautifulSoap 楼层里就你解释的是最到位的,现在本地应用程序的确了解透彻的人不多了。很多话术不过是把以前的东西包装了一下,换了个应用场景,很多没见过的都以为是什么新发明的东西。
|
51
Leigg 2021-06-05 20:03:36 +08:00 via Android
中间价,切面,钩子有很大相似度
|