V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
balabalaguguji
V2EX  ›  程序员

为什么要叫钩子?

  •  3
     
  •   balabalaguguji · 2021-06-04 16:18:19 +08:00 · 7253 次点击
    这是一个创建于 1028 天前的主题,其中的信息可能已经有所发展或是发生改变。

    很多软件的事件回调都叫钩子,也就是 hook,例如 SVN 和 Git

    不理解为什么叫钩子,感觉不是很好理解,难道这有什么故事

    51 条回复    2021-06-05 20:03:36 +08:00
    ericgui
        1
    ericgui  
       2021-06-04 16:20:50 +08:00
    或者事故
    wafm
        2
    wafm  
       2021-06-04 16:22:19 +08:00
    原本:
    1+1 =2
    -----------------------------------

    HOOK:
    1+1 =2
    ----------- ----------
    |--------------|
    1+1=2 了,要干点啥吗?


    类似把程序链条勾起来再套回去
    wafm
        3
    wafm  
       2021-06-04 16:23:18 +08:00   ❤️ 2
    HOOK:
    1+1 =2
    ----------- ----------
    |--------------|
    1+1=2 了,要干点啥吗?


    类似把程序链条勾起来再套回去
    balabalaguguji
        4
    balabalaguguji  
    OP
       2021-06-04 16:23:40 +08:00
    @wafm #2 太牵强
    asdasdasdzxc
        5
    asdasdasdzxc  
       2021-06-04 16:24:16 +08:00
    可以看看 AOP 的概念
    wafm
        6
    wafm  
       2021-06-04 16:24:43 +08:00
    @balabalaguguji 那是因为现在的各种组件和库封装的太好了,稍微学习一下汇编,你会很快理解为啥叫 HOOK,钩子
    falcon05
        7
    falcon05  
       2021-06-04 16:25:21 +08:00 via iPhone   ❤️ 1
    因为可以挂东西,Wordpress 里特别典型
    chinvo
        8
    chinvo  
       2021-06-04 16:26:52 +08:00   ❤️ 3
    就是程序本身是条 pipeline, hook (钩子) hook (挂) 到 pipeline 上面
    kop1989
        9
    kop1989  
       2021-06-04 16:31:34 +08:00
    我认为钩子和回调,在逻辑上没有本质区别。
    区别应该只存在于开发端。

    钩子往往是将逻辑填充到预定的方法体 /空函数中。
    而回调是传递函数指针。
    suiterchik
        10
    suiterchik  
       2021-06-04 16:31:39 +08:00   ❤️ 13
    这个应该来源于设计模式中的模板模式和好莱坞准则,也就是上层定义一个未实现的方法(也就是钩子方法),留给下层实现,在需要的时候上层调用这个钩子方法

    就好比二楼的住户在窗口放了一个篮子下楼,楼下的人把食物放到篮子上,当二楼的住户饿了就把篮子拉上去,如果不饿,那就在那放着。在这个比喻中,二楼就是上层实现,一楼是底层实现,篮子就是钩子方法,食物就是钩子的具体逻辑。低层组件将自己挂钩到系统上,高层组件决定什么时候和如何调用低层组件
    IgniteWhite
        11
    IgniteWhite  
       2021-06-04 16:35:25 +08:00
    突出钩子的这么一个特点:比如你在一根管子里,如果你向前伸出一个钩子,它的钩尖是反向的。比钩子大的东西,在通过管道的时候就容易被勾住。有人会想,滤网不也是这样吗,是,但是钩子钩到东西以后,你一拉它,挂载钩子上的东西就能跟着拉出来。
    ztxcccc
        12
    ztxcccc  
       2021-06-04 16:40:47 +08:00
    一个正常的流程就像箱子在传送带上,hook 会在需要的时候把箱子勾走做别的事情,然后放回去
    skinny
        13
    skinny  
       2021-06-04 16:44:56 +08:00
    其实不少词比较难理解,翻译要占大部分原因。
    EgoTao
        14
    EgoTao  
       2021-06-04 16:48:30 +08:00   ❤️ 1
    感觉是个语言问题,而不是题主不理解什么是钩子,只是不理解为什么叫钩子。 很多词都是不太理解英语的话就很难理解,单纯的从英语直译中文都不好理解。 比如 hook (钩子)、socket (套接字)等等。这种翻译还是挺多的吧,就是翻译成中文以后,并不能直观的理解这个东西是啥。 可能需要大佬解释一下 hook 实际的使用(语言)场景之类的才好理解。
    SlipStupig
        15
    SlipStupig  
       2021-06-04 16:49:47 +08:00
    SlipStupig
        16
    SlipStupig  
       2021-06-04 16:54:07 +08:00
    @kop1989 hook 和 callback 虽然很多时候用法一样,但是并不完全一样啊,hook 会改变原有流程
    freakxx
        17
    freakxx  
       2021-06-04 17:06:15 +08:00
    计算机英语中总出现的"hooks" 是什么意思? "钩子" ? 这个钩子应该怎么理解? 是回调的意思? - 凌霜的回答 - 知乎
    https://www.zhihu.com/question/20610442/answer/128226574
    oneisall8955
        18
    oneisall8955  
       2021-06-04 17:12:17 +08:00
    想起 handle,句柄,把手?
    rioshikelong121
        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
    balabalaguguji
        20
    balabalaguguji  
    OP
       2021-06-04 17:47:35 +08:00
    @oneisall8955 #18 是的,当年学 C++时,经常碰到句柄,什么文件句柄,就感觉完全不知道是什么
    touchwithe
        21
    touchwithe  
       2021-06-04 17:50:00 +08:00 via iPhone
    会想起以前的青葱岁月,回调和句柄真是令我百思不得其解
    Jooooooooo
        22
    Jooooooooo  
       2021-06-04 17:52:49 +08:00   ❤️ 3
    @balabalaguguji 句柄真的是翻译的太差了.
    X0ray
        23
    X0ray  
       2021-06-04 17:56:23 +08:00   ❤️ 1
    @Jooooooooo 套接字不服
    MonoBiao
        24
    MonoBiao  
       2021-06-04 17:59:19 +08:00
    @X0ray 安全套接字
    raaaaaar
        25
    raaaaaar  
       2021-06-04 18:02:14 +08:00 via Android
    好莱坞模式是个啥。。
    stabc
        26
    stabc  
       2021-06-04 18:03:20 +08:00   ❤️ 1
    翻译成“挂钩”会更加直观。“钩子”会让人误解为那种带个绳子的钩子。 而实际上墙上的挂钩。
    fs418082760
        27
    fs418082760  
       2021-06-04 18:05:19 +08:00
    你知道”卖钩子的“是什么意思吗?
    dianso
        28
    dianso  
       2021-06-04 18:09:38 +08:00
    北方程序员表示我们叫轮子
    RainyH2O
        29
    RainyH2O  
       2021-06-04 18:10:02 +08:00   ❤️ 1
    计算机有不少概念虽然在不同上下文环境下叫不同的名字,但在抽象的层面上实际上就是一回事。
    至于钩子的理解,形象点就好比正常走路,衣服被钩子钩住了不得不停下来处理,改变了原来的走路过程。就这么理解着呗。
    换个上下文可能就叫中断、劫持、注入、回调、生命周期函数、模板方法、过滤器、拦截器、切面、异常控制流等等了。
    具体细节上可能有些有很大区别,但抽象起来无非一个定义好的过程某个位置被加了另一段过程呗。
    来源的话可就难考究了。
    hubqin
        30
    hubqin  
       2021-06-04 18:24:16 +08:00 via Android
    hook 不就是事件,观察者模式么
    BeautifulSoap
        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 被调用时候,就自动上钩了,上钩后执行你的程序,这就是“钩子”这个词的意思

    框架里说的钩子同理,只不过框架的钩子是开发者事先就埋好的你可以随意调用。实现方式可能和回调很像,但并不等于回调
    danhahaha
        32
    danhahaha  
       2021-06-04 18:25:41 +08:00
    钩子就是自动化流水线上的打工仔,机器处理不了的,放几个打工仔,这里拧个螺丝,那里做下质检,程序员就是车间主任,整天来回折腾这些打工仔
    hubqin
        33
    hubqin  
       2021-06-04 18:25:48 +08:00 via Android
    @Jooooooooo 当年学 c+
    +看到这个 句柄 很长时间难以理解
    balabalaguguji
        34
    balabalaguguji  
    OP
       2021-06-04 18:29:59 +08:00
    @BeautifulSoap #31 嗯,感谢科普
    Helsing
        35
    Helsing  
       2021-06-04 19:17:36 +08:00 via iPhone
    @BeautifulSoap #31
    这个是最好的解释了,Android 如果了解过插桩和插件化对这个就比较好理解了
    aaniao002
        36
    aaniao002  
       2021-06-04 19:21:24 +08:00 via Android
    所以别看中文书籍。真看不懂。
    foMM
        37
    foMM  
       2021-06-04 19:21:25 +08:00
    我还以为楼主刚到西北地区
    expkzb
        38
    expkzb  
       2021-06-04 22:30:02 +08:00
    特定事件理解为鱼,钓鱼的过程叫 hook
    irytu
        39
    irytu  
       2021-06-05 02:35:52 +08:00 via iPhone
    玩过 iOS 越狱开发吗,全是 hook…… 记得上古时期有个上手的工具就直接叫 captainhook😂,或者去了解一下 Linux 下面的库打桩机制,比如利用 LD_PRELOAD 来 hook 标准库的一些函数调用
    ragnaroks
        40
    ragnaroks  
       2021-06-05 08:47:59 +08:00   ❤️ 1
    callback+inject=hook
    xiaofan305
        41
    xiaofan305  
       2021-06-05 09:17:23 +08:00 via iPhone
    歪一个楼,我觉得 handle 可以翻译成“抓手”,形象贴切
    TinyWang
        42
    TinyWang  
       2021-06-05 10:06:28 +08:00
    我还以为楼主问的是屁股
    Cloutain
        43
    Cloutain  
       2021-06-05 10:44:52 +08:00   ❤️ 1
    安全选手的眼中,callback 是系统或框架或某某程序提供的官方接口,hook 是自己硬塞进去的
    chenyu8674
        44
    chenyu8674  
       2021-06-05 11:25:02 +08:00
    玩过黄金矿工没
    ming159
        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); // 调用钩子函数
    }
    // 后续的操作
    // 如果没有注册钩子函数,则系统就是默认行为.
    // 如果之前添加了自定义的钩子函数,可以对系统默认行为作出自定义
    }
    winglight2016
        46
    winglight2016  
       2021-06-05 11:50:46 +08:00
    个人理解:回调是嵌入到主线程的代码(耦合),而回调是第三方主线程来控制被 hook 的进程在状态触发时去调用 hook 的,所以差别非常大,在架构上不是一回事儿。
    winglight2016
        47
    winglight2016  
       2021-06-05 11:52:40 +08:00
    @winglight2016 修正一下:“而回调”应该是“而 hook”
    wupher
        48
    wupher  
       2021-06-05 12:01:09 +08:00
    最早写 VC 的时候,远在上个世纪,MSDN 的文档就称相关机制及 API 为 API Hook,Dll Hook 。

    我觉得是相承下来的吧。
    johnsona
        49
    johnsona  
       2021-06-05 14:16:39 +08:00 via iPhone
    钩子中间件 aop 就是调另外一个东西之前把你钩住 执行完我的方法再走
    shayuvpn0001
        50
    shayuvpn0001  
       2021-06-05 17:20:24 +08:00
    @BeautifulSoap 楼层里就你解释的是最到位的,现在本地应用程序的确了解透彻的人不多了。很多话术不过是把以前的东西包装了一下,换了个应用场景,很多没见过的都以为是什么新发明的东西。
    Leigg
        51
    Leigg  
       2021-06-05 20:03:36 +08:00 via Android
    中间价,切面,钩子有很大相似度
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3284 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 752ms · UTC 14:12 · PVG 22:12 · LAX 07:12 · JFK 10:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.