linux进程函数钩子,linux内核中的hook函数详解

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

先介绍一个结构体:

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

7b3caecaabe8ef55183dc0eeea2e3417.png

其中的成员信息为:

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

841f2c75bb2b750be6819d54dd526e51.png

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

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

82aab5952670ad68221815fd28844e8c.png

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

2c42723e053b4d084c107737cc3780b1.png

其中的每个值的含义为:

940eccadd8cd85a0ca99979809a3e420.png

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

priority 的IPV4取值为:

570ffb949641d014d3e8ef803a251de5.png

priority 的IPV6取值为:

24e73ca68414cd093bf66c5127d280fc.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()函数在内核中的实现也没有多么的复杂,

来看看它是如何实现的:

81eaaefbee2cb8133311b11422679903.png

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

void nf_unregister_hook( struct nf_hook_ops *reg )

919786a922736985acfeb3c820699f93.png

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

struct nf_hook_ops myhooks[n]时,使用:

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

a3087d28faee1d33121fa8b7df78c054.png

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

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

106c21b8f0d8bbd57366a3b25a65c117.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 );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值