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

PCAP Linux

05.11.2013, 07:22. Показов 2106. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня, уважаемые!

Вопрос такого плана. При перехвате пакетов что-то странное в флагами. Компилировалось, запускалась на дебиане (2.6.32-5-686, pcap 1.1.1-2+squeeze1) - работало, были пакетики и с флагами S и F и А - TCP сессия нормально собиралась. Сейчас пересобрано на Oracle Linux (2.6.32-100.34.1.el6uek.x86_64, pcap 1.0.0-6.20091201git117cb5.el6.x86_64) - пакеты только с F покаывает или только с R. Причем, F есть в каждом пакете (скачиваю файл - сыпет кучу пакетов, в каждом установлен F).. в чем грабли?.. Может я чего не знаю?...

Благодарю.

Добавлено через 15 минут
Добавочка - проверил на другом дебиане (3.2.0-4-amd64, рсар 1.3.0-1) - такая же фигня как на оракле.. Т.е. получается - на 64-битных системах такая штука выходит.. а на 32-битной - нормально все.. Что не так делаю?..
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.11.2013, 07:22
Ответы с готовыми решениями:

ООП дизайн и pcap
Добрый день. Задача - фильтровать пакеты из pcap файла по заданной пользователем строке. Все бы ничего, но в последующем предстоит...

PCap и получение html кода
Добрый день. Делаю достаточно крупную систему, одним из компонентов которой является прослушивание http-трафика. Использую для этого...

PCAP и связанные с ним ошибки
Доброго времени суток. Использую PCAP, чтобы снифать пакеты в своей программе. Она работает, однако есть одна неприятная особенность. ...

4
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
05.11.2013, 11:54
Раз кода нет, то наверное вы ждете ответа типа "да, в библиотеке жуткий баг"?
Давайте тогда на tcpdump 'tcp[tcpflags] & tcp-ack != 0' с проблемной системы подивимся.
0
1 / 1 / 0
Регистрация: 15.11.2012
Сообщений: 36
05.11.2013, 13:22  [ТС]
ну, нет, не рассчитываю. Хотел дописать вроде "что выложить для уточнения?".. но подумал что лишнее - и так понятно что надо что-то. весть код то длинно будет.. может какой конкретный участок нужно..

Вот момент установки фильтра (но тут вроде все просто. 3 фиксированных адреса и один из к.строки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    strcpy(filter, "(host 89.218.117.254 or 192.168.240.2 or 192.168.253.10 or ");
    strcat(filter, argv[2]);
    strcat(filter, ")");
 
        if(pcap_compile(descr, &fp, filter, 0, netp) == -1)
        {
            log1("Error calling pcap_compile\n");
            return 0;
        }
 
        if(pcap_setfilter(descr,&fp) == -1)
        {
            log1("Error setting filter\n");
            return 0;
        }
 
    pcap_loop(descr,-1,packet_handler,NULL);

вот функция обратного вызова (тоже ничего мудреного. скелет из какого-то примера):

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
void packet_handler(u_char *args,
                    const struct pcap_pkthdr* pkthdr,
                    const u_char* packet
                    )
{
 
    struct sniff_ethernet *ethernet;
    struct sniff_ip *ip;
    struct sniff_tcp *tcp;
    char *payload;
 
 
    ethernet = (struct sniff_ethernet*)( packet );
    ip   = (struct sniff_ip*)( packet + size_ethernet );
    tcp  = (struct sniff_tcp*)( packet + size_ethernet + size_ip );
    payload  = (char *)( packet + size_ethernet + size_ip + size_tcp );
 
 
    if (ip->ip_p != 6)
        return;
 
    char src[16];
    char dst[16];
 
    strcpy(src, (const char *)inet_ntoa(ip->ip_src));
    strcpy(dst, (const char *)inet_ntoa(ip->ip_dst));
 
    u_short sport = ntohs(tcp->th_sport);
    u_short dport = ntohs(tcp->th_dport);
    u_short ip_len = ntohs(ip->ip_len);
    u_short tcp_off;
 
    u_short tcp_len = ip_len - (ip->ip_hl*4) - (tcp->th_off*4);
 
 
    unsigned char *p;
    char flags[7] = "123456", *pf;
    int i, idx, cnt = 0, dir;
 
 
    if (dport==22 || sport==22)
        return;
 
std::cout << src << ":" << sport << " - "<< dst << ":" << dport << " - ip_len: " << (1 * ip->ip_len) << "  ip_hlen: "<< (ip->ip_hl*4) << "  tcp_offset: " << (tcp->th_off*4) << "   tcp_len: " << tcp_len << "\r\n";
 
 
    char buf[16] = {0}; 
 
    int tmp_id;
 
 
            p = (unsigned char  *)(packet);
 
            tcp_off = (tcp->th_off-5)*4;
 
            pf = flags;
            *(pf+5) = (tcp->th_flags & TH_FIN  ? 'F' : '.');
            *(pf+4) = (tcp->th_flags & TH_SYN  ? 'S' : '.');
            *(pf+3) = (tcp->th_flags & TH_RST  ? 'R' : '.');
            *(pf+2) = (tcp->th_flags & TH_PSH  ? 'P' : '.');
            *(pf+1) = (tcp->th_flags & TH_ACK  ? 'A' : '.');
            *(pf+0) = (tcp->th_flags & TH_URG  ? 'U' : '.');
 
std::cout << src << " - " << dst << " f:" << flags << " seq:" << tcp->th_seq << " ask:" << tcp->th_ack << "\r\n";
 
            if ( (tcp->th_flags & TH_SYN) || (tcp->th_flags & TH_FIN) )
            {
//printf( "%s:%d - %s:%d f:%s %d %lu %lu \r\n",  src, sport, dst, dport, flags , tcp_len, tcp->th_seq , tcp->th_ack );
            }
 
}
да, константы флагов

C++
1
2
3
4
5
6
7
8
9
10
11
#define TH_FIN 0x01
#define TH_SYN 0x02
#define TH_RST 0x04
#define TH_PSH 0x08
#define TH_ACK 0x10
#define TH_URG 0x20
#define TH_ECE 0x40
#define TH_CWR 0x80
#define TH_FLAGS \
    (TH_FIN|TH_SYN|TH_RST|\
     TH_ACK|TH_URG|TH_ECE|TH_CWR)
Вывод получаем типа:

Setting filter: (host 192.168.240.2 or 192.168.253.10 or 193.31.204.242)
88.198.251.1:41372 - 192.168.253.10:80 - ip_len: 15360 ip_hlen: 20 tcp_offset: 0 tcp_len: 40
88.198.251.1 - 192.168.253.10 f:...R.. seq:2886142310 ask:78774133129888
192.168.253.10:80 - 88.198.251.1:41372 - ip_len: 15360 ip_hlen: 20 tcp_offset: 0 tcp_len: 40
192.168.253.10 - 88.198.251.1 f:...R.. seq:12467944429666079195 ask:178707685053088
88.198.251.1:41371 - 192.168.253.10:80 - ip_len: 15360 ip_hlen: 20 tcp_offset: 0 tcp_len: 40
88.198.251.1 - 192.168.253.10 f:...R.. seq:777512579 ask:256422570427040
192.168.253.10:80 - 88.198.251.1:41371 - ip_len: 15360 ip_hlen: 20 tcp_offset: 0 tcp_len: 40
192.168.253.10 - 88.198.251.1 f:...R.. seq:3411448696976447707 ask:120850180608672
88.198.251.1:41372 - 192.168.253.10:80 - ip_len: 13312 ip_hlen: 20 tcp_offset: 0 tcp_len: 32
88.198.251.1 - 192.168.253.10 f:.....F seq:11136999301220600166 ask:43763351163008
88.198.251.1:41371 - 192.168.253.10:80 - ip_len: 13312 ip_hlen: 20 tcp_offset: 0 tcp_len: 32
88.198.251.1 - 192.168.253.10 f:.....F seq:16843489936036849283 ask:267376528461952
88.198.251.1:41371 - 192.168.253.10:80 - ip_len: 59393 ip_hlen: 20 tcp_offset: 0 tcp_len: 468
88.198.251.1 - 192.168.253.10 f:.....F seq:16843489936036849283 ask:182147197442176
192.168.253.10:80 - 88.198.251.1:41371 - ip_len: 13312 ip_hlen: 20 tcp_offset: 0 tcp_len: 32
192.168.253.10 - 88.198.251.1 f:.....F seq:16382097098796964059 ask:25474357006464

и вот такие ....F до конца скачиваемого файла..

на 32хбитной все было красиво.
0
1 / 1 / 0
Регистрация: 15.11.2012
Сообщений: 36
07.11.2013, 10:10  [ТС]
Проблема пока не решена, но выяснено следующее:
без установки фильтра pcap работает.. но! на eth0 IP и порты правильно показываются, а на eth1 - че попало лезет.. При этом tcpdump нормально адреса показывает.. ну не может же софтина на eth0 правильно адрес декодировать а на eth1 неправильно...
А с фильтрами ни моя софтина, ни tcpdump не работают - пусто..
Еще момент - если tcpdump не указать -n то тоже пустоту выдает....
чето лыжи не едут...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.11.2013, 13:23
У меня такое не воспроизводиться, увы. И ваш код (вместо непоказанных sniff_xxx взял netinet/{ip|tcp}.h) вполне работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.11.2013, 13:23
Помогаю со студенческими работами здесь

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

Как подключить pcap.h и другое из winpcap
В общем скачал winpcap, после его установки есть только rpcapd.exe, который не пойму что делает. На компьютере pcap.h нету, предполагаю,...

Как извлечь данные из pcap-файла?
Как извлечь данные из pcap-файла? Всем доброго времени суток! Мне необходимо сделать программу, которая извлекает все файлы, которые...

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

Обращение в неправильный участок памяти, используя структуры и pcap.h
Суть в чем: Есть программка, которая использует libpcap. При получении нового пакета функцией: pcap_t *adhandle; struct pcap_pkthdr...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru