浅析什么是HOOK

摘要:
生搬硬套的理解HOOK,其实容易一知半解。要想要比较好的理解HOOK,最好是结合相应的语言/技术栈。在K8S编排框架中,我们也可以在执行某些函数的上下文中插入Hook函数,这也是和Web框架同理Hook是PyTorch中一个十分有用的特性。这个功能被广泛用于可视化神经网络中间层的feature、gradient,从而诊断神经网络中可能出现的问题,分析网络有效性。总的来说,handle是对计算机资源的抽象表示。

首先明确一点:hook是一个编程机制,与语言无关

贴一段维基百科中对钩子的定义:

钩子编程(hooking),也称作“挂钩”,是计算机程序设计术语,指通过拦截软件模块间的函数调用、消息传递、事件传递来修改或扩展操作系统、应用程序或其他软件组件的行为的各种技术处理被拦截的函数调用、事件、消息的代码,被称为钩子(hook)。

Hook原意是指钩子,它表示的就是在某个函数的上下文做自定义的处理来实现我们想要的黑科技

生搬硬套的理解HOOK,其实容易一知半解。要想要比较好的理解HOOK,最好是结合相应的语言/技术栈。

在很多技术领域都存在的这种Hook技术,比如下面这些:

    • PythonWeb框架中,如DjangoFlask都存在这种Hook技术,可以在请求的上下文应用的上下文做自定义操作。
    • Scrapy框架中,可以自定义MiddlerWare,在请求解析的时候做自定操作。
    • K8S编排框架中,我们也可以在执行某些函数的上下文中插入Hook函数,这也是和Web框架同理
    • Hook 是 PyTorch 中一个十分有用的特性。利用它,我们可以不必改变网络输入输出的结构,方便地获取、改变网络中间层变量的值和梯度。这个功能被广泛用于可视化神经网络中间层的 feature、gradient,从而诊断神经网络中可能出现的问题,分析网络有效性。

Hook大概原理

创建一个代理对象,然后把原始对象替换为我们的代理对象,这样就可以在这个代理对象为所欲为,修改参数或替换返回值。

正常调用:

浅析什么是HOOK第1张

HOOK调用:

浅析什么是HOOK第2张

有时我们可能会理解不清什么是handle,什么是hook。总的来说,handle是对计算机资源(文件,设备,网络,窗口等等)的抽象表示。程序员可以通过handle来操作系统中的各类资源。而hook指通过拦截系统或者应用中的事件,信号和调用,来更改系统或者应用的默认行为

摘录一个别人写的例子,便于理解:

importtime

classLazyPerson(object):
    def __init__(self, name):
        self.name =name
        self.watch_tv_func =None
        self.have_dinner_func =None

    defget_up(self):
        print("%s get up at:%s" %(self.name, time.time()))

    defgo_to_sleep(self):
        print("%s go to sleep at:%s" %(self.name, time.time()))

    defregister_tv_hook(self, watch_tv_func):
        self.watch_tv_func =watch_tv_func

    defregister_dinner_hook(self, have_dinner_func):
        self.have_dinner_func =have_dinner_func

    defenjoy_a_lazy_day(self):

        #get up
self.get_up()
        time.sleep(3)
        #watch tv
        #check the watch_tv_func(hooked or unhooked)
        #hooked
        if self.watch_tv_func is notNone:
            self.watch_tv_func(self.name)
        #unhooked
        else:
            print("no tv to watch")
        time.sleep(3)
        #have dinner
        #check the have_dinner_func(hooked or unhooked)
        #hooked
        if self.have_dinner_func is notNone:
            self.have_dinner_func(self.name)
        #unhooked
        else:
            print("nothing to eat at dinner")
        time.sleep(3)
        self.go_to_sleep()

defwatch_daydayup(name):
    print("%s : The program ---day day up--- is funny!!!" %name)

defwatch_happyfamily(name):
    print("%s : The program ---happy family--- is boring!!!" %name)

defeat_meat(name):
    print("%s : The meat is nice!!!" %name)


defeat_hamburger(name):
    print("%s : The hamburger is not so bad!!!" %name)


if __name__ == "__main__":
    lazy_tom = LazyPerson("Tom")
    lazy_jerry = LazyPerson("Jerry")
    #register hook
lazy_tom.register_tv_hook(watch_daydayup)
    lazy_tom.register_dinner_hook(eat_meat)
    lazy_jerry.register_tv_hook(watch_happyfamily)
    lazy_jerry.register_dinner_hook(eat_hamburger)
    #enjoy a day
lazy_tom.enjoy_a_lazy_day()
    lazy_jerry.enjoy_a_lazy_day()

#代码原作者链接:https://blog.csdn.net/Mybigkid/java/article/details/78383898

运行结果:

Tom get up at:1509246940.32Tom : The program ---day day up--- isfunny!!!
Tom : The meat isnice!!!
Tom go to sleep at:1509246949.34Jerry get up at:1509246949.34Jerry : The program ---happy family--- isboring!!!
Jerry : The hamburger is notso bad!!!
Jerry go to sleep at:1509246958.37————————————————
#原作者代码链接:https://blog.csdn.net/Mybigkid/java/article/details/78383898

参考链接:

https://zhuanlan.zhihu.com/p/55276265

https://www.zhihu.com/question/57130969/answer/151896360

https://zhuanlan.zhihu.com/p/75054200

https://zhuanlan.zhihu.com/p/89566158

https://blog.csdn.net/Mybigkid/article/details/78383898?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.nonecase

免责声明:文章转载自《浅析什么是HOOK》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PLSQL中查询数据的时候查询结果显示中文乱码(转)ajax全局事件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WebMagic

WebMagic 是干嘛的? WebMagic 是一个 Java 平台上的开源爬虫框架,其设计参考了 Scrapy,实现则参考了 HttpClient 和 Jsoup。其由四大组件组成: Downloader,负责下载网页,使用 HttpClient。 PageProcessor,负责解析网页和链接发现,使用 Jsoup 和 Xsoup。 Schedul...

Gitlab--安装及汉化

简介 gitlab是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git 项目仓库,可通过Web界面迚行访问公开的戒者私人项目。Ruby on Rails 是一个可以使你开发、部署、维护 web 应用程序变得简单的框架。GitLab 拥有与Github 类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常...

RT-Thread 在stm小内存系列产品的nano+msh完整移植教程

本教程基于CUBE-MX,搭建环境方便快捷,把更多精力用在移植的实现上。 ps:本次移植基于stm32l151, 理论上和F1系列通用, 和F4系列区别开来。 ps:纯手工搭建环境也是可以,在一个可以输出hello world的demo上进行移植。 ps: 基于官方移植思路,简单快捷,但是要调整一些小细节。 源地址: https://www.rt-thre...

处理大并发量订单处理的 KafKa部署总结

处理大并发量订单处理的 KafKa部署总结今天要介绍的是消息中间件KafKa,应该说是一个很牛的中间件吧,背靠Apache 与很多有名的中间件搭配起来用效果更好哦 ,为什么不用RabbitMQ,因为公司需要它。    网上已经有很多怎么用和用到哪的内容,但结果很多人都倒在了入门第一步 环境都搭不起来,可谓是从了解到放弃,所以在此特记录如何在linux环境搭...

添加自签发的 SSL 证书为受信任的根证书

通过 SSL 加密的 HTTPS 连接访问网站时,需要安装并配置一个受信任的 CA根证书(Trusted CA Root Certificate)。平常访问一些加密网站之所以不需要自己安装证书,是因为系统或浏览器已经提前安装了一些受信任机构颁发的证书。但有些时候访问一些组织或个人自己签发证书的网站的时候,就会收到浏览器发出的警告。此时可以将该证书添加到“受...

docker安装异常以及网络问题总结

一、docker info 出现"Thedevicemapperstorage driver isdeprecated"警告 需要修改docker安装磁盘文件系统的ftype参数为1 查询文件系统的ftype,如果为0,需要重新格式化磁盘,并修改磁盘文件系统的ftype参数为1 xsfs_info /home 修改前 修改后 参考地址:https://...