当前位置: 首页 > news >正文

linux hook 任意内核函数,linux内核中的hook函数详解

在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数。现在来看看linux是如何实现hook函数的。

先介绍一个结构体:

struct nf_hook_ops,这个结构体是实现钩子函数必须要用到的结构体,其实际的定义为:

0818b9ca8b590ca3270a3433284dd417.png

其中的成员信息为:

hook  :是一个函数指针,可以将自定义的函数赋值给它,来实现当有数据包到达是调用你自定义的函数。自定义函数的返回值为:

0818b9ca8b590ca3270a3433284dd417.png

owner:是模块的所有者,一般owner = THIS_MODULE ;

pf   :是protocol flags,其取值范围为:

0818b9ca8b590ca3270a3433284dd417.png

hooknum :中存放的是用户自定义的钩子函数的调用时机,其取值为:

0818b9ca8b590ca3270a3433284dd417.png

其中的每个值的含义为:

0818b9ca8b590ca3270a3433284dd417.png

priority : 为所定义的钩子函数的优先级,其取值为份两种:分别为IPV4 和 IPV6;

priority 的IPV4取值为:

0818b9ca8b590ca3270a3433284dd417.png

priority 的IPV6取值为:

0818b9ca8b590ca3270a3433284dd417.png

以上是对struct nf_hook_ops结构体中的每个字段的详解;

现在举例:

struct nf_hook_ops  my_hook = {

.hook = myfunction,

.owner = THIS_MODULE ,

.pf = NFPROTO_IPV4,

.hooknum = NET_INET_FORWARD ,

.priority = NF_IP4_PRI_FIRST };

unsigned int myfunction( unsigend int hooknum,  struct sk_buff *skb,

const struct net_device *in,

const struct net_device *out,

int (*okfn)(struct sk_buff *) )

{

}

如上面的代码一样,当定义一个struct nf_hook_ops结构体,并且对其完成了初始化以后,需要将这个结构体进行注册,之后这个结构体以及其中的自定义函数才会其作用。

注册一个struct nf_hook_ops需要用到的函数为:

int  nf_register_hook( struct nf_hook_ops *reg )

其实这个 int nf_register_hook()函数在内核中的实现也没有多么的复杂,

来看看它是如何实现的:

0818b9ca8b590ca3270a3433284dd417.png

当不再需要使用这个struct nf_hook_ops时,需要注销这个结构体,其可用的函数为:

void nf_unregister_hook( struct nf_hook_ops *reg )

0818b9ca8b590ca3270a3433284dd417.png

当一次需要注册多个struct nf_hook_ops结构体,如:

struct nf_hook_ops myhooks[n]时,使用:

int nf_register_hooks( struct nf_hook_ops *regs, unsigned int n );

0818b9ca8b590ca3270a3433284dd417.png

同样,当一次需要注销多个struct nf_hook_ops结构体是,使用:

void nf_unregister_hoos( struct nf_hook_ops *regs, unsigned int n );

0818b9ca8b590ca3270a3433284dd417.png

总结:

struct nf_hook_ops

int nf_register_hook( struct nf_hook_ops *reg );

void nf_unregister_hook( struct nf_hook_ops *reg );

int nf_register_hooks( struct nf_hook_ops *regs, unsigend int n );

void nf_unregister_hooks( struct nf_hook_ops *regs, unsigned int n );

相关文章:

  • linux 7 开启远程桌面,CentOS 7 安装使用 VNC 远程桌面
  • linux检测磁盘 报警,Linux磁盘空间监控且报警的脚本
  • linux掌握物理页面的分配和回收,Linux中内存的分配和回收
  • commit在c语言中的作用,commit的用法
  • 通讯录系统c语言问题,自己写的通讯录管理系统!大家看看有问题吗?下明天课设就答辩…...
  • c语言贪吃蛇食物不能随机,为啥我的贪吃蛇随机性的把食物吃没,帮忙看一下吧...
  • Excel用函数求C语言的最高分,excel怎样用函数求最高分
  • android soapfault 服务器无法处理请求,Android中调用已经部署到IIS中.net的webservice数据Android端无法执行报错的问题。求大神指点。...
  • android音视频播放器开发百度云,Android 播放端 SDK
  • android 反编译替换资源文件,[求助]想替换微信5.0的一个语言包,但是反编译资源文件出现错误。...
  • android handler源码分析,安卓源码-handler源码分析
  • android:fadingedge=quot;@nullquot;,屏蔽RecyclerView单边滑动到头阴影(fadingEdge)的方法
  • 抖音上android studio,快手、抖音、微视类短视频SDK接入教程,7步就能搞定
  • 网页计算器 html代码原理,htmltest~计算器界面的实现
  • 用HTML写一个冒泡事件,javascript 事件流 捕获与冒泡