Скачал где-то пример снифера. Он базируется на 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();
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Добрый день! Подскажите, как использовать функции из Go в программе на C++? Буду благодарен за простой и доступный пример
Вывод случайного элемента регулируется событиемПри каждом вызове элемент выбирается один и тот же, если использовать подобную понятную...
Если объявить переменную через let в строке, вызывающей ошибку ReferenceError, то потом использовать это имя переменной что-то не получаетсяdelete не помогает