免费注册 查看新帖 |

Chinaunix

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

[网络管理] 修改skb_buff问题,高手帮帮忙,谢谢啦 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-12-20 17:06 |只看该作者 |倒序浏览

  1. //程序功能是:给没有IP选项的数据报头添加路由记录(RR)IP选项.
  2. //方法:先只是试验,所以在netfilter框架中,对于经过HOOK的数据包先拷贝一个新的newskb_buff,然后对该新结构进行处理.
  3. static unsigned int get_icmp(unsigned int hook,
  4. struct sk_buff **pskb,
  5. const struct net_device *in,
  6. const struct net_device *out,
  7. int (*okfn)(struct sk_buff *))
  8. {
  9.   struct iphdr *iph=(*pskb)->nh.iph;
  10.   struct sk_buff *oldskb=*pskb;
  11.   struct sk_buff *newskb=skb_copy(oldskb,GFP_ATOMIC); //拷贝一个新的skb_buff
  12.   struct iphdr *niph=newskb->nh.iph;
  13.   unsigned char *iphraw=newskb->nh.raw;
  14.   unsigned char *tp=(unsigned char*)(iphraw+20);
  15.   unsigned char *p=(unsigned char*)(iphraw+21);
  16.   unsigned char *pp=(unsigned char*)(iphraw+22);
  17.   unsigned char *ppp=(unsigned char*)(iphraw+23);
  18.   unsigned char *pc1=(unsigned char*)(iphraw+61);
  19.   unsigned char *pc2=(unsigned char*)(iphraw+62);
  20.                                                                               
  21.                        
  22. if(iph->protocol == IPPROTO_ICMP)     //针对ICMP协议测试
  23. {
  24.         int i;
  25.         for(i=0;i<oldskb->tail-oldskb->data;i++)
  26.                 if(i!=20){
  27.                         if(i==60){printk("(-%x-)|",oldskb->data[i]);}
  28.                         else{printk("%x|",oldskb->data[i]);}
  29.                 }
  30.                 else{printk("(%x)|",oldskb->data[i]);}
  31.         printk("nu=%d\n",i);

  32.         if(iph->ihl>5){
  33.                 //printk("OPTIONS:RR->%d,RLEN->%d,RPO->%d,pc1->%d,pc2->%d\n",*
  34. p,*pp,*ppp,*pc1,*pc2);
  35.         }else{
  36.                 if(!pskb_expand_head(newskb,0,41,GFP_ATOMIC)){   //扩展skb->tail与skb->end之间的空间,这两个指针之间的空间应该可以被读写吧?
  37.                         memmove((void *)pc2,(const void *)tp,niph->tot_len/8+20);
  38.                         memset((void *)tp,0,42);
  39.                         *tp=0x1;                  //--经过分析似乎ip选项和真正报头之间有一个8八位的控制位,不知道看的对不对?
  40.                         *p=0x7;
  41.                         *pp=0x39;
  42.                         *ppp=0x4;
  43.                         iph->ihl=15;
  44.                         iph->tot_len+=320;
  45.                         ip_send_check(iph);
  46.                         newskb->len+=41;
  47.                         newskb->tail+=41;
  48.         newskb->end+=41;
  49.                          int k;
  50.                          for(k=0;k<newskb->tail-newskb->data;i++)
  51.                         if(i!=20){
  52.                                 if(i==60){printk("(-%x-)|",newskb->data[i]);}

  53.                                 else{printk("%x|",newskb->data[i]);}
  54.                          }else{printk("(%x)|",newskb->data[i]);}
  55.                         printk("nu=%d\n",k);
  56.                         kfree(newskb);
  57.                 }
  58.         }
  59. }else{
  60.       kfree(newskb);
  61. }
  62. return NF_ACCEPT;
  63. }

复制代码

模块载入内核后用ping程序测试,系统崩溃,大虾帮忙看看哪儿有问题,谢谢啦,急啊!

论坛徽章:
0
2 [报告]
发表于 2012-11-28 14:12 |只看该作者
坐等高手解决  晚辈也越到这个问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP