免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5515 | 回复: 9
打印 上一主题 下一主题

[内核模块] 在内核中从skb打印ip地址,老是当机。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-25 15:36 |只看该作者 |倒序浏览


       下面是代码:

      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结构改了后。。。。。。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
2 [报告]
发表于 2014-08-25 15:50 |只看该作者
回复 1# 雷锋不谢
真的不知道哪里有问题,,skbuff结构改了后。。。。。。

你的贴的代码应该是没什么问题,关键就是你到底对内核干了什么

   

论坛徽章:
0
3 [报告]
发表于 2014-08-25 16:25 |只看该作者
回复 1# 雷锋不谢
你在写netfilter的代码吗?哪个版本的内核?我看的代码中第二个参数是struct sk_buff *skb,不是struct sk_buff **skb。

   

论坛徽章:
0
4 [报告]
发表于 2014-08-25 17:18 |只看该作者
回复 2# 瀚海书香


    就是在某个钩子点勾包,然后打印其ip,但是,一旦加载进去,如果有数据包经过电脑,就当机了。

不知道是不是ip头部没找对还是怎么的,

论坛徽章:
0
5 [报告]
发表于 2014-08-25 17:20 |只看该作者
ycnian 发表于 2014-08-25 16:25
回复 1# 雷锋不谢
你在写netfilter的代码吗?哪个版本的内核?我看的代码中第二个参数是struct sk_buff * ...


2.6.32

hook函数里面的都是sk_buff** ,  不过这没影响吧,* 和** 都可以,只是在用的时候注意就行了。。。

论坛徽章:
0
6 [报告]
发表于 2014-08-25 17:24 |只看该作者
ycnian 发表于 2014-08-25 16:25
回复 1# 雷锋不谢
你在写netfilter的代码吗?哪个版本的内核?我看的代码中第二个参数是struct sk_buff * ...



哎呀, 还真是这个问题。

我看代码是2.6.20的,但机子上面是2.6.32的。所以就误导了。

话说这年头内核变化真快。。  谢谢啦。。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
7 [报告]
发表于 2014-08-25 18:27 |只看该作者
回复 6# 雷锋不谢
我看代码是2.6.20的,但机子上面是2.6.32的。所以就误导了。

话说这年头内核变化真快。。  谢谢啦。。

好吧。你编译的时候居然没有报错?

   

论坛徽章:
0
8 [报告]
发表于 2014-08-25 19:34 |只看该作者
瀚海书香 发表于 2014-08-25 18:27
回复 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里面输出的不是一样的。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
9 [报告]
发表于 2014-08-25 20:56 |只看该作者
回复 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);

论坛徽章:
0
10 [报告]
发表于 2014-08-26 21:24 |只看该作者
回复 9# 瀚海书香


    膜拜,以后有问题可以向你请教么///
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP