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

PCAP Linux

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

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

Вопрос такого плана. При перехвате пакетов что-то странное в флагами. Компилировалось, запускалась на дебиане (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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2013, 07:22
Ответы с готовыми решениями:

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

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

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

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

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

Вот момент установки фильтра (но тут вроде все просто. 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  [ТС] 4
Проблема пока не решена, но выяснено следующее:
без установки фильтра pcap работает.. но! на eth0 IP и порты правильно показываются, а на eth1 - че попало лезет.. При этом tcpdump нормально адреса показывает.. ну не может же софтина на eth0 правильно адрес декодировать а на eth1 неправильно...
А с фильтрами ни моя софтина, ни tcpdump не работают - пусто..
Еще момент - если tcpdump не указать -n то тоже пустоту выдает....
чето лыжи не едут...
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
07.11.2013, 13:23 5
У меня такое не воспроизводиться, увы. И ваш код (вместо непоказанных sniff_xxx взял netinet/{ip|tcp}.h) вполне работает.
0
07.11.2013, 13:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.11.2013, 13:23
Помогаю со студенческими работами здесь

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

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

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

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

Установка Qt на Linux для кросс-компиляции: Linux 32/64 Windows 32/64
В силу объективных причин пришлось перейти на Linux, но столкнулся с проблемой установки окружения...

Компиляция Builder'овского проекта под Linux, (и освоение Linux после Builder'a)
Есть не очень маленький проект, написанный в винде на Builder'e. 1) Сложно ли его будет...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru