扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
下面让我们看一个验证ARP报文的Hook代码,以表示我们如何使用Hook函数实现这种功能。
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);
}
下面是初始化一些参数的函数
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);
}
下面是函数结束时候的清理工作
static void arpstar_exit(void)
{
nf_unregister_hook(&arphkrcv); /*clean up time*/
nf_unregister_hook(&arphksnd);
nf_unregister_hook(&iphkrcv);
del_timer(&watimer);
free_list();
kfree(tmac);
}
我们知道Windows下面也有Hook的功能,但是要Hook到Net的底层,一般是使用NDIS来实现,但是Linux就提供了如此强大的功能,让我们不得不佩服Linux的伟大。几天的研究让我越来越对Linux的推崇!而且我想 Linux在嵌入式方面的应用会更加广泛!
这几天也在看一些嵌入式的资料,想想,这个世界真的可以因为Linux的改变而改变,相对来说Windows的代码保密性会失去很多嵌入式方面的开发者的!
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者