Linux kernel 悬挂系统的网络挂钩

Linux kernel 悬挂系统的网络挂钩,linux-kernel,hook,insmod,Linux Kernel,Hook,Insmod,我正在测试中给出的网络钩子代码。我的内核版本是3.11 #include <linux/module.h> #include <linux/kernel.h> #include <linux/skbuff.h> #include <net/ip.h> #include <linux/ip.h> #include <linux/tcp.h> #include <linux/in.h> #includ

我正在测试中给出的网络钩子代码。我的内核版本是3.11

 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/skbuff.h>
 #include <net/ip.h>
 #include <linux/ip.h>
 #include <linux/tcp.h>
 #include <linux/in.h>
 #include <linux/netfilter.h>
 #include <linux/netfilter_ipv4.h>

 /* Port we want to drop packets on */
 static const uint16_t port = 25;

 /* This is the hook function itself */
 static unsigned int hook_func(unsigned int hooknum,
                   struct sk_buff **pskb,
                   const struct net_device *in,
                   const struct net_device *out,
                   int (*okfn)(struct sk_buff *)){
    struct iphdr *iph = ip_hdr(*pskb);
    struct tcphdr *tcph, tcpbuf;

    if (iph->protocol != IPPROTO_TCP)
            return NF_ACCEPT;

    tcph = skb_header_pointer(*pskb, ip_hdrlen(*pskb), sizeof(*tcph), &tcpbuf);
    if (tcph == NULL)
            return NF_ACCEPT;

    return (tcph->dest == port) ? NF_DROP : NF_ACCEPT;
}

 /* Used to register our hook function */
 static struct nf_hook_ops nfho = {
    .hook     = hook_func,
    .hooknum  = NF_INET_PRE_ROUTING,
    .pf       = NFPROTO_IPV4,
    .priority = NF_IP_PRI_FIRST,
 };

 static __init int my_init(void)
 {
    return nf_register_hook(&nfho);
 }

 static __exit void my_exit(void)
 {
     nf_unregister_hook(&nfho);
 }

 module_init(my_init);
 module_exit(my_exit);
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
/*我们要在其上丢弃数据包的端口*/
静态常数uint16\u t端口=25;
/*这就是钩子函数本身*/
静态无符号整数hook_func(无符号整数hooknum,
结构sk_buff**pskb,
const struct net_device*in,
const结构网络设备*out,
int(*okfn)(结构sk_buff*)){
结构iphdr*iph=ip_hdr(*pskb);
结构tcphdr*tcph,tcpbuf;
如果(iph->协议!=IPPROTO_TCP)
返回NF_接受;
tcph=skb_头_指针(*pskb、ip_hdrlen(*pskb)、sizeof(*tcph)和tcpbuf);
如果(tcph==NULL)
返回NF_接受;
返回(tcph->dest==端口)?NF\U丢弃:NF\U接受;
}
/*用于注册我们的钩子函数*/
静态结构nf\u hook\u ops nfho={
.hook=hook_func,
.hooknum=NF\u INET\u PRE\u路由,
.pf=NFPROTO_IPV4,
.priority=NF_IP_PRI_FIRST,
};
静态初始化int my_init(void)
{
返回nf\U寄存器\U挂钩(&nfho);
}
静态退出作废我的退出(作废)
{
nf_取消注册_挂钩(&nfho);
}
模块_init(我的_init);
模块退出(我的退出);

但加载后,上述代码将冻结系统。谁能告诉我,原因是什么?。我认为上面的代码可能已经在一些较低版本的内核中进行了测试。所以我怀疑,一些内核参数或特性已经被更改。

您是否尝试在钩子过程中执行其他操作,比如,只记录到内核日志,或者记录一些deguggin消息,以检查这些消息是否也冻结了系统?根据,钩子函数的第二个参数应该是
struct sk_buff*skb
。顺便说一句,用flags
-Wall
编译会显示这个问题。@icbytes在钩子函数中只有内核日志,它就可以工作了properly@Tsyvarev,您可能是对的。我认为问题是在解引用时发生的,struct sk_buff**pskb。我得再检查一遍。