Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
1

Не работает сниффер на С++

14.11.2016, 20:56. Показов 2916. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Пытаюсь разобраться с написанием сниффера.
Вот мой код:
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
#include "stdafx.h"
#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;  
    SOCKET      s;         
    char        name[128];
    HOSTENT*    phe;      
    SOCKADDR_IN sa;        
    IN_ADDR sa1;        
    unsigned long        flag = 1;  
    //создаем сокет
    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
    ioctlsocket(s, SIO_RCVALL, &flag);
    
 
    
    while( 1 )
    {
        int count=0;
        char Buffer[1024];
        count = recv( s, Buffer, sizeof(Buffer), 0 );
 
        if( count >= sizeof(IPHeader) )
        {
            IPHeader* hdr = (IPHeader *)Buffer;
      
            sa1.s_addr = hdr->ip_srcaddr;
            cout<<"Src:";
            printf(inet_ntoa(sa1));
            cout<<endl;
            cout<<"Dest:";
            sa1.s_addr = hdr->ip_destaddr;
            printf(inet_ntoa(sa1));
            cout<<endl;
            if(hdr->ip_protocol == IPPROTO_TCP) printf("TCP ");
            if(hdr->ip_protocol == IPPROTO_UDP) printf("UDP ");
 
        }
    }
 
 
    WSACleanup ();
    system("PAUSE");
    return EXIT_SUCCESS;
}
Вроде ничего сложного не должно быть. В цикле пытаюсь ловить все входящие пакеты и выводить информацию по ним.
Но при запуске получаю следующие ( рис.1).

Подключил Wireshark, там пакеты поступают.

В чем может быть проблема? Помогите, пожалуйста . Заранее спасибо!
Миниатюры
Не работает сниффер на С++   Не работает сниффер на С++  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2016, 20:56
Ответы с готовыми решениями:

Как работает сниффер
Как работает сниффер. Обычно для работы с COM- портом используется API-функция CreateFile,...

Неправильно работает I2C сниффер
Доброго времени суток всем! Нужна помощь. Понадобился мне I2C сниффер, собрал его по...

Сниффер
Привет форумчане! Вкратце опишу суть вопроса. Нужно написать прогу которая будет ловить приходящие...

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

5
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
14.11.2016, 21:43  [ТС] 2
Немного изменен текст:
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
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <process.h>
 
using namespace std;
 
 
#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
 
char Buffer[MAX_PACKET_SIZE]; // 64 Kb
 
 
 
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;      
  ULONG   iph_dest;    
} IPHeader;
 
char src[10];
char dest[10];
char ds[15];
unsigned short lowbyte;
unsigned short hibyte;
 
void main()
{
  WSADATA     wsadata;   
  SOCKET      s;         
  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));
 
  ioctlsocket(s, SIO_RCVALL, &flag);
 
  while(1)
  {
    int count;
    count = recv( s, Buffer, sizeof(Buffer), 0 );
    if( count >= sizeof(IPHeader) )
    {
      IPHeader* hdr = (IPHeader *)Buffer;
            sa1.s_addr = hdr->iph_src;
            cout<<"Src:";
            printf(inet_ntoa(sa1));
            cout<<endl;
            cout<<"Dest:";
            sa1.s_addr = hdr->iph_dest;
            printf(inet_ntoa(sa1));
            cout<<endl;
            if(hdr->iph_protocol == IPPROTO_TCP) printf("TCP ");
            if(hdr->iph_protocol == IPPROTO_UDP) printf("UDP ");
    printf("\n");
    Sleep(1000);
    }
  }
  closesocket( s );
  WSACleanup();
}
Теперь постоянно выдает 0.0.0.0
0
3 / 3 / 2
Регистрация: 13.02.2015
Сообщений: 43
15.11.2016, 19:45 3
Лучший ответ Сообщение было отмечено NNN7 как решение

Решение

Я Вам не скажу за всю Одессу . Но на моей семерке второй код работает .
Возможно у тебя он слушает неправильный интерфейс . Или , возможно , это запретно в другой версии windows .
Миниатюры
Не работает сниффер на С++  
1
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
15.11.2016, 19:56  [ТС] 4
Странно. А Вы как-то предварительно генерировали трафик?
0
3 / 3 / 2
Регистрация: 13.02.2015
Сообщений: 43
15.11.2016, 20:09 5
Лучший ответ Сообщение было отмечено NNN7 как решение

Решение

Ноуп . Просто запустил код . Трафик сам по себе ходит .
Проверьте для начала , есть ли у Вас вообще поддержка SOCK_RAW
https://msdn.microsoft.com/ru-... s.85).aspx
netsh winsock show catalog

И вообще что возвращает
socket( AF_INET, SOCK_RAW, IPPROTO_IP )
Может там изначально ошибка .
1
9 / 9 / 10
Регистрация: 05.09.2013
Сообщений: 502
15.11.2016, 20:25  [ТС] 6
Да, там , к сожалению, выявилась ошибка 10013 - отказано в доступе (
еще более усложнилась задача

Добавлено через 8 минут
Заработало) Нужно было всего лишь запускать под Администратором)
Спасибо!
0
15.11.2016, 20:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2016, 20:25
Помогаю со студенческими работами здесь

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

Сниффер си/си++/си#
Помогите пожалуйста написать &quot;простенький&quot; сниффер на языке си/си++/си#!

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

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


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

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