libnids分析(8)

来源:互联网 发布:小意思 mac 编辑:程序博客网 时间:2024/06/05 17:37

完成第二次握手后,需要对一些数据进行处理,代码如下:


  1. /*
  2.                 (如果有数据存在或者修列号不等于确认号的)并且

  3.         序列号在窗口之外
  4.         已经确认过的序号

  5.    */
  6.     
  7.   if (
  8.     ! (!datalen&&ntohl(this_tcphdr->th_seq)== rcv->ack_seq)
  9.     &&
  10.   
  11.     /*th_seq - (ack_seq+ wscale) > 0 或者th_seq+datalen - ack_sql < 0*/
  12.     ( !before(ntohl(this_tcphdr->th_seq), rcv->ack_seq+ rcv->window*rcv->wscale)||
  13.           before(ntohl(this_tcphdr->th_seq)+ datalen, rcv->ack_seq)
  14.         )
  15.      )
  16.      return;
  17.   
  18.      
  19.   
  20.   /*发送th_rst 重新开启一个连接*/
  21.   if ((this_tcphdr->th_flags& TH_RST)){
  22.     /*是tcp 数据*/
  23.     if (a_tcp->nids_state== NIDS_DATA){
  24.       struct lurker_node *i;
  25.       a_tcp->nids_state= NIDS_RESET;
  26.       for (i= a_tcp->listeners; i; i= i->next)
  27.     (i->item)(a_tcp,&i->data);
  28.     }
  29.     nids_free_tcp_stream(a_tcp);
  30.     return;
  31.   }

然后开始第三次握手

/*******************************************************************************

                                     第三次握手

******************************************************************************/

  1. 从client --> server的包

  2.    是从三次握手的第三个包分析开始的,进行一部分数据分析,和初始化
  3.    连接状态

  4.   */
  5.      
  6.   if ((this_tcphdr->th_flags& TH_ACK)){
  7.     if (from_client&& a_tcp->client.state== TCP_SYN_SENT&&
  8.     a_tcp->server.state== TCP_SYN_RECV){
  9.       if (ntohl(this_tcphdr->th_ack)== a_tcp->server.seq){
  10.     a_tcp->client.state= TCP_ESTABLISHED;
  11.     a_tcp->client.ack_seq=ntohl(this_tcphdr->th_ack);
  12.     {
  13.       struct proc_node *i;
  14.       struct lurker_node *j;
  15.       void *data;
  16.          
  17.       a_tcp->server.state= TCP_ESTABLISHED;
  18.       a_tcp->nids_state= NIDS_JUST_EST;
  19.       /*开始全双工传输,client server 连接已经建立起来了*/
  20.   
  21.       /*三次握手tcp ip 连接建立*/
  22.       for (i= tcp_procs; i; i= i->next){
  23.         char whatto = 0;
  24.            
  25.         char cc = a_tcp->client.collect;
  26.         char sc = a_tcp->server.collect;
  27.         char ccu = a_tcp->client.collect_urg;
  28.         char scu = a_tcp->server.collect_urg;
  29.   
  30.         /*进入回调函数处理*/
  31.   
  32.         /*

  33.             如果在相应端口出现

  34.         client.collect ++ ;

  35.         测审计次数据
  36.         对应用来说tcp 连接已经建立

  37.        */
  38.           
  39.           
  40.         (i->item)(a_tcp,&data);
  41.   
  42.        /**/
  43.         if (cc< a_tcp->client.collect)
  44.           whatto |= COLLECT_cc;
  45.         if (ccu< a_tcp->client.collect_urg)
  46.           whatto |= COLLECT_ccu;
  47.         if (sc< a_tcp->server.collect)
  48.           whatto |= COLLECT_sc;
  49.         if (scu< a_tcp->server.collect_urg)
  50.           whatto |= COLLECT_scu;
  51.         if (nids_params.one_loop_less){
  52.                 if (a_tcp->client.collect>=2){
  53.                     a_tcp->client.collect=cc;
  54.                     whatto&=~COLLECT_cc;
  55.                 }
  56.                 if (a_tcp->server.collect>=2) {
  57.                     a_tcp->server.collect=sc;
  58.                     whatto&=~COLLECT_sc;
  59.                 }
  60.         }
  61.               
  62.        /*加入监听队列,开始数据接收*/
  63.         if (whatto){
  64.           j = mknew(struct lurker_node);
  65.           j->item= i->item;/*放入监听队列*/
  66.           j->data= data;
  67.           j->whatto= whatto;
  68.              
  69.           j->next= a_tcp->listeners;
  70.           a_tcp->listeners= j;
  71.         }
  72.            
  73.       }
  74.          
  75.          
  76.       /*不存在监听着*/{
  77.         nids_free_tcp_stream(a_tcp);
  78.         return;
  79.       }
  80.       if (!a_tcp->listeners)
  81.          
  82.       a_tcp->nids_state= NIDS_DATA;
  83.     }
  84.       }
  85.       // return;

  86.     }
  87.   }
  88.