- 论坛徽章:
- 0
|
回复 #13 helight 的帖子
我把你提供的代码复制编译了下,编译是可以,模块加载的时候也可以,但是在抓包的时候内核会死掉(Caps Lock和scroll Lock指示灯一直闪烁),
把 struct sk_buff *pskb=*skb; 注释掉或者直接对skb 操作就没事,我用skb_copy函数复制了一份,如:struct sk_buff *sk=skb_copy(skb,1);再对SK操作。
代码如下:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netdevice.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <linux/if_ether.h>
#include <linux/netfilter_ipv4.h>
MODULE_LICENSE("GPL");
static unsigned int in_device_fil (unsigned int hooknum,struct sk_buff **skb,const struct net_device *in,const struct net_device *out,int(*okfn)(struct sk_buff *))
{
struct sk_buff *sk=skb_copy(skb,1);
/* struct ethhdr *ethh = (struct ethhdr*)eth_hdr(sk);
unsigned char *src_mac=ethh->h_source;
printk("mac=%02X:%02X:%02X:%02X:%02X:%02X\n", src_mac[0],src_mac[1],src_mac[2],src_mac[3],src_mac[4],src_mac[5]);
*/ struct iphdr *iph = (struct iphdr*)ip_hdr(sk);
if(iph->protocol==6)
{
struct tcphdr *tcph = (struct tcphdr*)tcp_hdr(sk);
printk("A TCP packet from: %d.%d.%d.%d:%u to %d.%d.%d.%d:%u ",NIPQUAD(iph->saddr),ntohs(tcph->source),NIPQUAD(iph->daddr),ntohs(tcph->dest));
}
if(iph->protocol==17)
{
struct udphdr *udph =(struct udphdr *)udp_hdr(sk);
printk("A UDP packet from: %d.%d.%d.%d:%u to %d.%d.%d.%d:%u ",NIPQUAD(iph->saddr),ntohs(udph->source),NIPQUAD(iph->daddr),ntohs(udph->dest));
}
return NF_ACCEPT;
}
static struct nf_hook_ops kim_net={
.list = {NULL,NULL},
.hook = in_device_fil,
.pf = PF_INET,
.hooknum = NF_IP_PRE_ROUTING,
.priority = NF_IP_PRI_FIRST,
};
static void kim_init_net(void)
{
nf_register_hook(&kim_net);
}
static void kim_cleanup_net(void)
{
nf_unregister_hook(&kim_net);
}
module_init(kim_init_net);
module_exit(kim_cleanup_net);
这是我的代码,感觉应该没什么问题,但是在实际运行的时候输出的信息很奇怪,源地址和目的地址能正确输出,端口号很乱,不管从哪个地址发来的包显示的端口号都是一样的,而目的端口却总在变化,(我在寝室用路由器上网,和这个有关系吗?)
还有那个被注释掉的显示MAC地址的语句,那么写对吗?,那要怎么写才能正确显示出来呢?
nf_hook_ops这个结构还有个成员 *owner 这个用填写吗??
[ 本帖最后由 kimguobin 于 2008-4-22 12:43 编辑 ] |
|