Не могу перевести сокет в режим promiscuous

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by xismyname, 24 Dec 2008.

  1. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Нужна помощь, не могу перевести сокет в режим promiscuous,функция ioctlsocket() возвращает -1,то же самое когда хочу настроит сокет на режим IP_HDRINL,функция setsockopt() возвращает -1.

    Администраторские права есть,Windows Home Edition,SP3.

    Буду благодарен за любую помощь.
     
  2. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    С setsockopt() уже разобрался,остаеться только ioctlsocket().
     
  3. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Покажи фрагмент кода, где ты с ioctlsocket() работаешь.
     
    2 people like this.
  4. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Вот целый код :
    Code:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #include <mstcpip.h>
    #include <conio.h>
    
    typedef struct{
    	unsigned int version 	: 4;
    	unsigned int h_len   	: 4;
    	unsigned int tos     	: 8;
    	unsigned int tot_len 	: 16;
    	unsigned int ID      	: 16;
    	unsigned int flags   	: 3;
    	unsigned int f_offset	: 13;
    	unsigned int TTL        : 8;
    	unsigned int protocol   : 8;
    	unsigned int h_checksum : 16;
    	unsigned int srcip      : 32;
    	unsigned int dstip      : 32;
    }IPHEADER;
    
    int main(void)
    {
    	SOCKADDR_IN      addr;
    	WSADATA          wsd;
    	SOCKET           mSocket;
    	HOSTENT          *host;
    	IPHEADER         *ip;
    	unsigned long    mode = 1;
    	int              len;
    	char             pcname[32];
    	char             buf[sizeof(IPHEADER)];
    
    
    	/* load windows socket interface */
    	if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
    	{
    		puts("Could not load winsocket api");
    		exit(1);
    	}
    
    	/* Get computer name */
    	len = sizeof(pcname) - 1;
    	GetComputerNameA(pcname,&len);
    	len = 0;
    
    	/* Get host IP address by name */
    	host = gethostbyname(pcname);
    
    	/* Set addr & buf to 0 */
    	memset(&addr,0,sizeof(addr));
    	memset(buf,0,sizeof(buf));
    
    	/* init. local address & create raw socket */
    	addr.sin_addr.s_addr    = ((struct in_addr*)host->h_addr_list[0])->s_addr;
            addr.sin_family         = AF_INET;
    	addr.sin_port           = htons(0);
    	mSocket                 = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
    
    	if(mSocket == INVALID_SOCKET)
    	{
    		puts("Could not create a RAW socket");
    		exit(1);
    	}
    
    	/* Bind socket with local address */
    	if(bind(mSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR)) != -1)
    	{
    		/* Convert socket to SIO_RCVALL mode */
    		if(ioctlsocket(mSocket,SIO_RCVALL,&mode) != 0)
    		{
    			puts("Could not convert socket to SIO_RCVALL mode");
    		}
    
    		/*-----------------------------------------------*/
    		int x = 1;
    		while(!kbhit())
    		{
    			len = recv(mSocket,buf,sizeof(buf),0);
    
    			/* Check received data */
    			if(len >= sizeof(IPHEADER))
    			{
    				ip = (IPHEADER*)buf;
    				printf("\n+--------- %d ------------+\n",x++);
    
    				printf("| DEST    : %s\n",inet_ntoa(*((struct in_addr*)&ip->dstip)));
    				printf("| SRC     : %s\n",inet_ntoa(*((struct in_addr*)&ip->srcip)));
    				printf("| VERSION : %d\n",ip->version);
    
    				printf("+------------------------+\n");
    
    			}
    		}
    	}
    	else
    	{
    		puts("Could not bind");
    	}
    }
    Походу он только у меня на компе не работает,у друга проверял - все работало.
     
  5. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    хм...попробуй константу SIO_RCVALL самому определить:
    Code:
     #define SIO_RCVALL        0x98000001 // желательно с другим именем :)
    и глянь что GetLastError() возвращает
     
  6. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    GetLastError() возвращает 10022 - был задан неправильный аргумент или что оно там.

    Странно то что на другом компе работает и никакой ошибки не выдает.

    Дело не в SIO_RCVALL,я посмотрел так как ты написал.
     
  7. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Вот, у меня этот вариант работает:
    Code:
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <windows.h>
    [COLOR=Red][B]#include <winsock.h>[/B][/COLOR]
    #include <conio.h>
    
    [COLOR=Red][B]#define PROMISC        0x98000001
    #define MAX     10000
    
    #pragma comment(lib, "ws2_32.lib")
    [/B][/COLOR]
    typedef struct{
    	unsigned int version 	: 4;
    	unsigned int h_len   	: 4;
    	unsigned int tos     	: 8;
    	unsigned int tot_len 	: 16;
    	unsigned int ID      	: 16;
    	unsigned int flags   	: 3;
    	unsigned int f_offset	: 13;
    	unsigned int TTL        : 8;
    	unsigned int protocol   : 8;
    	unsigned int h_checksum : 16;
    	unsigned int srcip      : 32;
    	unsigned int dstip      : 32;
    }IPHEADER;
    
    int main(void)
    {
    	SOCKADDR_IN      addr;
    	WSADATA          wsd;
    	SOCKET           mSocket;
    	HOSTENT          *host;
    	IPHEADER         *ip;
    	unsigned long    mode = 1;
    	int              len;
    	char             pcname[32];
    [COLOR=Red][B]	char             buf[MAX];[/B][/COLOR]
            int x;
    
    
    	/* load windows socket interface */
    	if(WSAStartup(MAKEWORD(2,2),&wsd) != 0)
    	{
    		puts("Could not load winsocket api");
    		exit(1);
    	}
    
    	/* Get computer name */
    	len = sizeof(pcname) - 1;
    	GetComputerNameA(pcname,&len);
    	len = 0;
    
    	/* Get host IP address by name */
    	host = gethostbyname(pcname);
    
    	/* Set addr & buf to 0 */
    	memset(&addr,0,sizeof(addr));
    	memset(buf,0,sizeof(buf));
    
    	/* init. local address & create raw socket */
    	addr.sin_addr.s_addr    = ((struct in_addr*)host->h_addr_list[0])->s_addr;
            addr.sin_family         = AF_INET;
    	addr.sin_port           = htons(0);
    	mSocket                 = socket(AF_INET,SOCK_RAW,IPPROTO_IP);
    
    	if(mSocket == INVALID_SOCKET)
    	{
    		puts("Could not create a RAW socket");
    		exit(1);
    	}
    
    	/* Bind socket with local address */
    	if(bind(mSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR)) != -1)
    	{
    		/* Convert socket to SIO_RCVALL mode */
    		if(ioctlsocket(mSocket,PROMISC,&mode) != 0)
    		{
    			puts("Could not convert socket to SIO_RCVALL mode");
                            printf("Error: %d\n", GetLastError());
    		}
    
    		/*-----------------------------------------------*/
    		x = 1;
    		while(!kbhit())
    		{
    			len = recv(mSocket,buf,sizeof(buf),0);
    
    			/* Check received data */
    			if(len >= sizeof(IPHEADER))
    			{
    				ip = (IPHEADER*)buf;
    				printf("\n+--------- %d ------------+\n",x++);
    
    				printf("| DEST    : %s\n",inet_ntoa(*((struct in_addr*)&ip->dstip)));
    				printf("| SRC     : %s\n",inet_ntoa(*((struct in_addr*)&ip->srcip)));
    				printf("| VERSION : %d\n",ip->version);
    
    				printf("+------------------------+\n");
    
    			}
    		}
    	}
    	else
    	{
    		puts("Could not bind");
    	}
            return 0;
    }
    
    Выделил то, что добавил сам.
    З.Ы. тестировал на Builder'е, пришлось некоторые либы выкинуть :)
     
    1 person likes this.
  8. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Неа,criz у меня даже этот вариант не работает,RAW сокеты в виндовс включен от версии винсока 2,поэтому header file тоже должен быть winsock2.h
    Походу дело с SP3 или с виндовс.
     
  9. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    ну, если я подключаю winsock2.h, то приходится отключать windows.h...
    З.Ы. протестировал на VC++
     
  10. cash$$$

    cash$$$ Banned

    Joined:
    6 Jan 2008
    Messages:
    385
    Likes Received:
    246
    Reputations:
    10
    Попробуй так

    Code:
    #include <conio.h>
    #include <stdio.h>
    #include <winsock2.h>
    
    #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 Вкл/выкл.
    
      // инициализация
      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,"Пакет: ");
    	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("%s",itoa(hibyte,"",10));
    
    	// Вычисляем время жизни пакета.
    	printf(" TTL:%s",itoa(hdr->iph_ttl,"",10));
    	printf("\n");
    
        }
      }
    
      closesocket( s );
      WSACleanup();
    }
     
  11. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    А в чем фишка то 8))) могу выложить проект и сокеты асинхронные .... а то while-ами вспотеете 8))))))

    снифер на сырых сокетах.... дирьма не жалко!
     
  12. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Наверно фишка в том, что надо с чего-то начинать учиться :)
     
  13. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    учиться на раусокет снифере??? ЗАЧЕМ??
    Там новых технологий нет! 8))

    если снифер дак полноценный, на винпикап!!! Значит ТС нужно что снифер выполнялся на удаленных компах, значит есть цель 8)))))))))))) ... чего надо то ? Выдернуть icq пароль или послушать о чем говорят в аське ... или мыло спереть?
     
  14. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    зачем винпикап для обычного снифа? :)
    Зачем нужно? чтобы учиться))) чтобы узнать о протоколах например)
     
  15. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5

    Ты не туда въехал ,какой пароль,какой е-маил ? Тут никто никого не хочет хакать,если тебе нечего предложит по теме,лучше пройди мимо... спасибо.
     
  16. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5

    Извини cash$$$ но код который ты выложил в принципе не отличаеться от того что я написал.

    И ту статью с которого ты скопировал этот код я читал - статья называеться "Сниффер : Щит и меч".

    Может ты не прочитал все мои посты,дело в том что это программа которую я написал не работает на моем компе,но на компе друга она работает.

    У меня оно выдает ошибку 10022,т.е. "задан не правильный аргумент".
     
  17. Delimiter

    Delimiter Banned

    Joined:
    8 Apr 2005
    Messages:
    317
    Likes Received:
    173
    Reputations:
    12
    читаем .... читаем.... отличия w2к от хр .... читаем читаем отличия хр_сп1 от хр_сп2
    читаем блокирование встроенным файрволом промижин сокетов! Я об таком кавне ....уже забыл столько сколько ты и не знал ! 8)) (Атлантида)
     
  18. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Ты самый крутой кодер,пройди мимо... :D
     
  19. izlesa

    izlesa Elder - Старейшина

    Joined:
    3 Jan 2008
    Messages:
    112
    Likes Received:
    32
    Reputations:
    5
    2Delimiter
    гыгы, я почитав немного об этих типа сырых сокетах забил на них и не вспоминал ))) Винпикап рулит для изучение сетевых протоколов на низком уровне ). Тем более он прост, как сапог ))).
    Это так оффтоп )
     
  20. xismyname

    xismyname Elder - Старейшина

    Joined:
    7 Sep 2008
    Messages:
    77
    Likes Received:
    7
    Reputations:
    -5
    Блин,я прочитал что козлы с мелкософта сделали лимит на использование RAW сокетов на Виндовс... пускай эти п*дарасы делают все что хотят, а я опять буду кодить на своем добром мандрайке :D.
    Спс.. всем кто отозвался.