Попытался только что нагуглит статей о сниферах на сырых сокетах.И походу оказываеться что - нечто подобное http://www.xakep.ru/post/30601/default.asp уже неактуально.На 7ке код: Код (Text): DWORD flag = TRUE; ioctlsocket(s, SIO_RCVALL, &flag); генерит ошибку WSAEOPNOTSUPP (((( Теперь что получаеться,на последних виндах невозможно снифать через сырые сокеты?
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
Код (Text): unsigned long flag = 1; WSAStartup(MAKEWORD(1,1), &wsadata); s = socket( AF_INET, SOCK_RAW, IPPROTO_IP ); ZeroMemory( &sa, sizeof(sa) ); sa.sin_family = AF_INET; sa.sin_addr.s_addr = inet_addr(g_strCurrentAddress); bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR)); ioctlsocket(s, 0x98000001, &flag);
Вроде как чуть лутчше разобрался Код (Text): 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; struct tcphdr { USHORT th_sport; /* source port */ USHORT th_dport; /* destination port */ ULONG th_seq; /* sequence number */ ULONG th_ack; /* acknowledgement number */ UCHAR th_offx2; /* data offset, rsvd */ UCHAR th_flags; USHORT th_win; /* window */ USHORT th_sum; /* checksum */ USHORT th_urp; /* urgent pointer */ }; int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsadata; WSAStartup(MAKEWORD(2, 2), &wsadata); SOCKET s = socket(AF_INET, SOCK_RAW, IPPROTO_IP); CHAR szHostName[16]; gethostname(szHostName, sizeof szHostName); HOSTENT *phe = gethostbyname(szHostName); SOCKADDR_IN sa; 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); //DWORD flag = TRUE; //ioctlsocket(s, SIO_RCVALL, &flag); BOOL bOptVal = TRUE; setsockopt(s, SOL_SOCKET, SO_EXCLUSIVEADDRUSE, (char*)&bOptVal, sizeof(BOOL)); WSAEVENT hEvent; hEvent = WSACreateEvent(); WSAEventSelect(s,hEvent,FD_READ); WSANETWORKEVENTS nev={0}; IPHeader *hdr; tcphdr *thdr; char *buf=new char[1024*1024]; memset(buf,NULL,1024*1024); SOCKADDR_IN src; int count; for(;;) { WSAWaitForMultipleEvents(1,&hEvent,FALSE,WSA_INFINITE,FALSE); WSAEnumNetworkEvents(s,hEvent,&nev); if(nev.iErrorCode[FD_READ_BIT]==0) { recv(s,buf,1024*1024,0); hdr=(IPHeader*)buf; buf+=sizeof(IPHeader); thdr = (tcphdr*)buf; buf-=sizeof(IPHeader); if(hdr->iph_protocol==IPPROTO_TCP) { src.sin_addr.s_addr = hdr->iph_src;; printf("From: %s:%d\n",inet_ntoa(src.sin_addr),thdr->th_sport); printf("? %d - %d\n",thdr->th_offx2,sizeof(IPHeader)+sizeof(tcphdr)); } memset(buf,NULL,1024*1024); } ZeroMemory(&nev,sizeof(WSANETWORKEVENTS)); } return 0; } Только мне неясно почему th_offx2 == 80,когда sizeof(IPHeader)+sizeof(tcphdr)==40