Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для Jaxmackey
5 / 5 / 2
Регистрация: 04.10.2013
Сообщений: 142

Просмотр пакета перехваченного через снифер

15.10.2016, 18:05. Показов 2436. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые! Я недавно начал самостоятельно изучать сокеты. Пошарив в интернете я нашел такой вот код более менее в нем разобрался только появился вопрос? Я точно не понял один момент. а конкретно: как расшифровать пакет?
посмотреть что в нем? то есть увидеть его содержимое. Я так понял что содержимое пакета будет в одном из полей структуры IPHeader.. Разъясните этот момент если не сложно. Данный код работает у меня без ошибок.
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
 
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
#pragma comment (lib,"ws2_32.lib")
// Буфер для приёма данных
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
 
                              //Структура заголовка IP-пакета
 
typedef struct IPHeader {
    UCHAR   iph_verlen;   // версия и длина заголовка
    UCHAR   iph_tos;      // тип сервиса
    USHORT  iph_length;   // длина всего пакета
    USHORT  iph_id;       // Идентификация
    USHORT  iph_offset;   // флаги и смещения
    UCHAR   iph_ttl;      // время жизни пакета
    UCHAR   iph_protocol; // протокол
    USHORT  iph_xsum;     // контрольная сумма
    ULONG   iph_src;      // IP-адрес отправителя
    ULONG   iph_dest;     // IP-адрес назначения
} IPHeader;
 
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
 
void main()
{
    WSADATA     wsadata;   // Инициализация WinSock.
    SOCKET      s;         // Cлущающий сокет.
    char        name[128]; // Имя хоста (компьютера).
    HOSTENT*    phe;       // Информация о хосте.
    SOCKADDR_IN sa;        // Адрес хоста
    IN_ADDR sa1;        //
    unsigned long        flag = 1;  // Флаг PROMISC Вкл/выкл.
 
                                    // инициализация
    WSAStartup(MAKEWORD(2, 2), &wsadata);
    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    gethostname(name, sizeof(name));
    phe = gethostbyname(name);
    ZeroMemory(&sa, sizeof(sa));
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
    bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
 
    // Включение promiscuous mode.
    ioctlsocket(s, SIO_RCVALL, &flag);
 
    // Бесконечный цикл приёма IP-пакетов.
    while (!_kbhit())
    {
        int count;
        count = recv(s, Buffer, sizeof(Buffer), 0);
        // обработка IP-пакета
        if (count >= sizeof(IPHeader))
        {
            IPHeader* hdr = (IPHeader *)Buffer;
            //Начинаем разбор пакета...
 
            strcpy(src, "Пакет: ");
            CharToOemA(src, dest);
            printf(dest);
            // Преобразуем в понятный вид адрес отправителя.
            printf("From ");
            sa1.s_addr = hdr->iph_src;
            printf(inet_ntoa(sa1));
 
            // Преобразуем в понятный вид адрес получателя.
            printf(" To ");
            sa1.s_addr = hdr->iph_dest;
            printf(inet_ntoa(sa1));
 
            // Вычисляем протокол. Полный список этих констант
            // содержится в файле winsock2.h
            printf(" Prot: ");
            if (hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
            if (hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
 
            // Вычисляем размер. Так как в сети принят прямой порядок
            // байтов, а не обратный, то прийдётся поменять байты местами.
            printf("Size: ");
            lowbyte = hdr->iph_length >> 8;
            hibyte = hdr->iph_length << 8;
            hibyte = hibyte + lowbyte;
            printf("%s", itoa(hibyte, ds, 10));
 
            // Вычисляем время жизни пакета.
            printf(" TTL:%s", itoa(hdr->iph_ttl, ds, 10));
            printf("\n");
 
        }
    }
 
    closesocket(s);
    WSACleanup();
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.10.2016, 18:05
Ответы с готовыми решениями:

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

Просмотр логов сети через роутер в режиме реального времени через Putty
Драсть ребят. Такая тема, мне нужно реализовать систему просмотра логов того какие закачки и хосты юзаются пользователями вайфай роутера и...

Обновление пакета через portupgrade в FreeBSD
Здравствуйте. Вопрос такой возник. Пытаюсь обновить установленный пакет, пусть это будет postfix версии 1.1.10. Порт...

13
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
15.10.2016, 20:32
Цитата Сообщение от Jaxmackey Посмотреть сообщение
то есть увидеть его содержимое. Я так понял что содержимое пакета будет в одном из полей структуры IPHeader
ip заголовок не относится к тем данным, которые передаются транспортным уровнем. То есть по сути данные должны лежать дальше, после заголовка ip, но если пакет относился к, например, к tcp протоколу, то там соответственно будет лежат заголовок tcp и только лишь потом данные. Насколько я помню - заголовок у tcp переменной длинны, так что для того, что бы вытащить данные, нужно распарсить еще и заголовок транспортного уровня и только потом узнать где лежат данные.
0
6 / 6 / 3
Регистрация: 09.12.2015
Сообщений: 31
15.10.2016, 20:40
Jaxmackey, прежде чем кодить изучи матчасть, что то вроде такого
0
 Аватар для Jaxmackey
5 / 5 / 2
Регистрация: 04.10.2013
Сообщений: 142
15.10.2016, 20:49  [ТС]
Вованя, Я примерно понимаю о чем вы.. каким образом парсить заголовок транспортного уровня??UCHAR iph_verlen - это и есть этот заголовок?? или типо структура? или буфер с char??объясните..(

Добавлено через 8 минут
chloroform, Спасибо конечно я ознакомлюсь. Проблема не решена. Вы знаете решение проблемы?
0
6 / 6 / 3
Регистрация: 09.12.2015
Сообщений: 31
15.10.2016, 21:42
Jaxmackey, для работы со сетевыми пакетами на самом низком уровне пригодятся специализированные либы, например - winpcap , на этой либе работает Wireshark, просто подключается к проекту, есть доки и примеры.
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
15.10.2016, 23:04
Jaxmackey, tcp header
0
 Аватар для Jaxmackey
5 / 5 / 2
Регистрация: 04.10.2013
Сообщений: 142
15.10.2016, 23:54  [ТС]
По повду содержимого пакета разобрался
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>
#include <fcntl.h>
#include <io.h>
#include <sys\types.h>
#include <sys\stat.h>
#include <errno.h>
 
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
#pragma comment (lib,"ws2_32.lib")
// Буфер для приёма данных
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
 
                              //Структура заголовка IP-пакета
 
typedef struct IPHeader {
    UCHAR   iph_verlen;   // версия и длина заголовка
    UCHAR   iph_tos;      // тип сервиса
    USHORT  iph_length;   // длина всего пакета
    USHORT  iph_id;       // Идентификация
    USHORT  iph_offset;   // флаги и смещения
    UCHAR   iph_ttl;      // время жизни пакета
    UCHAR   iph_protocol; // протокол
    USHORT  iph_xsum;     // контрольная сумма
    ULONG   iph_src;      // IP-адрес отправителя
    ULONG   iph_dest;     // IP-адрес назначения
} IPHeader;
 
char src[10];
char dest[10];
char ds[40];
unsigned short lowbyte;
unsigned short hibyte;
void PrintTcpPacket(char* Buffer, int Size);
void main()
{
    WSADATA     wsadata;   // Инициализация WinSock.
    SOCKET      s;         // Cлущающий сокет.
    char        name[128]; // Имя хоста (компьютера).
    HOSTENT*    phe;       // Информация о хосте.
    SOCKADDR_IN sa;        // Адрес хоста
    IN_ADDR sa1;        //
    unsigned long        flag = 1;  // Флаг PROMISC Вкл/выкл.
 
                                    // инициализация
    WSAStartup(MAKEWORD(2, 2), &wsadata);
    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    gethostname(name, sizeof(name));
    phe = gethostbyname(name);
    ZeroMemory(&sa, sizeof(sa));
    sa.sin_family = AF_INET;
    sa.sin_addr.s_addr = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
    bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
 
    // Включение promiscuous mode.
    ioctlsocket(s, SIO_RCVALL, &flag);
    
    // Бесконечный цикл приёма IP-пакетов.
    while (!_kbhit())
    {
        int count;
        count = recv(s, Buffer, sizeof(Buffer), 0);
        // обработка IP-пакета
        if (count >= sizeof(IPHeader))
        {
            IPHeader* hdr = (IPHeader *)Buffer;
            //Начинаем разбор пакета...
            if (hdr->iph_protocol == IPPROTO_TCP)
            {
                strcpy(src, "Пакет: ");
                CharToOemA(src, dest);
                printf(dest);
                // Преобразуем в понятный вид адрес отправителя.
                printf("From ");
                sa1.s_addr = hdr->iph_src;
                printf(inet_ntoa(sa1));
 
                // Преобразуем в понятный вид адрес получателя.
                printf(" To ");
                sa1.s_addr = hdr->iph_dest;
                printf(inet_ntoa(sa1));
 
                // Вычисляем протокол. Полный список этих констант
                // содержится в файле winsock2.h
                printf(" Prot: ");
                if (hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
                if (hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
 
                // Вычисляем размер. Так как в сети принят прямой порядок
                // байтов, а не обратный, то прийдётся поменять байты местами.
                printf("Size: ");
                lowbyte = hdr->iph_length >> 8;
                hibyte = hdr->iph_length << 8;
                hibyte = hibyte + lowbyte;
                printf("%s", itoa(hibyte, ds, 10));
                // Вычисляем время жизни пакета.
                printf(" TTL:%s\n", itoa(hdr->iph_ttl, ds, 10));
                printf("DATA:\n");
                PrintTcpPacket(Buffer, hibyte);
                printf("\n");
            }
        }
    }
 
    closesocket(s);
    WSACleanup();
}
 
void PrintTcpPacket(char* Buffer, int Size)
{
    FILE *in;
    in = fopen("c:\\test.txt", "w+");
    for (int i = 0; i < Size; i++)
    {
            printf("%c", Buffer[i]);
            fwrite(&Buffer[i], sizeof(char), 1, in);
    }
}
Функция PrintTcpPacket записывает каждый символ который есть в пакете в файл test.txt
Вопрос в следующем. Подскажите по кодировке.. В консоль выводиться кракозябры и в файл записываются тоже.. как это исправить? Расскажите кто знает.

Добавлено через 20 минут
Вованя, я понял)
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
16.10.2016, 00:09
Jaxmackey, а с чего ты решил, что он печатные символы посылает? Он же просто туда сюда байтики гоняет, плюс ты не сделал смещение на ip & tcp header, размер буфера сделай больше, а то он у тебя сейчас segfault поймать может. И перепили кусок перед вызовом - функция printf() может печатать не только строки
C
1
2
3
4
5
6
printf("Size: ");
unsigned int paksize = ((unsigned int)hdr->iph_length >> 8) | ((unsigned int)hdr->iph_length << 8);
printf("%u", paksize);
// Вычисляем время жизни пакета.
printf(" TTL:%d\n", hdr->iph_ttl);
printf("DATA:\n");
Кстати, тут есть структуры готовые для заголовков протоколов
0
 Аватар для Jaxmackey
5 / 5 / 2
Регистрация: 04.10.2013
Сообщений: 142
16.10.2016, 15:17  [ТС]
Вованя, Не особо понял вот это
Цитата Сообщение от Вованя Посмотреть сообщение
смещение на ip & tcp header
Объясни плиз)
0
153 / 148 / 66
Регистрация: 20.02.2014
Сообщений: 556
16.10.2016, 16:31
Цитата Сообщение от Jaxmackey Посмотреть сообщение
Объясни плиз)
вот ты получил пакет с помощью recv() - там у тебя лежит в начале заголовок IP, затем, в зависимости от протокола, лежит заголовок транспортного уровня. Для tcp я уже скидывал, как он выглядит. Тебе нужно рассчитать размер заголовка tcp(он может быть разный, в зависимости от опций. По ссылке, что я скидывал, все описано) и начиная с buffer + sizeof(ip_header) + sizeof(tcp_header) лежат нужные тебе данные.
0
 Аватар для Jaxmackey
5 / 5 / 2
Регистрация: 04.10.2013
Сообщений: 142
16.10.2016, 23:38  [ТС]
Вованя, По ссылке почитал) понял структуру пакета.. спасибо!) и так получается пакет записывается полностью в буфер. Я понимаю, что буфер получается слишком большой и помимо инфы которая мне нужна туда пишется очень много \0 символов и всякой белеберды. я понял что нужно сместить индекс в for и выводить только то что нужно.. Только как именно найти нужные индексы я не понимаю. Есть пакет разметку я его посмотрел.. как там определить первый индекс откуда читать мне нужные данные. Вованя, ты написал
Цитата Сообщение от Вованя Посмотреть сообщение
начиная с buffer + sizeof(ip_header) + sizeof(tcp_header) лежат нужные тебе данные.
ip_header и tcp_header это ты так называешь ip отправителя и заголовок пакета.. я чувствую что где то близок к ответу.. исправь если я что то не так сказал)

Добавлено через 2 часа 29 минут
Просто я не очень знаю английский
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
19.10.2016, 00:25
В последнем проекте тоже пришлось
парсить руками пакеты Ethernet2 -> IPv4 -> TCP.
Работает, не жалуюсь, но при рефакторинге всё же
забил на это и внедрил в проект библиотеку libtins -
это обертка над библиотекой libpcap (winpcap).
Так что может стоит воспользоваться уже готовым решением?
Правда, Вашу проблему с "мусором" это не решит.
0
 Аватар для Jaxmackey
5 / 5 / 2
Регистрация: 04.10.2013
Сообщений: 142
24.10.2016, 22:37  [ТС]
Цитата Сообщение от Вованя Посмотреть сообщение
начиная с buffer + sizeof(ip_header) + sizeof(tcp_header) лежат нужные тебе данные.
Не понимаю где и как настраивается это смещение?? помогите
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
24.10.2016, 23:00
Цитата Сообщение от Jaxmackey Посмотреть сообщение
Не понимаю где и как настраивается это смещение?
Младшие четыре бита первого 8-битного байта IP пакета
содержат размер IP-заголовка в этом пакете.
Этот размер указывается в 32-ух битных словах.
То бишь берем число из этих четырех бит и множим на 32.
Получаем смещение от начала IP заголовка до начала данных.
В начале данных IP-пакета у нас лежит TCP заголовок.
В нем в седьмом 16-ти битном слове младшие 4 бита
обозначают размер заголовка данного TCP пакета.
Оно также указано в 32-ух битных словах.
Так что множим это значение на 32 и получаем смещение до данных TCP.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.10.2016, 23:00
Помогаю со студенческими работами здесь

Развертывание MSI-пакета через GPO
Товарищи, доброго времени суток. Проблема интересная, значит msi пакет развернул на компы и тут непонятки возникли, на одних применилась...

Запуск процедуры пакета через dblink
Доброго времени суток. Есть следующая проблема: Создал процедуру, которая ссылается на пакет.процедура, через dblink (с параметрами). ...

Передача пакета данных TCP через интернет
Доброе время суток!:) Я студент, пишу дипломную работу по передачи данных используя стек протоколов TCP/IP. У меня получилось...

Возможно ли при импорте в модуль пакета подняться выше пакета?
Есть скрипты .py, лежащие на одном уровне(в одном каталоге) и есть пакет модулей, лежащий на том же самом уровне. Возможно ли...

Передача пакета по протоколу ОВЕН через СОМ порт
задача такая. Я должна сделать скаду-систему контоля микроклимата. Т.е. я как пользователь, задаю параметры работы (т.е. устанавливаю мин...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru