免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 求snort的tcp重组实现分析。。。 [复制链接]

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-02-28 15:00 |只看该作者 |倒序浏览
30可用积分

  1. static inline int CheckFlushPolicyOnData(
  2.     TcpSession *tcpssn, StreamTracker *talker,
  3.     StreamTracker *listener, TcpDataBlock *tdb, Packet *p)
  4. {
  5.     uint32_t flushed = 0;
  6.     uint32_t avail;

  7.     STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  8.                 "In CheckFlushPolicyOnData\n"););
  9.     STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  10.                 "Talker flush policy: %s\n",
  11.                 flush_policy_names[talker->flush_mgr.flush_policy]););
  12.     STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  13.                 "Listener flush policy: %s\n",
  14.                 flush_policy_names[listener->flush_mgr.flush_policy]););

  15.     switch(listener->flush_mgr.flush_policy)
  16.     {
  17.         case STREAM_FLPOLICY_IGNORE:
  18.             STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  19.                         "STREAM_FLPOLICY_IGNORE\n"););
  20.             return 0;

  21.         case STREAM_FLPOLICY_FOOTPRINT_IPS:
  22.         {
  23.             int coerce;
  24.             STREAM5_DEBUG_WRAP(DebugMessage(DEBUG_STREAM_STATE,
  25.                         "STREAM_FLPOLICY_FOOTPRINT-IPS\n"););

  26.             avail = get_q_sequenced(listener);
  27.             coerce = CheckFlushCoercion(
  28.                 p, &listener->flush_mgr, listener->tcp_policy->flush_factor);

  29.             if (
  30.                 (avail > 0) &&
  31.                 (coerce || (avail >= listener->flush_mgr.flush_pt) ||
  32.                 (avail && talker->s_mgr.state == TCP_STATE_FIN_WAIT_1))
  33.             ) {
  34.                 uint32_t dir = GetForwardDir(p);

  35.                 if ( talker->s_mgr.state == TCP_STATE_FIN_WAIT_1 )
  36.                     listener->flags |= TF_FORCE_FLUSH;

  37.                 flushed = flush_to_seq(
  38.                     tcpssn, listener, avail, p,
  39.                     GET_SRC_IP(p), GET_DST_IP(p),
  40.                     p->tcph->th_sport, p->tcph->th_dport, dir);
  41.             }
  42.         }
  43.         break;

  44.         case STREAM_FLPOLICY_PROTOCOL_IPS:
  45.         {
  46.             uint32_t flags = GetForwardDir(p);
  47.             uint32_t flush_amt = flush_pdu_ips(tcpssn, listener, p, &flags);
  48.             uint32_t this_flush;

  49.             while ( flush_amt > 0 )
  50.             {
  51.                 // if this payload is exactly one pdu, don't
  52.                 // actually flush, just use the raw packet
  53.                 if ( (tdb->seq == listener->seglist->seq) &&
  54.                      (flush_amt == listener->seglist->size) &&
  55.                      (flush_amt == p->dsize) )
  56.                 {
  57.                     this_flush = flush_amt;
  58.                     listener->seglist->buffered = SL_BUF_FLUSHED;
  59.                     listener->flush_count++;
  60.                     p->packet_flags |= PKT_PDU_FULL;
  61.                     ShowRebuiltPacket(p);
  62.                 }
  63.                 else
  64.                 {
  65.                     this_flush = flush_to_seq(
  66.                         tcpssn, listener, flush_amt, p,
  67.                         GET_SRC_IP(p), GET_DST_IP(p),
  68.                         p->tcph->th_sport, p->tcph->th_dport, flags);
  69.                 }
  70.                 // if we didn't flush as expected, bail
  71.                 if ( this_flush != flush_amt )
  72.                     break;

  73.                 flushed += this_flush;
  74.                 flags = GetForwardDir(p);
  75.                 flush_amt = flush_pdu_ips(tcpssn, listener, p, &flags);
  76.             }
  77.             if ( !flags )
  78.             {
  79.                 if ( AutoDisable(listener, talker) )
  80.                     return 0;

  81.                 listener->flush_mgr.flush_policy = STREAM_FLPOLICY_FOOTPRINT_IPS;
  82.                 listener->flush_mgr.flush_pt += ScPafMax();
  83.                 listener->flush_mgr.flush_type = S5_FT_PAF_MAX;

  84.                 return CheckFlushPolicyOnData(tcpssn, talker, listener, tdb, p);
  85.             }
  86.         }
  87.         break;
  88.     }
  89.     return flushed;
  90. }
复制代码
from 2.9.4 snort
求解其中的机制分析,谢谢!
(先占位放着,等我分析后补充!有清楚的请跟帖指点,谢谢!)

论坛徽章:
0
2 [报告]
发表于 2013-03-01 09:21 |只看该作者
有个人写过一点,在这能下到pdf

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2013-03-01 09:30 |只看该作者
没有吧。目前我没有搜到任何有价值的东西。。。

你给个链接,谢谢!
回复 2# ww2000e


   

论坛徽章:
0
4 [报告]
发表于 2013-03-15 16:38 |只看该作者
回复 1# chishanmingshen


    有同样的需求

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2014-08-24 22:07 |只看该作者
本帖最后由 chishanmingshen 于 2014-08-24 22:16 编辑

refer to flush_to_seq()
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP