c++ снифер не видит GET запросы

256
19 марта 2017, 06:08

Скачал где-то пример снифера. Он базируется на ioctlsocket( s, SIO_RCVALL, & flag ) Вопрос, почему снифер не ловит GET запросы, а ловит лишь ответы? Может ли он ловить так же запросы? Трассировал что б убедится что GET-запроса нету, его и правда нету.

Т.е. Заголовок ответ HTTP\1.0 200 ОК... приходит, а его запрос GET / не приходит.

В журнале хакер https://xakep.ru/2006/03/20/30601/ нашёл статью, там так и написано - входящий трафик. А можно ли поймать "исходящий"? Если добавить setsockopt то можно сделать бинд на 127.0.0.1. У меня прокси - пробовал биндить на адрес прокси - пишет ошибку.

На всякий случай, привожу кусок кода

void sniffing::createsocket( int i )
{
  //----------Startup--------
  if ( WSAStartup( MAKEWORD( 2, 2 ), & wsadata ) )
  {
    printf( "Initialized error" );
    WSACleanup();
    exit( 1 );
  }
  else
    printf( wsadata.szSystemStatus );
  //-------------------------
  //---------Socket----------
  s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
  if ( s == INVALID_SOCKET )
  {
    printf( "Can`t create sock\n" );
    WSACleanup();
    exit( 2 );
  }
  printf( "\nCreate sock\n" );
  //-------------------------
  //---------Sockadd--------
  phe = gethostbyname( name );
  ZeroMemory( & sa, sizeof( sa ) );
  sa.sin_family = AF_INET;
  sa.sin_addr.s_addr = ( ( struct in_addr * ) phe->h_addr_list[i] )->s_addr;
  //------------------------
  //--------bind------------
  if ( bind( s, ( SOCKADDR * ) & sa, sizeof( SOCKADDR ) ) )
  {
    printf( "Can`t bind socket" );
    WSACleanup();
    closesocket( s );
    exit( 3 );
  }
  printf( "Socket bind\n" );
  //-------------------------
  flag = 1;
  if ( !ioctlsocket( s, SIO_RCVALL, & flag ) ) printf( "sniffing mode\n" );
  else
  {
    printf( "Error sniffing mode" ); exit( 4 );
  }
}

void sniffing::sniff( int proto /*Порт с которого будут отлавливаться сообщения*/, int pack )
{
  int i, tim, stim, lock_p;
  stim = time(0);
  k = 0;
  log = fopen( "log.txt", "wb" );
  while ( k < pack )
  {
    count = recv( s, Buffer, sizeof( Buffer ), 0 );
    if ( count >= sizeof( IPHeader ) )
    {
      IPHeader * ipHdr = ( IPHeader * ) ( Buffer );
      TCP_HEADER * tcpHdr = ( TCP_HEADER * ) ( Buffer + sizeof( IPHeader ) );
      if ( ntohs( tcpHdr->source ) == proto || ntohs( tcpHdr->dest ) == proto || proto == 0
            || lock_p ==  tcpHdr->source   || tcpHdr->dest == lock_p )
      {
        k++;
        lbyte = ipHdr->iph_length >> 8;
        hbyte = ipHdr->iph_length;
        hbyte = hbyte + lbyte;
        sa.sin_addr.s_addr = ipHdr->iph_src;
        strcpy( src, inet_ntoa( sa.sin_addr ) );

        sa.sin_addr.s_addr = ipHdr->iph_dest;
        strcpy( dst, inet_ntoa( sa.sin_addr ) );
        lock_p = tcpHdr->dest;
        tim = time(0) - stim;
        printf("IP Source: %s:%d Destantion: %s:%d TTL: %d Size: %d\r\nHeaderLenght : % d | CWR % d | ECE % d | URG % d | ACK % d | PSH % d | RST % d | SYN % d | FIN % d |\r\nSEQ:% u ACK SEQ: %u |Window:% d CheckSum:%x URG ptr:%d tim:%d",
             src, ntohs( tcpHdr->source ), dst,ntohs( tcpHdr->dest ), ipHdr->iph_ttl, hbyte,
             tcpHdr->headlen * 4, tcpHdr->cwr, tcpHdr->ece, tcpHdr->urg, tcpHdr->ack, tcpHdr->psh, tcpHdr->rst, tcpHdr->syn,
             tcpHdr->fin, tcpHdr->seq, tcpHdr->ack_seq, tcpHdr->window, tcpHdr->check, tcpHdr->urg_ptr, tim );
        fprintf( log, "IP Source: %s:%d Destantion: %s:%d TTL: %d Size: %d\r\nHeaderLenght:%d|CWR%d|ECE%d|URG%d|ACK%d|PSH%d|RST%d| SYN % d | FIN%d|\r\nSEQ:% u ACK SEQ: %u |Window:%d CheckSum:% x URGptr:%d tim:%d",
             src, ntohs( tcpHdr->source ), dst,ntohs( tcpHdr->dest ), ipHdr->iph_ttl, hbyte,
             tcpHdr->headlen * 4, tcpHdr->cwr, tcpHdr->ece, tcpHdr->urg, tcpHdr->ack, tcpHdr->psh, tcpHdr->rst, tcpHdr->syn,
             tcpHdr->fin, tcpHdr->seq, tcpHdr->ack_seq, tcpHdr->window, tcpHdr->check, tcpHdr->urg_ptr, tim );
        fprintf( log, "\r\n------------------DATA------------------------\r\n" );
        for ( i = sizeof( TCP_HEADER ) + sizeof( IPHeader ); i < count; i++ ){
          fprintf( log, "%c", Buffer[i] );
          //printf("%c", Buffer[i]);
          };
        fprintf( log, "\r\n\r\n------------------------------------------------------------------------------------------------------------\r\n\r\n" );
        fflush(log);
        printf( "%d\r", k );
      }
    }
  }
  printf( "\nSniffing end press any key" );
  getch();
}
READ ALSO
Как в C++ использовать код на Go?

Как в C++ использовать код на Go?

Добрый день! Подскажите, как использовать функции из Go в программе на C++? Буду благодарен за простой и доступный пример

288
Выбор каждый раз нового элемента из массива

Выбор каждый раз нового элемента из массива

Вывод случайного элемента регулируется событиемПри каждом вызове элемент выбирается один и тот же, если использовать подобную понятную...

326
jquery onclick with parameters

jquery onclick with parameters

ЗдравствуйтеИмеется какая то кнопка

295
Использование let в REPL

Использование let в REPL

Если объявить переменную через let в строке, вызывающей ошибку ReferenceError, то потом использовать это имя переменной что-то не получаетсяdelete не помогает

238