FlankerSky 发表于 2013-10-08 21:42

netfilter在NF_ARP_IN处HOOK不到数据,各位帮忙分析下

       
代码如下:


             unsigned int hook_arp_in(unsigned int hooknum,
                                                struct sk_buff **sb,
                                                const struct net_device *in,
                                                const struct net_device *out,
                                                int (*okfn)(struct sk_buff *))
             {
                int NIC = -1;
                printk(" hook_arp_in!!!\n");
                if(*sb)
                   function(*sb);
                return NF_STOLEN;
             }
         ....
      nfarp_in.hook = hook_arp_in;
        nfarp_in.hooknum = NF_ARP_IN;
        nfarp_in.pf = NF_ARP;
        nfarp_in.owner = THIS_MODULE;
        if(nf_register_hook(&nfarp_in) < 0)
                printk("register_hook failed!!!!\n");
      ....


把代码的其他地方都注释掉了,基本就剩了上面的这点代码。加载模块之后,根本不会进到 hook_arp_in()里面,而且系统的arp的过程没受影响。
但是,我将这个nfarp_in.pf = NF_ARP 换成 nfarp_in.pf = NFPROTO_ARP 后,会进入到hook_arp_in,但是判断sb的时候,始终为空,进入不到function( )里。
我的内核版本是3.2.6。希望各位帮忙分析下

FlankerSky 发表于 2013-10-09 07:30

没人?自己顶顶。感觉这东西就是标准的,按照格式来就不会出错。但是真的没有hook到数据包。是不是跟内核的相关设置有关?

Godbach 发表于 2013-10-09 09:17

回复 1# FlankerSky              unsigned int hook_arp_in(unsigned int hooknum,
                                                struct sk_buff **sb,
                                                const struct net_device *in,
                                                const struct net_device *out,
                                                int (*okfn)(struct sk_buff *))看下这个 hook 接口的 skb 参数类型用的是否正确。


   

混沌老仙 发表于 2013-10-09 09:32

具体还是得看一下内核是如何处理arp的,看源码吧。

FlankerSky 发表于 2013-10-09 09:55

回复 3# Godbach


谢谢版主提醒,代码是参考网上的,hook_arp_in()有个参数struct sk_buff **skb,改为struct sk_buff *skb(参考内核里的相关代码)后,真的好使了,能hook到arp的数据包了,但是还是不知道为什么?双指针不是一样吗?

FlankerSky 发表于 2013-10-09 09:56

回复 4# 混沌老仙

谢谢,参考了内核的相关代码,改了一下函数的参数形式 ,可以hook到arp了。

   

Godbach 发表于 2013-10-09 10:12

回复 5# FlankerSky

参数类型都不一样,怎么能保证好使呢。从 C 语言的角度上看,你多了一级解引用

   

FlankerSky 发表于 2013-10-09 10:45

回复 7# Godbach

嗯,谢谢斑竹,明白了。刚才也看了下2.6.0的内核源码,确实,hook函数的接口发生变化了,所以才导致的上述错误。

Godbach 发表于 2013-10-09 11:35

回复 8# FlankerSky
论坛里有多个帖子基本上都是像 LZ 这样的问题,原因也一样。

内核接口不是稳定了,不同版本之间都有可能变化。因此,使用一些实例代码的时候,千万要看清楚人家的内核版本,以及自己的内核版本,并比较一些重要接口是否发生了变化。


   

FlankerSky 发表于 2013-10-09 12:15

回复 9# Godbach


恩恩,,学习了!
页: [1] 2
查看完整版本: netfilter在NF_ARP_IN处HOOK不到数据,各位帮忙分析下