- 論壇徽章:
- 0
|
內(nèi)核版本號:3.13.0-43
#define arp_hrd ea_hdr.ar_hrd
#include<linux/module.h>
#include<linux/init.h>
#include<linux/kernel.h>
#include<linux/netfilter.h>
#include<linux/netfilter_ipv4.h>
#include<linux/ip.h>
#include<net/ip.h>
#include<linux/udp.h>
#include<linux/in.h>
#include<linux/skbuff.h>
#include<linux/netdevice.h>
#include<linux/if_ether.h>
#include<linux/if.h>
#include<linux/if_arp.h>
#include<linux/netfilter_arp.h>
unsigned int hook_func(
unsigned int hooknum,//功能函數(shù)掛載點
struct sk_buff *skb,//數(shù)據(jù)包結(jié)構(gòu)體指針
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *)
)
{
struct arphdr *arp;//定義ARP包結(jié)構(gòu)體
unsigned char *sha,*arp_ptr;
char buf[20];
arp=arp_hdr(skb);//獲取數(shù)據(jù)包ARP頭
arp_ptr=(unsigned char*)(arp+1);
//指針偏移找到數(shù)據(jù)包源MAC地址
sha=arp_ptr;
sprintf(buf,"%02x:%02x:%02x:%02x:%02x:%02x",sha[0],sha[1],sha[2],sha[3],sha[4],sha[5]);
if(strcmp(buf,"dc:0e:a1:e8:94:d6")==0)
{
printk("MATCH!\n");
return NF_ACCEPT;
//若數(shù)據(jù)包源MAC地址與本機MAC一致則通過
}
else
{
printk("UNMATCH!\n");
//若數(shù)據(jù)包源MAC地址與本機MAC地址不一致,則丟棄該數(shù)據(jù)包
return NF_DROP;
}
}
static struct nf_hook_ops nfho={
.hook=hook_func,//注冊功能函數(shù)
.pf=NFPROTO_ARP,//協(xié)議規(guī)則
.hooknum=NF_ARP_OUT,//掛載點
.priority=NF_IP_PRI_FIRST,//處理優(yōu)先級
.owner=THIS_MODULE,//指定模塊
};
static int __init hook_init(void)//注冊模塊
{
if (nf_register_hook(&nfho)) {
printk(KERN_ERR"<0>nf_register_hook() failed\n");
return -1;
}
return 0;
}
static void __exit hook_fini(void)//注銷模塊
{
nf_unregister_hook(&nfho);
}
module_init(hook_init);
module_exit(hook_fini);
MODULE_LICENSE("GPL");
這個鉤子對于自己編寫ARP發(fā)包程序發(fā)出去的ARP包不起作用,不明白為什么?請您指教!
回復(fù) 4# tc1989tc
|
|