免费注册 查看新帖 |

Chinaunix

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

[内核模块] netfilter无法正常获取smtp包数据问题,高手都进来! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-23 11:11 |只看该作者 |倒序浏览
本帖最后由 zhayun604863141 于 2012-07-23 11:33 编辑
  1. static unsigned int smtp_bcc_process(unsigned int hook,
  2.                  struct sk_buff *pskb,
  3.                  const struct net_device *in,
  4.                  const struct net_device *out,
  5.                  int (*okfn)(struct sk_buff *))
  6. {
  7.     struct iphdr *iph = ip_hdr(pskb);

  8.     unsigned int dataoff, datalen;
  9.     struct tcphdr _tcph, *th;
  10.     char *smtp_ptr = NULL;
  11.     __be32 srcaddr=0, dstaddr=0;
  12.     short emailindex = 0;
  13.     int addrlen = 0;
  14.   if (iph->protocol != IPPROTO_TCP)
  15.     {
  16.         return NF_ACCEPT;
  17.     }
  18.    
  19.     th = skb_header_pointer(pskb, iph->ihl*4, sizeof(_tcph), &_tcph);
  20.     if (th == NULL)
  21.     {
  22.         return NF_ACCEPT;
  23.     }

  24. #if defined(__LITTLE_ENDIAN_BITFIELD)
  25.     if (th->dest == 0x1900)
  26. #else
  27.     if (th->dest == 0x0019)
  28. #endif
  29.     {
  30.         
  31.         printk(KERN_ALERT "source =%d dest = %d\n",th->source,th->dest);   
  32.         srcaddr = ntohl(iph->saddr);
  33.         emailindex = srcaddr%EMAIL_BCC_MAX_ITEM_COUNT;
  34.     }
  35. #if defined(__LITTLE_ENDIAN_BITFIELD)
  36.     else if (th->source == 0x1900)
  37. #else
  38.     else if (th->source == 0x0019)
  39. #endif
  40.     {
  41.         
  42.         printk(KERN_ALERT "source =%d dest = %d\n",th->source,th->dest);   
  43.         dstaddr = ntohl(iph->daddr);
  44.         emailindex = dstaddr%EMAIL_BCC_MAX_ITEM_COUNT;
  45.     }
  46.     else
  47.     {
  48.         return NF_ACCEPT;
  49.     }
  50.    
  51.     if (strlen(proc_emailbcc_info_t.emailaddr) < 5)
  52.     {
  53.         printk(KERN_ALERT "strlen <5 NF_ACCEPT\n");
  54.         DEBUGP("the email bcc address is not valid\n");
  55.         return NF_ACCEPT;
  56.     }
  57.     printk(KERN_ALERT "pskb_data = %s\n",pskb->data);   
  58.     dataoff =  iph->ihl*4 + th->doff*4;
  59.    
  60.     printk(KERN_ALERT "dataoff = %d\n",dataoff);   
  61.         
  62.     if (dataoff >= (pskb)->len)
  63.     {
  64.         if (th->syn == 1)
  65.         {
  66.             email_client_info_t[emailindex].ctl_state = MAIL_STATE_ZERO;
  67.             email_client_info_t[emailindex].flag = 0;
  68.             printk(KERN_ALERT "syn == 1 NF_ACCEPT\n");
  69.             return NF_ACCEPT;
  70.         }
  71.     }   
  72.     data = (char *)th + th->doff*4;
  73.     printk(KERN_ALERT "pskb->len = %d\n",(pskb)->len);   
  74.     datalen = (pskb)->len - dataoff;
  75.    
  76.     smtp_ptr = skb_header_pointer(pskb, dataoff,
  77.                     datalen, smtp_buffer);
  78.     printk(KERN_ALERT "smtp_ptr = %s\n",smtp_ptr);
  79.     if(smtp_ptr == NULL)
  80.         printk(KERN_ALERT "smtp_ptr == NULL\n");
  81.    
  82.     printk(KERN_ALERT "datalen == %d\n",datalen);
  83.     smtp_ptr[datalen] = '\0';
  84.          printk(KERN_ALERT "smtp_ptr== %d\n",smtp_ptr);
  85.     return NF_ACCEPT;
  86. }
复制代码
发送邮件时,为什么只有两个包打印出来了,而且只有这两个包的pskb->len > 40,其他数据包的pskb->len都等于40。而且邮件正文内容页没有打印出来。

论坛徽章:
0
2 [报告]
发表于 2012-07-24 21:59 |只看该作者
自己顶下,防沉!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP