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。希望各位帮忙分析下 没人?自己顶顶。感觉这东西就是标准的,按照格式来就不会出错。但是真的没有hook到数据包。是不是跟内核的相关设置有关? 回复 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 参数类型用的是否正确。
具体还是得看一下内核是如何处理arp的,看源码吧。 回复 3# Godbach
谢谢版主提醒,代码是参考网上的,hook_arp_in()有个参数struct sk_buff **skb,改为struct sk_buff *skb(参考内核里的相关代码)后,真的好使了,能hook到arp的数据包了,但是还是不知道为什么?双指针不是一样吗? 回复 4# 混沌老仙
谢谢,参考了内核的相关代码,改了一下函数的参数形式 ,可以hook到arp了。
回复 5# FlankerSky
参数类型都不一样,怎么能保证好使呢。从 C 语言的角度上看,你多了一级解引用
回复 7# Godbach
嗯,谢谢斑竹,明白了。刚才也看了下2.6.0的内核源码,确实,hook函数的接口发生变化了,所以才导致的上述错误。 回复 8# FlankerSky
论坛里有多个帖子基本上都是像 LZ 这样的问题,原因也一样。
内核接口不是稳定了,不同版本之间都有可能变化。因此,使用一些实例代码的时候,千万要看清楚人家的内核版本,以及自己的内核版本,并比较一些重要接口是否发生了变化。
回复 9# Godbach
恩恩,,学习了!
页:
[1]
2