Что осталось в 7ке от ф-ционала сырых сокетов?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 25 дек 2011.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Попытался только что нагуглит статей о сниферах на сырых сокетах.И походу оказываеться что - нечто подобное http://www.xakep.ru/post/30601/default.asp уже неактуально.На 7ке код:
    Код (Text):
    1. DWORD flag = TRUE;
    2. ioctlsocket(s, SIO_RCVALL, &flag);
    генерит ошибку WSAEOPNOTSUPP ((((
    Теперь что получаеться,на последних виндах невозможно снифать через сырые сокеты?
     
  2. shore

    shore New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2011
    Сообщения:
    29
    Limitations on Raw Sockets

    On Windows 7, Windows Server 2008 R2, Windows Vista, and Windows XP with Service Pack 2 (SP2), the ability to send traffic over raw sockets has been restricted in several ways:

    TCP data cannot be sent over raw sockets.
    UDP datagrams with an invalid source address cannot be sent over raw sockets. The IP source address for any outgoing UDP datagram must exist on a network interface or the datagram is dropped. This change was made to limit the ability of malicious code to create distributed denial-of-service attacks and limits the ability to send spoofed packets (TCP/IP packets with a forged source IP address).
    A call to the bind function with a raw socket is not allowed.
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548%28v=vs.85%29.aspx
     
  3. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    Код (Text):
    1.              
    2. unsigned long   flag = 1;
    3.  
    4.     WSAStartup(MAKEWORD(1,1), &wsadata);
    5.     s = socket( AF_INET, SOCK_RAW, IPPROTO_IP );
    6.  
    7.     ZeroMemory( &sa, sizeof(sa) );
    8.     sa.sin_family = AF_INET;
    9.     sa.sin_addr.s_addr = inet_addr(g_strCurrentAddress);
    10.     bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
    11.  
    12.     ioctlsocket(s, 0x98000001, &flag);
     
  4. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    Сорри, отправилось нечаянно, хочу добавить; такой код работает даже на Windows 8.
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Вроде как чуть лутчше разобрался
    Код (Text):
    1. typedef struct IPHeader
    2. {
    3.   UCHAR   iph_verlen;   // версия и длина заголовка
    4.   UCHAR   iph_tos;      // тип сервиса
    5.   USHORT  iph_length;   // длина всего пакета
    6.   USHORT  iph_id;       // Идентификация
    7.   USHORT  iph_offset;   // флаги и смещения
    8.   UCHAR   iph_ttl;      // время жизни пакета
    9.   UCHAR   iph_protocol; // протокол
    10.   USHORT  iph_xsum;     // контрольная сумма
    11.   ULONG   iph_src;      // IP-адрес отправителя
    12.   ULONG   iph_dest;     // IP-адрес назначения
    13. } IPHeader;
    14.  
    15. struct tcphdr {
    16.     USHORT  th_sport;       /* source port */
    17.     USHORT  th_dport;       /* destination port */
    18.     ULONG   th_seq;         /* sequence number */
    19.     ULONG   th_ack;         /* acknowledgement number */
    20.     UCHAR   th_offx2;       /* data offset, rsvd */
    21.     UCHAR   th_flags;
    22.     USHORT  th_win;         /* window */
    23.     USHORT  th_sum;         /* checksum */
    24.     USHORT  th_urp;         /* urgent pointer */
    25. };
    26. int _tmain(int argc, _TCHAR* argv[])
    27. {
    28.     WSADATA wsadata;
    29.     WSAStartup(MAKEWORD(2, 2), &wsadata);
    30.     SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    31.     CHAR szHostName[16];
    32.     gethostname(szHostName, sizeof szHostName);
    33.     HOSTENT *phe = gethostbyname(szHostName);
    34.     SOCKADDR_IN sa;
    35.     ZeroMemory(&sa, sizeof sa);
    36.     sa.sin_family = AF_INET;
    37.     sa.sin_addr.s_addr = ((struct in_addr*)phe->h_addr_list[0])->s_addr;
    38.     bind(s, (SOCKADDR*)&sa, sizeof SOCKADDR);
    39.     //DWORD flag = TRUE;
    40.     //ioctlsocket(s, SIO_RCVALL, &flag);
    41.     BOOL bOptVal = TRUE;
    42.     setsockopt(s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char*)&bOptVal, sizeof(BOOL));
    43.     WSAEVENT hEvent;
    44.     hEvent = WSACreateEvent();
    45.     WSAEventSelect(s,hEvent,FD_READ);
    46.     WSANETWORKEVENTS nev={0};
    47.     IPHeader *hdr;
    48.     tcphdr *thdr;
    49.     char *buf=new char[1024*1024];
    50.     memset(buf,NULL,1024*1024);
    51.     SOCKADDR_IN src;
    52.     int count;
    53.     for(;;)
    54.     {
    55.         WSAWaitForMultipleEvents(1,&hEvent,FALSE,WSA_INFINITE,FALSE);
    56.         WSAEnumNetworkEvents(s,hEvent,&nev);
    57.         if(nev.iErrorCode[FD_READ_BIT]==0)
    58.         {
    59.             recv(s,buf,1024*1024,0);
    60.             hdr=(IPHeader*)buf;
    61.             buf+=sizeof(IPHeader);
    62.             thdr = (tcphdr*)buf;
    63.             buf-=sizeof(IPHeader);
    64.             if(hdr->iph_protocol==IPPROTO_TCP)
    65.             {
    66.                 src.sin_addr.s_addr = hdr->iph_src;;
    67.                 printf("From: %s:%d\n",inet_ntoa(src.sin_addr),thdr->th_sport);
    68.                 printf("? %d - %d\n",thdr->th_offx2,sizeof(IPHeader)+sizeof(tcphdr));
    69.             }          
    70.             memset(buf,NULL,1024*1024);
    71.         }
    72.         ZeroMemory(&nev,sizeof(WSANETWORKEVENTS));
    73.     }
    74.     return 0;
    75. }
    Только мне неясно почему th_offx2 == 80,когда sizeof(IPHeader)+sizeof(tcphdr)==40