nf_register_hook,nf_unregister_hook,nf_register_hooks,nf_unregister_hooks.
功能是注冊Hooks函數(shù)
輸入的參數(shù)是struct nf_hook_ops *reg。
下面讓我們看一個驗證ARP報文的Hook代碼,以表示我們?nèi)绾问褂肏ook函數(shù)實現(xiàn)這種功能。
unsigned int arphook_snd(unsigned int hooknum,struct sk_buff **skb,const struct net_device *in, const struct net_device *out,int (*okfn)(struct sk_buff*))
{
struct arphdr *arp;
struct net_device *dev;
unsigned char * arp_ptr;
unsigned char *sha, *tha;
u32 sip,tip;
unsigned short arpop;
unsigned int status=NF_DROP;
dev=(*skb)->dev;
arp = (*skb)->nh.arph;
arp_ptr= (unsigned char *)(arp+1);
sha = arp_ptr;
arp_ptr += dev->addr_len;
memcpy(&sip, arp_ptr, 4);
arp_ptr += 4;
tha = arp_ptr;
arp_ptr += dev->addr_len;
memcpy(&tip, arp_ptr, 4);
arpop=ntohs(arp->ar_op);
if(!check_ip(&tip,WABLOCK)) /*check block list*/
{
if(arpop==1) /*sending ARP request*/
{
if(!check_ip(&tip,WAARP)) /*if not in list add it*/
add_ip(&tip,WAARP);
}
status=NF_ACCEPT;
}
return(status);
}
下面是初始化一些參數(shù)的函數(shù)
static int arpstar_init(void)
{
arphkrcv.hook=arphook_rcv; /*arp receive hook*/
arphkrcv.hooknum=NF_ARP_IN;
arphkrcv.pf=NF_ARP;
arphkrcv.priority=NF_IP_PRI_FIRST;
nf_register_hook(&arphkrcv);
arphksnd.hook=arphook_snd; /*arp send hook*/
arphksnd.hooknum=NF_ARP_OUT;
arphksnd.pf=NF_ARP;
arphksnd.priority=NF_IP_PRI_FIRST;
nf_register_hook(&arphksnd);
iphkrcv.hook=iphook_rcv; /*ip rcv hook*/
iphkrcv.hooknum=NF_IP_LOCAL_IN;
iphkrcv.pf=PF_INET;
iphkrcv.priority=NF_IP_PRI_FIRST;
nf_register_hook(&iphkrcv);
tmac=strtomac(trustedmac);
trustip=strtou32(trustedip);
run_timer(0);
return(0);
}
評論
查看更多