大致需求是要写个内核模块,截获通过内核的包,就是skb结构,然后分析这个结构,然后决定这个包是drop还是accept或者其它处理....
这个是在2.6.18上测试通过的
#include <linux/module.h> #include <linux/kernel.h> #include <linux/netfilter.h> #include <linux/skbuff.h> #include <linux/ip.h> #include <linux/netdevice.h> #include <linux/if_ether.h> #include <linux/if_packet.h> #include <net/tcp.h> #include <linux/netfilter_ipv4.h>static struct nf_hook_ops nfho; unsigned int hook_func (unsigned int hooknum, struct sk_buff **skb, const struct net_device *in, const struct net_device *out, int (*okfn) (struct sk_buff *)) { struct iphdr *iph = (*skb)->nh.iph; uint32_t iphlen = iph->ihl << 2; struct tcphdr *tcph = NULL; if(!(*skb)) return NF_ACCEPT; if(!((*skb)->nh.iph)) return NF_ACCEPT; switch (iph->protocol) { case IPPROTO_TCP: printk ("It's a TCP PACKET\n"); tcph = (struct tcphdr*)((uint8_t*)iph + iphlen); break; case IPPROTO_ICMP: break; case IPPROTO_UDP: printk ("It's a UDP PACKET\n"); break; } tcph = (struct tcphdr *)((*skb)->nh.iph+((*skb)->nh.iph->ihl)); printk ("s_port=%d,d_port=%d!",(int)tcph->source,(int)tcph->dest); printk ("urg=%d",(int)tcph->urg); return NF_ACCEPT; } int init_module () { nfho.hook = hook_func; nfho.hooknum = NF_IP_LOCAL_OUT; nfho.pf = PF_INET; nfho.priority = NF_IP_PRI_FIRST; nf_register_hook (&nfho); return 0; } void cleanup_module () { nf_unregister_hook (&nfho); } |
发布评论
评论(9)
你写target没错,target就是实现对一个包的策略的。
但你首先要搞明白一个问题:如何让一个target工作?
我问一下:
2.6.18上测试通过了,在2.6.26上就不行了吗?
最多可能就是头文件变变的事吧。改动不应该那么大啊。
LZ要分请什么是target啊。你的这个程序相当于在内核态处理完了数据包。不需要在用户空间的什么程序了。当然,程序本身还有问题
BTW,这个程序和内核版的有个程序怎么一样啊,呵呵
改动可能很大
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/netdevice.h>
#include <linux/if_ether.h>
#include <linux/if_packet.h>
#include <net/tcp.h>
#include <linux/netfilter_ipv4.h>
unsigned int
winnuke_local_in_func (unsigned int hooknum,
struct sk_buff *skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn) (struct sk_buff *))
{
struct iphdr *iph ;
struct tcphdr *tcph ;
struct tcphdr _otcph ;
iph = ip_hdr (skb);
switch (iph->protocol)
{
case IPPROTO_TCP:
printk ("It's a TCP PACKET\n");
tcph = skb_header_pointer(skb,ip_hdrlen(skb),sizeof(_otcph),&_otcph);
break;
case IPPROTO_ICMP:
return NF_ACCEPT;
break;
case IPPROTO_UDP:
return NF_ACCEPT;
break;
default:
return NF_ACCEPT;
}
printk ("s_port=%d,d_port=%d!",(int)tcph->source,(int)tcph->dest);
printk ("urg=%d",(int)tcph->urg);
return NF_ACCEPT;
}
static struct nf_hook_ops winnuke_ops[] __read_mostly = {
{
.hook = winnuke_local_in_func,
.owner = THIS_MODULE,
.pf = PF_INET,
.hooknum = NF_INET_LOCAL_IN,
.priority = NF_IP_PRI_FIRST,
},
};
static int __init winnuke_init(void)
{
int ret;
printk("ins winnuke module\n");
ret = nf_register_hook (winnuke_ops);
if(ret < 0)
return ret;
return 0;
}
static void __exit winnuke_fini(void)
{
printk("rm winnuke module\n");
nf_unregister_hook (winnuke_ops);
}
module_init(winnuke_init);
module_exit(winnuke_fini);
把你的思路整理一下,总结出来吧
看来他这个程序是要做判断是否有WinNuke攻击呢。
不清楚,感觉他这个目的性都不是很明确
看代码:
一般的TCP包中目的端口为137,138,139的会被视为Winnuke攻击