Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/48: Рейтинг темы: голосов - 48, средняя оценка - 4.92
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23

Анализ IP пакетов

28.10.2013, 18:14. Показов 9230. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю фильтр IP пакетов. Фильтрация идет по ключевым словам, которые задаются пользователем. Если в пакете будет обнаружено какое-либо ключевое слово, нужно запретить дальнейший прием любых пакетов с адреса-отправителя этого пакета.
Для сниффера использую библиотеку Winsock2. На данный момент мой сниффер умеет просматривать входящие пакеты и читать всё, что находится в их заголовке. Но как мне просматривать данные? Пробовал читать всё то, что находится после заголовка пакета, но в этом случае я вижу только всякие крокозябры.

Добавлено через 30 минут
Например, если я загружаю страницу http://en.wikipedia.org/wiki/I... ocol_suite, то в каких-то пакетах я должен видеть текст этой страницы ( пусть, не по порядку, с тегами и т.д., но все таки должен!).
Или я что-то недопонимаю?

И еще один вопрос появился. Как мне блокировать пакеты от определенного IP адреса?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.10.2013, 18:14
Ответы с готовыми решениями:

Задача передачи пакетов данных: смоделировать процесс обслуживания 5000 пакетов
Господа, добрый вечер. Пожалуйста, помогите с задачей: Система передачи данных обеспечивает передачу пакетов данных из пункта А в...

Потеря 50% пакетов через роутер и отброс пакетов
Добрейшего времени суток , имеется проблема - потеря пакетов стремящаяся к 50% через роутер (eltex NTU-RG-1402G-W),выглядит это сначала как...

Анализ ценных бумаг (построить Гистограмму и провести анализ)
Здравствуйте! Помогите пожалуйста разобраться с заданием. Для исходных данных нужно определить влияние даты покупки ценной бумаги...

17
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.10.2013, 20:37
Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Делаю фильтр IP пакетов. Фильтрация идет по ключевым словам, которые задаются пользователем. Если в пакете будет обнаружено какое-либо ключевое слово, нужно запретить дальнейший прием любых пакетов с адреса-отправителя этого пакета.
Сразу вопрос - почему IP, а не TCP ?
Ведь на уровне IP придется возиться со сбором пакетов (которые могут приходить
не в том порядке), а еще будут проблемы с шифрованными IPSec и VPN...
Фильтровать трафик на уровне TCP на порядок проще.

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Для сниффера использую библиотеку Winsock2. На данный момент мой сниффер умеет просматривать входящие пакеты и читать всё, что находится в их заголовке.
Подозреваю, используется promiscuous mode, так ?

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Но как мне просматривать данные? Пробовал читать всё то, что находится после заголовка пакета, но в этом случае я вижу только всякие крокозябры.
Так это gzip, скорее всего. Его тоже нужно разжимать.
То есть, должно быть что-то типа конвейера: приняли пакеты, составили из них TCP-поток,
разжали его (gzip/zlib/deflate и т.п.), убрали всякие chunk-и из HTTP-потока, и только после
этого можно анализировать контент.

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Как мне блокировать пакеты от определенного IP адреса?
На уровне winsock - никак.
1
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23
28.10.2013, 21:20  [ТС]
Спасибо за ответы!

Цитата Сообщение от Убежденный Посмотреть сообщение
Сразу вопрос - почему IP, а не TCP ?
Ведь на уровне IP придется возиться со сбором пакетов (которые могут приходить
не в том порядке), а еще будут проблемы с шифрованными IPSec и VPN...
Фильтровать трафик на уровне TCP на порядок проще.
Да, Вы правы, лучше буду это на транспортном уровне делать. Просто в сетевом программировании я еще зеленый

Цитата Сообщение от Убежденный Посмотреть сообщение
Подозреваю, используется promiscuous mode, так ?
Именно так. в этом есть какие-то подводные камни?

Цитата Сообщение от Убежденный Посмотреть сообщение
На уровне winsock - никак.
Подскажите, пожалуйста, как мне это реализовать? Что почитать? Просто программа должна уметь делать это.
Хм, сейчас еще раз посмотрел то, что я прочитал в пакетах.. Я,конечно, могу ошибаться, но моя программа получила этот пакет после того,как его получил браузер
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
28.10.2013, 22:00
Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Просто в сетевом программировании я еще зеленый
Значит, рано еще за фильтры трафика браться.

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Именно так. в этом есть какие-то подводные камни?
Есть. Promiscuous mode - это только для прослушки, модифицировать трафик с
его помощью нельзя.

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Подскажите, пожалуйста, как мне это реализовать?
TCP-редиректор (подмена адреса в команде connect) + локальный прокси, который
будет фильтровать трафик и отдавать его браузеру. Это типовое и многократно
проверенное решение, которое широко используется всякими антивирусами, спам-фильтрами,
программами родительского контроля и т.п. На роль редиректора обычно выбирают
TDI-фильтр или WFP-callout (последнее обязательно для Windows 8 и выше).
Оба эти решения - драйверные, работают в режиме ядра. Есть еще LSP, но она на
Windows 8 не фильтрует уже, да и там есть другие ограничения.
Сразу Вы такое не напишете, информация 100%, на такие решения с нуля можно
вбухать кучу времени и сил (как я в свое время, например).

Есть и другие варианты, не такие эффективные, но намного более простые в реализации.

1) Запустить фильтрующий прокси на локалхосте и прописать его в настройках браузеров.

Плюсы: простота реализации, контроль содержимого веб-страниц.

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

2) Написать плагины для браузеров, которые будут выполнять фильтрацию прямо на месте,
без всяких редиректов и прокси.

Плюсы: относительная простота, контроль над DOM-страницы, контроль над HTTPS.

Минусы: у фильтрации будут те же ограничения, что и в предыдущем пункте. Кроме того,
придется осваивать науку написания плагинов для разных браузеров, что может занять
ощутимое время.

3) Похукать сетевые функции во всех нужных процессах.

Плюсы: контроль над большинством приложений, причем можно контролировать не только
TCP, но и UDP, например.

Минусы: сложность реализации (особенно в плане поддержки асинхронного I/O и некоторых
специфических функций WinSock), конфликты с антивирусами и другим софтом (например, с
программами, которые защищены протекторами или используют динамическую модификацию кода),
способ не будет работать для Modern-приложений на Windows 8 и выше, ошибка в коде,
внедренном в критический системный процесс, вызовет падение всей системы в BSOD.
0
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23
29.10.2013, 01:13  [ТС]
Да, всё гораздо сложнее, чем я изначально предполагал Но моя цель - не создание первоклассной софтины. Вообще, опыт в написании небольших сетевых приложений есть. Вот и решил что-нить по-глобальнее попробовать сделать.
Писать драйвер сейчас - не лучшая идея, тут Вы правы. Плагины тоже отпадают. То, что нужно вручную указывать адрес прокси в браузерах портит первый вариант.. Но на заметку его возьму.
Не могли бы Вы посоветовать какую либо информацию относительно 3го варианта и LSP в рамках моей темы?

Добавлено через 16 минут
Кстати, где-то видел статью про библиотеку libPcap. В подробности не вдавался, но там было написано, что она позволяет так же фильтровать трафик. Вы не знаете, могла бы мне эта библиотека помочь?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.10.2013, 10:07
Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Не могли бы Вы посоветовать какую либо информацию относительно 3го варианта
Ищите в Google по ключевым словам "перехват API".
Например:

Перехват API-функций в Windows NT/2000/XP
http://www.rsdn.ru/article/bas... ionAPI.xml

Введение в перехват API для системы команд x86
http://www.securitylab.ru/analytics/428735.php

и LSP
В сети есть несколько более-менее приличных сэмплов от Komodia и Microsoft.
А еще куча такого же добра от независимых разработчиков.

От себя добавлю, что хуки Winsock и LSP - это обманчивая простота, на самом
деле написать рабочий TDI-фильтр на порядок проще, и он будет действовать
намного более стабильно и перехватывать весь сокетный трафик, в отличие от.

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

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Кстати, где-то видел статью про библиотеку libPcap. В подробности не вдавался, но там было написано, что она позволяет так же фильтровать трафик. Вы не знаете, могла бы мне эта библиотека помочь?
Pcap - это пакетный уровень, Вам нужен транспортный.
К тому же Pcap, насколько я знаю, не позволяет выполнять фильтрацию, а только мониторинг.
1
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23
01.11.2013, 23:59  [ТС]
Сегодня наткнулся вот на этот сниффер: https://gist.github.com/silv3rm00n/5991306

Судя по коду,насколько я понимаю, должно выводиться полное содержимое всех принятых пакетов. Однако, например, при загрузке какой-нибудь веб-страницы или txt файла в логе не видно содержимого этих ресурсов. Единственная принятая информация (помимо заголовков) - это информация следующего рода:
Кликните здесь для просмотра всего текста
NOTIFY * HTTP/1.
1..HOST: 239.255
.255.250:1900..C
ACHE-CONTROL: ma
x-age=100..LOCAT
ION: http://192.
168.0.1:1900/igd
.xml..NT: upnp:r
ootdevice..NTS:
ssdp:alive..SERV
ER: ipos/7.0 UPn
P/1.0 TL-WR740N/
4.0..USN: uuid:0
60b7353-fca6-407
0-85f4-1fbfb9add
62c::upnp:rootde
vice....


и еще немного строк в непонятной кодировке, которые явно не являются тем контентом, который мне нужен. Да и суммарный размер всех принятых пакетов в десятки раз меньше загружаемой страницы или того же txt-файла.

В общем, вопрос:
Как мне все таки найти в пакетах содержимое всех загружаемых документов?

PS Функции вывода пакетов в том сниффере:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//Функции вывода TCP и UDP пакетов
void PrintTcpPacket(char* Buffer, int Size)
{
    unsigned short iphdrlen;
 
    iphdr = (IPV4_HDR *)Buffer;
    iphdrlen = iphdr->ip_header_len*4;
 
    tcpheader=(TCP_HDR*)(Buffer+iphdrlen);
 
    fprintf(logfile,"\n\n***********************TCP Packet*************************\n");
 
    PrintIpHeader( Buffer );
 
    fprintf(logfile,"\n");
    fprintf(logfile,"TCP Header\n");
    fprintf(logfile," |-Source Port : %u\n",ntohs(tcpheader->source_port));
    fprintf(logfile," |-Destination Port : %u\n",ntohs(tcpheader->dest_port));
    fprintf(logfile," |-Sequence Number : %u\n",ntohl(tcpheader->sequence));
    fprintf(logfile," |-Acknowledge Number : %u\n",ntohl(tcpheader->acknowledge));
    fprintf(logfile," |-Header Length : %d DWORDS or %d BYTES\n"
    ,(unsigned int)tcpheader->data_offset,(unsigned int)tcpheader->data_offset*4);
    fprintf(logfile," |-CWR Flag : %d\n",(unsigned int)tcpheader->cwr);
    fprintf(logfile," |-ECN Flag : %d\n",(unsigned int)tcpheader->ecn);
    fprintf(logfile," |-Urgent Flag : %d\n",(unsigned int)tcpheader->urg);
    fprintf(logfile," |-Acknowledgement Flag : %d\n",(unsigned int)tcpheader->ack);
    fprintf(logfile," |-Push Flag : %d\n",(unsigned int)tcpheader->psh);
    fprintf(logfile," |-Reset Flag : %d\n",(unsigned int)tcpheader->rst);
    fprintf(logfile," |-Synchronise Flag : %d\n",(unsigned int)tcpheader->syn);
    fprintf(logfile," |-Finish Flag : %d\n",(unsigned int)tcpheader->fin);
    fprintf(logfile," |-Window : %d\n",ntohs(tcpheader->window));
    fprintf(logfile," |-Checksum : %d\n",ntohs(tcpheader->checksum));
    fprintf(logfile," |-Urgent Pointer : %d\n",tcpheader->urgent_pointer);
    fprintf(logfile,"\n");
    fprintf(logfile," DATA Dump ");
    fprintf(logfile,"\n");
 
    fprintf(logfile,"IP Header\n");
    PrintData(Buffer,iphdrlen);
 
    fprintf(logfile,"TCP Header\n");
    PrintData(Buffer+iphdrlen,tcpheader->data_offset*4);
 
    fprintf(logfile,"Data Payload\n");
    PrintData(Buffer+iphdrlen+tcpheader->data_offset*4
    ,(Size-tcpheader->data_offset*4-iphdr->ip_header_len*4));
 
    fprintf(logfile,"\n###########################################################");
}
 
void PrintUdpPacket(char *Buffer,int Size)
{
    unsigned short iphdrlen;
 
    iphdr = (IPV4_HDR *)Buffer;
    iphdrlen = iphdr->ip_header_len*4;
 
    udpheader = (UDP_HDR *)(Buffer + iphdrlen);
 
    fprintf(logfile,"\n\n***********************UDP Packet*************************\n");
 
    PrintIpHeader(Buffer);
 
    fprintf(logfile,"\nUDP Header\n");
    fprintf(logfile," |-Source Port : %d\n",ntohs(udpheader->source_port));
    fprintf(logfile," |-Destination Port : %d\n",ntohs(udpheader->dest_port));
    fprintf(logfile," |-UDP Length : %d\n",ntohs(udpheader->udp_length));
    fprintf(logfile," |-UDP Checksum : %d\n",ntohs(udpheader->udp_checksum));
 
    fprintf(logfile,"\n");
    fprintf(logfile,"IP Header\n");
 
    PrintData(Buffer,iphdrlen);
 
    fprintf(logfile,"UDP Header\n");
 
    PrintData(Buffer+iphdrlen,sizeof(UDP_HDR));
 
    fprintf(logfile,"Data Payload\n");
 
    PrintData(Buffer+iphdrlen+sizeof(UDP_HDR) ,(Size - sizeof(UDP_HDR) - iphdr->ip_header_len*4));
 
    fprintf(logfile,"\n###########################################################");
}
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//Функция PrintData:
/*
    Print the hex values of the data
*/
void PrintData (char* data , int Size)
{
    char a , line[17] , c;
    int j;
 
    //loop over each character and print
    for(i=0 ; i < Size ; i++)
    {
        c = data[i];
 
        //Print the hex value for every character , with a space. Important to make unsigned
        fprintf(logfile," %.2x", (unsigned char) c);
 
        //Add the character to data line. Important to make unsigned
        a = ( c >=32 && c <=128) ? (unsigned char) c : '.';
 
        line[i%16] = a;
 
        //if last character of a line , then print the line - 16 characters in 1 line
        if( (i!=0 && (i+1)%16==0) || i == Size - 1)
        {
            line[i%16 + 1] = '\0';
 
            //print a big gap of 10 characters between hex and characters
            fprintf(logfile ,"          ");
 
            //Print additional spaces for last lines which might be less than 16 characters in length
            for( j = strlen(line) ; j < 16; j++)
            {
                fprintf(logfile , "   ");
            }
 
            fprintf(logfile , "%s \n" , line);
        }
    }
 
    fprintf(logfile , "\n");
}
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
02.11.2013, 02:18
Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Да и суммарный размер всех принятых пакетов в десятки раз меньше загружаемой страницы или того же txt-файла.
А Вы не думали, что это может быть gzip ?
Он ведь текст очень хорошо сжимает, разница легко может быть в несколько раз.

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Как мне все таки найти в пакетах содержимое всех загружаемых документов?
Одно из двух - или код неверный, или Вы что-то не так делаете.
Я бы выкинул всю копи-пасту и переписал бы сниффер с нуля, сведя его к
вырожденному, так сказать, случаю. Минимум кода. Обычно после этого
все довольно быстро проясняется.
0
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23
11.11.2013, 02:11  [ТС]
В общем, на данный момент программа умеет анализировать несжатый трафик. Но возникли сложности с gzip'ом.
Как я понимаю, для того, чтобы распаковать содержимое, нужно сперва собрать все пакеты, которые относятся к одному запросу.
Но как понять, какие именно пакеты нужно соединять и в какой последовательности? Пакеты ведь могут приходить не по порядку, а так же дублироваться. И как мне выявить то, что данный пакет содержит именно gzip-содержимое?
Подскажите идеи, плиз.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
11.11.2013, 02:58
Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Как я понимаю, для того, чтобы распаковать содержимое, нужно сперва собрать все пакеты, которые относятся к одному запросу.
Да, примерно так. Из IP-пакетов нужно собрать TCP-поток, затем выделить из него
HTTP-сообщения. Вообще, обычно для таких вещей пишется что-то типа стейт-машины.
На просторах интернета можно найти хорошую библиотеку, заточенную под это дело.

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Но как понять, какие именно пакеты нужно соединять и в какой последовательности?
Очень просто. Смотреть параметры IP-пакетов и TCP-сегментов.
Изучать соответствующие RFC, статьи, литературу...

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Пакеты ведь могут приходить не по порядку, а так же дублироваться.
Именно поэтому я твержу уже не первый раз (и не только здесь), что фильтровать
прикладные протоколы (HTTP, SMTP, POP3, FTP и т.п.) на IP-уровне нерационально.
Ибо кажущаяся простота, - а сниффер на базе того же promiscuous mode пишется в
несколько сотен строк, - в итоге нивелируется сложностями со сбором TCP-потока из
IP-пакетов. Если делать фильтрацию на уровне TCP, то мы сразу бы имели уже
собранный поток данных, без всяких сегментов, reassembly и дублирования пакетов.

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
И как мне выявить то, что данный пакет содержит именно gzip-содержимое?
gzip нужно выявлять на прикладном уровне, выше по стеку.
Смотрите значение HTTP-заголовка Content-Encoding, если быть точным. По спецификации, там
кроме gzip также может быть zlib (иногда встречается сырой deflate, хоть это и не по правилам),
compress (из-за патентных ограничений, которые существовали несколько лет назад, способ
компрессии стал непопулярным, последний раз я встречал его поддержку в ранних версиях
Google Chrome), еще есть возможность встретить bzip2 и sdch.
1
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23
16.11.2013, 23:38  [ТС]
Вообще, я думал, что работаю на уровне TCP. Но это уже не важно...

Копался в нете, но так и не нашел дельной инфы о том, как ловить пакеты именно на уровне TCP. Хотя куча информации о том, как ловить пакеты IP, содержащие в себе пакет TCP. Не могли бы Вы подсказать, как это сделать, какие библиотеки использовать, да и вообще, где можно об этом почитать? (Что-то мне подсказывает, что сам перехват пакетов на уровне TCP осуществляется сложнее, чем перехват пакетов уровня ниже).
И еще вопрос.. Я уже знаю, что winsock - это сетевой уровень. Однако, если создавать сокет вот с такими параметрами:
C++
1
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
то какое поведение будет у сокета в моей программе этом случае?
Просто протестировать такой сокет у меня еще не получилось - выдает ошибку, когда выполняю функцию bind, поэтому и спрашиваю.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.11.2013, 10:36
Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Копался в нете, но так и не нашел дельной инфы о том, как ловить пакеты именно на уровне TCP.
Так на этом уровне уже нет пакетов, в этом-то и соль.

Не могли бы Вы подсказать, как это сделать, какие библиотеки использовать, да и вообще, где можно об этом почитать?
Уже отвечал здесь:
Анализ IP пакетов

Что-то мне подсказывает, что сам перехват пакетов на уровне TCP осуществляется сложнее, чем перехват пакетов уровня ниже
Наоборот. Перехват на TCP (транспортный уровень) легче, так как отпадает
необходимость возиться с идентификацией и сбором IP-пакетов. Потому что никаких
пакетов на этом уровне уже нету, а лишь поток данных: столько-то байт отправлено,
столько-то байт принято, и т.д.

Я уже знаю, что winsock - это сетевой уровень.
Скорее транспортный (TCP) и сетевой (UDP, RAW).

Однако, если создавать сокет вот с такими параметрами:
C++
1
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
то какое поведение будет у сокета в моей программе этом случае?
AF_INET - это семейство адресов IPv4, SOCK_STREAM - это потоковый сокет, ну а
IPPROTO_TCP - это протокол TCP. Какие тут могут быть вопросы ?

Просто протестировать такой сокет у меня еще не получилось - выдает ошибку, когда выполняю функцию bind
Код покажите, там будет видно.
1
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23
17.11.2013, 11:46  [ТС]
Ааа, теперь начинаю въезжать Просто я себе немножко по-другому это представлял.. Ну да ладно.
Ошибка теперь выдается в другом месте, и я понимаю из-за чего. Но хотел бы по этому поводу уточнить одну деталь.
Код инициализации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
if (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
    {
        printf("%d\n",WSAGetLastError());
        return 1;
    }
 
    //Create Socket
    printf("\nCreating RAW Socket...");
    sniffer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sniffer == INVALID_SOCKET)
    {
        printf("%d\n",WSAGetLastError());
        return 1;
    }   
           local = gethostbyname("localhost");
           dest.sin_family = AF_INET;
           dest.sin_addr.S_un.S_addr    = *(DWORD* ) local->h_addr_list[0];
    dest.sin_port = 0;
 
    printf("\nBinding socket to local system and port 0 ...");
    if (bind(sniffer,(struct sockaddr *)&dest,sizeof(dest)) == SOCKET_ERROR)
    {
        printf("Error : %d.\n",WSAGetLastError());
        return 1;
    }
 
 
    unsigned long j=1;
    printf("\nSetting socket to sniff...");
           if (SOCKET_ERROR == ioctlsocket (sniffer, FIONBIO, &j))
    {
        printf("Error : %d.\n",WSAGetLastError());
        return 1;
    }
Получение трафика:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
do
    {
        mangobyte = recv(sniffer , Buffer , 65536 , 0 );
 
        if(mangobyte > 0)
        {
            ProcessPacket(Buffer, mangobyte);
        }
        else
        {
            printf("Error : %d.\n",WSAGetLastError());
        }
    }
    while (mangobyte > 0);
Выдает ошибку 10057 "Socket is not connected". Да, TCP работает с предварительным подключением к серверу, от которого ожидается прием. Но к какому серверу мне подключаться в данном случае? Я ведь принимаю весь входящий трафик. Или мне нужно при приеме каждый раз подключаться к каждой машине, которая мне что-то отсылает,а после приема от нее отключаться?

Добавлено через 7 минут
PS ошибка в функции recv
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.11.2013, 12:31
Что должен делать приведенный код ?
0
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23
17.11.2013, 12:32  [ТС]
Программа должна принимать входящий TCP поток. Как я понимаю, нужно поставить сокет в режим прослушки (listen), а после в цикле ждать соединения, и функцией accept его принимать. Но на функции accept код виснет, хотя я загружаю с нета различную информацию.

Изменил код.
Инициализация:
i
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
f (WSAStartup(MAKEWORD(2,2), &wsa) != 0)
    {
        printf("%d\n",WSAGetLastError());
        return 1;
    }
 
    //Create Socket
    printf("\nCreating RAW Socket...");
    sniffer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sniffer == INVALID_SOCKET)
    {
        printf("%d\n",WSAGetLastError());
        return 1;
    }
    dest.sin_family = AF_INET;
        dest.sin_addr.S_un.S_addr = INADDR_ANY;     //  = *(DWORD* ) local->h_addr_list[0];
    dest.sin_port = 0;
 
    printf("\nBinding socket to local system and port 0 ...");
    if (bind(sniffer,(struct sockaddr *)&dest,sizeof(dest)) == SOCKET_ERROR)
    {
        printf("Error : %d.\n",WSAGetLastError());
        return 1;
    }
 
        if(listen(sniffer, SOMAXCONN) == SOCKET_ERROR)
        {
                printf("Error : %d.\n",WSAGetLastError());
        return 1;
        }
Прием трафика:

C++
1
2
3
4
5
6
7
8
SOCKET cSocket;
        struct sockaddr cAddr;
        int addrSize = sizeof(cAddr);
    
    do
    {
                cSocket = accept(sniffer, &cAddr,&addrSize)
                ...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.11.2013, 12:48
Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Но на функции accept код виснет
Ну правильно. Функция accept ждет входящих подключений.

Цитата Сообщение от Дядя Сэм Посмотреть сообщение
хотя я загружаю с нета различную информацию.
А каким боком тут загрузка информации из инета ?
Вы создали сокет, затем забиндили его на локальный адрес/порт, теперь
функция accept ждет на него подключений. Трафик, идущий через браузеры и
другие приложения, этого никаким образом не касается.
0
0 / 0 / 0
Регистрация: 02.03.2010
Сообщений: 23
17.11.2013, 13:10  [ТС]
Подскажите пожалуйста, как мне сделать так, чтобы этот сокет просматривал входящий трафик, который проходит через различные приложения? Можно ли это сделать аналогично тому, как это делает IP-сокет (т.е. инициализировали его, привязали к локальному адресу, поставили в неблокирующий режим и в бесконечном цикле принимаем трафик, приходящий на локальную машину) ?
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.11.2013, 13:22
Цитата Сообщение от Дядя Сэм Посмотреть сообщение
Подскажите пожалуйста, как мне сделать так, чтобы этот сокет просматривал входящий трафик, который проходит через различные приложения?

Можно ли это сделать аналогично тому, как это делает IP-сокет (т.е. инициализировали его, привязали к локальному адресу, поставили в неблокирующий режим и в бесконечном цикле принимаем трафик, приходящий на локальную машину) ?
Нет. TCP - это протокол, который подразумевает соединение с определенным адресом.
Соединение образует уникальную комбинацию адресов и портов на клиенте и сервере:
source address / source port <--> destination address / destination port, ее еще называют "4-tuple".
Операции, которые выполняются над сокетом, относятся только к соединению которое на нем
установлено. Другие приложения могут создавать (или принимать) свои подключения, в результате
каждое подключение является как бы отдельным "каналом", который изолирован от других.

Вообще, не знаю, уместно ли здесь писать о таких вещах, это ведь основы сокетов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2013, 13:22
Помогаю со студенческими работами здесь

Анализ сетевого трафика используя регрессионный анализ
Не знал, куда написать, MatLAb очень близок этому инструменту (Weka) Многие в курсе, что из сетевого пакета можно достать 41 атрибут для...

Отлов пакетов
Можно средствами пб, отлавливать пакеты?

Перехват пакетов
Подскажите пожалуйста, как в делфи можно работать с пакетами в браузере?Сколько не искал - ничего не нашел.

внедрение пакетов
Здравствуйте, уважаемые знатоки,кто то сталкивался с внедрением самописных пакетов в обмен между клиентом и сервером на шарпе?(наподобии...

Потеря пакетов
Добрый день, мой компьютер получает интернет по такой схеме Модем 4G воткнут в роутер, роутер раздаёт вайфай, Нетбук ловит его и по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru