Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/26: Рейтинг темы: голосов - 26, средняя оценка - 4.69
32 / 32 / 7
Регистрация: 10.10.2010
Сообщений: 89

Сниффер в NAT

09.06.2013, 12:42. Показов 4814. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Написал простой сниффер, работающий на RAW сокете зацикленном на Recv.
Он пишет на консоли адрес отправителя и назначения, размер и прочее.

Тестируя его на станции с прямым выходом в интернет, непонятных ситуаций не возникало.
Например при получении с адреса 95.45.45.89 какого либо трафика, у меня выходило
Sourse IP: 95.45.45.89; Destination IP: Мой IP

Но если компьютер подключен к роутеру и общается с внешним миром через NAT
то отчет о трафике уже другой
Sourse IP: 192.168.0.100(внутренний IP моего компьютера); Destination IP: 95.45.45.89

Я понимаю что в NAT производится замена IP, но разве это не должно быть так:

Sourse IP: 95.45.45.89; Destination IP: 192.168.0.100
или хотя бы так
Sourse IP: 192.168.0.1(внутренний IP роутера); Destination IP: 192.168.0.100 ??

Возникают подозрения, что это мной же посланные пакеты, которые дошли до роутера и были им пере отправлены, в том числе обратно ко мне

Добавлено через 2 часа 8 минут
Послушал Wireshark`ом, и на самом деле оказалось что моя программа принимала только свои же пакеты, после их пересылки роутером, а настоящие серверные пакеты из инета почему то принимать не хочет, думаю это в настойках сокета, вот код инициализации сокета, подскажите пожалуйста.

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
#define SIO_RCVALL         0x98000001
 
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=0;
 
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    // обработка IP-пакета
    if( count >= sizeof(IPHeader) )
    {
        
      IPHeader* hdr = (IPHeader *)Buffer;
      //Начинаем разбор пакета...
    strcpy(src,"Пакет: ");
    CharToOemA((LPCSTR)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 ");
    if(hdr->iph_protocol == IPPROTO_ICMP) printf("ICMP ");
 
    // Вычисляем размер. Так как в сети принят прямой порядок
    // байтов, а не обратный, то прийдётся поменять байты местами.
    
    printf("Size: ");
    lowbyte = hdr->iph_length>>8;
    hibyte = hdr->iph_length<<8;
    hibyte = hibyte + lowbyte;
    printf("%s",itoa(hibyte,buff,10));
 
    // Вычисляем время жизни пакета.
    printf(" TTL:%s",itoa(hdr->iph_ttl,buff,10));
    printf("\n\n");
    }
  }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.06.2013, 12:42
Ответы с готовыми решениями:

WPF: Не работают библиотеки Open.NAT, Mono.NAT
Доброго времени суток! Хочу витащить свой IP. У меня &quot;серый ip&quot;. (кто не в курсе го в Википедию) Искал решение. Нашел библиотеку...

Сниффер
Вот у меня возник такой вопрос. А можно ли сниффером перехватывать пакеты других пользователей интернета зная его IP адрес?

Сниффер COM
Здравствуйте. Есть Прибор, подключённый через COM пор. На ПК стоит программа которая получает данные от этого прибора. Задача: Нужно...

9
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 15
09.06.2013, 12:51
если у тебя NAT не настроен на перенаправление пакетов на твою машину, ты ничего кроме внутренних пакетов не получишь
1
32 / 32 / 7
Регистрация: 10.10.2010
Сообщений: 89
09.06.2013, 12:53  [ТС]
Цитата Сообщение от Tapojkee Посмотреть сообщение
если у тебя NAT не настроен на перенаправление пакетов на твою машину, ты ничего кроме внутренних пакетов не получишь
Хмм.. а как же их тогда получает клиентская программа?
0
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 15
09.06.2013, 12:54
если брать самый худший вариант NAT`а, то единственный способ получить пакет извне, первому отправить пакет на внешнее устройство, тогда нат будет знать какому компу в подсети возвращать пакеты.

ЗЫ погугли про "udp hole punch"
0
32 / 32 / 7
Регистрация: 10.10.2010
Сообщений: 89
09.06.2013, 13:06  [ТС]
Цитата Сообщение от Tapojkee Посмотреть сообщение
если брать самый худший вариант NAT`а, то единственный способ получить пакет извне, первому отправить пакет на внешнее устройство, тогда нат будет знать какому компу в подсети возвращать пакеты.
Да, я зря грешил на роутер и NAT, пакеты пришедшие с сервера, успешно распределяются между машинами в подсети и клиентская программа с wireshark`ом прекрасно их видят, не принимает их только мой сокет. Выше добавил код программы, помогите разобраться где может быть ошибка.
0
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 15
09.06.2013, 13:34
вот, что-то рабочее

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
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <process.h>
 
#define SIO_RCVALL         0x98000001
using namespace std;
 
 
typedef struct IPHeader
{
    unsigned char  ip_header_len:4;  // 4-bit header length (in 32-bit words) normally=5 (Means 20 Bytes may be 24 also)
    unsigned char  ip_version   :4;  // 4-bit IPv4 version
    unsigned char  ip_tos;           // IP type of service
    unsigned short ip_total_length;  // Total length
    unsigned short ip_id;            // Unique identifier 
    
    unsigned char  ip_frag_offset   :5;        // Fragment offset field
    
    unsigned char  ip_more_fragment :1;
    unsigned char  ip_dont_fragment :1;
    unsigned char  ip_reserved_zero :1;
    
    unsigned char  ip_frag_offset1;    //fragment offset
    
    unsigned char  ip_ttl;           // Time to live
    unsigned char  ip_protocol;      // Protocol(TCP,UDP etc)
    unsigned short ip_checksum;      // IP checksum
    unsigned int   ip_srcaddr;       // Source address
    unsigned int   ip_destaddr;      // Source address
};
 
 
int main(int argc, char *argv[])
{
    cout<<"Start...\n";
    WSAData WSData;
    WSAStartup(0x202,&WSData);
    
    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( 1 )
    {
        int count=0;
        char Buffer[1024];
        count = recv( s, Buffer, sizeof(Buffer), 0 );
 
        if( count >= sizeof(IPHeader) )
        {
            IPHeader* hdr = (IPHeader *)Buffer;
            for(int i=0;i<count;i++)
            {
                if (i%8 == 0) printf(" ");
                if (i%16 == 0) printf("\n");
                printf("%2X ",u_char(Buffer[i]));
                
            }
            printf("\n------------------------\n");
 
        }
    }
 
 
    WSACleanup ();
    system("PAUSE");
    return EXIT_SUCCESS;
}
1
32 / 32 / 7
Регистрация: 10.10.2010
Сообщений: 89
09.06.2013, 14:17  [ТС]
Tapojkee, Работает все хорошо, только вот проблема аналогичная))
Просматривает не весь трафик, если после recv сделать что то на подобии фильтрации по ip
например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  IPHeader* hdr = (IPHeader *)Buffer;
if (hdr->ip_srcaddr==inet_addr("123.123.123.123")) // показывает только трафик с нужного нам ip
            {
                printf("%i \n",hdr->ip_total_length);
                for(int i=0;i<count;i++)
                {
                    if (i%8 == 0) printf(" ");
                    if (i%16 == 0) printf("\n");
                    printf("%2X ",u_char(Buffer[i]));
                
                }
                printf("\n------------------------\n");
            }
выводиться ничего не будет, т.к нету пакетов с таким IP отправителя, хотя они есть))
0
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 15
09.06.2013, 14:32
все работает отлично

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
while( 1 )
    {
        int count=0;
        char Buffer[1024];
        count = recv( s, Buffer, sizeof(Buffer), 0 );
 
        
        if( count >= sizeof(IPHeader) )
        {
            IPHeader* hdr = (IPHeader *)Buffer;           
            
            if (hdr->ip_srcaddr == inet_addr("1.2.3.4"))
            {
                printf("--- src ip: %u.%u.%u.%u ---\n",
                  hdr->ip_srcaddr & 0x000000FF,
                  (hdr->ip_srcaddr & 0x0000FF00)>>8,
                  (hdr->ip_srcaddr & 0x00FF0000)>>16,
                  (hdr->ip_srcaddr & 0xFF000000)>>24);
                  
                printf("--- dst ip: %u.%u.%u.%u ---\n",
                  hdr->ip_destaddr & 0x000000FF,
                  (hdr->ip_destaddr & 0x0000FF00)>>8,
                  (hdr->ip_destaddr & 0x00FF0000)>>16,
                  (hdr->ip_destaddr & 0xFF000000)>>24);
 
                for(int i=0;i<count;i++)
                {
                    if (i%8 == 0) printf(" ");
                    if (i%16 == 0) printf("\n");
                    printf("%2X ",u_char(Buffer[i]));
                    
                }
                printf("\n------------------------\n");
            }
        }
    }
0
32 / 32 / 7
Регистрация: 10.10.2010
Сообщений: 89
09.06.2013, 16:09  [ТС]
Попробовал послушать трафик, во время закачки видео с ютуба, так же 0 внимания. Однако он видит ответные пакеты на ping запрос на тот же самый адрес. Что это значит?)

Добавлено через 11 минут
Tapojkee, Извини за потраченное время, надо было то всего отключить брандмауэр . Огромнейшее спасибо за консультацию
0
2 / 2 / 0
Регистрация: 01.06.2013
Сообщений: 15
09.06.2013, 16:30
рад помочь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.06.2013, 16:30
Помогаю со студенческими работами здесь

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

Сниффер
Всем привет! Собственно интересует вопрос как узнать какие параметры отправляются на сайт?? Слышал что это делается при помощи сниффера и...

Сниффер
Решил написать программу которая будет подключатся к определённому приложению(поиск по процеса к примеру)и будет получать пакеты от сервера...

Сниффер
Пытаюсь научиться работать с сокетами. Пишу этакий мини-сниффер. Полазил по примерам, все дела.. Более-менее что-то понятно. Не забегая...

Сниффер
У кого нибудь есть сниффер например как nas-ru Или обьясните пожалуйста как написать


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
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