Linux 2.6内核下的一个简单的钩子函数示例

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/netfilter_ipv4/ip_tables.h>
#include <net/ip.h>

MODULE_LICENSE("GPL");


/* 用于注册我们的函数的数据结构 */
static struct nf_hook_ops nfho;

/* 注册的hook函数的实现 */
unsigned int hook_func(unsigned int hooknum,
                       struct sk_buff **skb,
                       const struct net_device *in,
                       const struct net_device *out,
                       int (*okfn)(struct sk_buff *))
{
       
    printk( "hook in net_hook.c\n");// 可以在此处添加自己的函数实现
    return NF_ACCEPT;
}

/* 初始化程序 */
 int simple_init()
{
    /* 填充我们的hook数据结构 */
    nfho.hook       = hook_func;         /* 处理函数 */
    nfho.hooknum  = NF_INET_PRE_ROUTING; /* 使用IPv4的第一个hook */
    nfho.pf       = PF_INET;
    nfho.priority = NF_IP_PRI_FIRST;   /* 让我们的函数首先执行 */
nfho.owner =THIS_MODULE;
    nf_register_hook(&nfho);
    printk(KERN_ALERT "model init\n");

    return 0;
}

/* 清除程序 */
 void simple_exit()
{
    nf_unregister_hook(&nfho);
        printk(KERN_ALERT "model exit\n");

}

module_init(simple_init);
module_exit(simple_exit);



Makefile:


ifneq ($(KERNELRELEASE),)
obj-m :=net_hook.o
else
KERNELDIR=/lib/modules/$(shell uname -r)/build
PWD=$(shell pwd)
default:
make -C $(KERNELDIR) M=$(PWD) modules
endif

clean:
rm -f *.o  modules.order  Module.symvers net_hook.mod.c .net* 
rm -r .tmp_versions

没有评论: