powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Создание сниффера на RAW сокетах
3 сообщений из 3, страница 1 из 1
Создание сниффера на RAW сокетах
    #37860653
HellFighter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Пытаюсь написать сниффер на RAW сокетах, нашёл почти рабочий код, чуть подправил - всё отлично работает, но почему-то видит только исходящие пакеты!! Присмотревшись внимательно заметил, что вроде как программа видит только исходящий трафик TCP от моего компа и UDP от других компов из локальной сети. В чём проблемма, почему нету исходящего трафика? Может ли быть праба в том, что я сижу за роутером? Или код написан не верно? (На скриншоте источника кода было всё нормально...)

Код программы:
Код: plaintext
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.
#include <conio.h>
#include <stdio.h>
#include <winsock2.h>

#pragma comment(lib, "ws2_32.lib")

#define MAX_PACKET_SIZE    0x10000
#define SIO_RCVALL         0x98000001
// Буфер для приёма данных
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 Вкл/выкл.

	// инициализация
	int wsasRes = 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.
	int ioctlRes = 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,"Пакет: ");
			CharToOem(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("%d",hibyte);

			// Вычисляем время жизни пакета.
			printf(" TTL:%d",hdr->iph_ttl);
			printf("\n");

		}
	}

	closesocket( s );
	WSACleanup();
}



Скрин вывода программы приложил, мой IP: ... .63

(писать на WinPCAP предлогать не надо =) )
...
Рейтинг: 0 / 0
Создание сниффера на RAW сокетах
    #37860766
HellFighter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*Запускаю от админа если что.
...
Рейтинг: 0 / 0
Создание сниффера на RAW сокетах
    #37862986
HellFighter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понял что проблема в ОС и это нормально работает только на Windows XP SP2 . На 7, Vista и XP до SP2 этот метод работает не корректно...
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Создание сниффера на RAW сокетах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]