在内核中从skb打印ip地址,老是当机。。。
下面是代码:
unsigned int hook_printip(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 *sb=*skb;
struct iphdr *iph;
//iph=(struct iphdr*)(skb_network_header(sb));
iph=(struct iphdr*)ip_hdr(sb);
//printk(KERN_INFO "src IP%d.%d.%d.%d\n",NIPQUAD(iph->saddr));
printk(KERN_INFO "%d.%d.%d.%d\n",NIPQUAD(iph->daddr));
// printk(KERN_INFO "src ip %pI4\n",&iph->saddr);
//printk(KERN_INFO "src ip \n");
return NF_ACCEPT;
}
真的不知道哪里有问题,,skbuff结构改了后。。。。。。 回复 1# 雷锋不谢
真的不知道哪里有问题,,skbuff结构改了后。。。。。。
你的贴的代码应该是没什么问题,关键就是你到底对内核干了什么:mrgreen:
回复 1# 雷锋不谢
你在写netfilter的代码吗?哪个版本的内核?我看的代码中第二个参数是struct sk_buff *skb,不是struct sk_buff **skb。
回复 2# 瀚海书香
就是在某个钩子点勾包,然后打印其ip,但是,一旦加载进去,如果有数据包经过电脑,就当机了。
不知道是不是ip头部没找对还是怎么的, ycnian 发表于 2014-08-25 16:25 static/image/common/back.gif
回复 1# 雷锋不谢
你在写netfilter的代码吗?哪个版本的内核?我看的代码中第二个参数是struct sk_buff * ...
2.6.32
hook函数里面的都是sk_buff** ,不过这没影响吧,* 和** 都可以,只是在用的时候注意就行了。。。 ycnian 发表于 2014-08-25 16:25 static/image/common/back.gif
回复 1# 雷锋不谢
你在写netfilter的代码吗?哪个版本的内核?我看的代码中第二个参数是struct sk_buff * ...
哎呀, 还真是这个问题。
我看代码是2.6.20的,但机子上面是2.6.32的。所以就误导了。
话说这年头内核变化真快。。谢谢啦。。 回复 6# 雷锋不谢
我看代码是2.6.20的,但机子上面是2.6.32的。所以就误导了。
话说这年头内核变化真快。。谢谢啦。。
好吧。你编译的时候居然没有报错?
瀚海书香 发表于 2014-08-25 18:27 static/image/common/back.gif
回复 6# 雷锋不谢
好吧。你编译的时候居然没有报错?
还是有点问题,我打印tcp的端口的时候,感觉不对,你看看。。。。
void printpacket(struct sk_buff*skb)
{
struct ethhdr *eth;
struct iphdr*iph;
struct tcphdr *tcph;//假定该packet为tcp包
eth=eth_hdr(skb);
iph=ip_hdr(skb);
tcph=tcp_hdr(skb);
int i;
printk("mac dst:");
for(i=0;i<6;i++)
printk("%02x ",eth->h_dest);
printk("\n");
printk("mac src:");
for(i=0;i<6;i++)
printk("%02x ",eth->h_source);
printk("\n");
printk("ip src:%pI4\n",&iph->saddr);//这是专门打印ip的格式,注意,参数为指针。
printk("ip dst:%pI4\n",&iph->daddr);//这是专门打印ip的格式,注意,参数为指针。
//printk("ip src :%u.%u.%u.%u",NIPQUAD(iph->saddr));//用NIPQUAD也是可以滴。。
printk("tcp srcport:%d\n",ntohs(tcph->source));
printk("tcp dstport:%d\n",ntohs(tcph->dest));
}
最后两行。。。。
和wireshark里面输出的不是一样的。
回复 8# 雷锋不谢
void printpacket(struct sk_buff*skb)
{
struct ethhdr *eth;
struct iphdr*iph;
struct tcphdr *tcph;//假定该packet为tcp包
eth=eth_hdr(skb);
iph=ip_hdr(skb);
tcph=tcp_hdr(skb);
int i;
printk("mac dst:");
for(i=0;i<6;i++)
printk("%02x ",eth->h_dest);
printk("\n");
printk("mac src:");
for(i=0;i<6;i++)
printk("%02x ",eth->h_source);
printk("\n");
printk("ip src:%pI4\n",&iph->saddr);//这是专门打印ip的格式,注意,参数为指针。
printk("ip dst:%pI4\n",&iph->daddr);//这是专门打印ip的格式,注意,参数为指针。
//printk("ip src :%u.%u.%u.%u",NIPQUAD(iph->saddr));//用NIPQUAD也是可以滴。。
printk("tcp srcport:%d\n",ntohs(tcph->source));
printk("tcp dstport:%d\n",ntohs(tcph->dest));
}
1. 你为什么假定为tcp啊?加个判断就那么难?
if (iph->protocol != IPPROTO_TCP)
return NF_ACCEPT;
2. 取tcphdr的方法有问题
tcp_hdr(skb)的方法只能在传输层调用,那个时候已经设置好了传输层的头(比如ip_local_deliver_finish函数中调用set_reset_transport_header),可以直接调用了。
而你现在的hook在ip层,需要使用如下方法取得tcp头
struct tcphdr _tcph, *th;
th = skb_header_pointer(skb, ip_hdrlen(skb),
sizeof(_tcph), &_tcph); 回复 9# 瀚海书香
膜拜,以后有问题可以向你请教么///
页:
[1]