PHP: struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(80); sin.sin_addr.s_addr = inet_addr("192.168.0.100"); char datagram[sizeof(ipheader)+sizeof(tcpheader)]; ipheader *iph = (ipheader *)datagram; tcpheader *tcph = (tcpheader *)(datagram + sizeof(ipheader)); PS_HDR pseudo_header; memset(datagram, 0, sizeof(datagram)); iph->ip_hl = 5; iph->ip_v = 4; iph->ip_tos = 0; iph->ip_len = sizeof(ipheader) + sizeof(tcpheader); iph->ip_id = rand(); iph->ip_off = 0; iph->ip_ttl = 255; iph->ip_p = IPPROTO_TCP; iph->ip_sum = 0; iph->ip_src = inet_addr("192.168.0.100"); iph->ip_dst = sin.sin_addr.s_addr; tcph->th_sport = htons(getrandom(0, 1500)); tcph->th_dport = sin.sin_port; tcph->th_seq = rand(); tcph->th_ack = 0; tcph->th_x2 = 0; tcph->th_off = 5; tcph->th_flags = TH_SYN; tcph->th_win = htons(512); tcph->th_sum = 0; tcph->th_urp = 0; pseudo_header.source_address = iph->ip_src; pseudo_header.dest_address = sin.sin_addr.s_addr; pseudo_header.placeholder = 0; pseudo_header.protocol = IPPROTO_TCP; pseudo_header.tcp_length = htons(sizeof(tcpheader)); memcpy((char*)&pseudo_header.tcp, tcph, sizeof(tcpheader)); iph->ip_sum = checksum((unsigned short *)&iph, sizeof(ipheader)); tcph->th_sum = checksum((unsigned short *)&pseudo_header, sizeof(pseudo_header)); if (sendto(s, datagram, sizeof(datagram), 0, (SOCKADDR *)&sin, sizeof(sin)) == SOCKET_ERROR) return -1; в общем - пытаюсь отправить сырой SYN-пакет, но он не доходит, а сниффер пишет что адрес и порт отправки и назначения пустые. Адрес src И адрес сетевухи совпадают
ну я как бы убрал все лишнее тк работает как надо. ну вот то что перед этим PHP: int bOpt = 1; WSADATA asd; WSAStartup(MAKEWORD(2,2),&asd); SOCKET s = socket(PF_INET, SOCK_RAW, IPPROTO_RAW); setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt))
я может глупость скажу, но... memset(datagram, 0, sizeof(datagram)); после этого с datagram ничего не произошло кроме как: sendto(s, datagram, sizeof(datagram), 0, (SOCKADDR *)&sin, sizeof(sin) соответственно оно отправляет все пустое(забитое нулями) или я чего-то не понял...
ну да, вы не поняли PHP: ipheader *iph = (ipheader *)datagram; tcpheader *tcph = (tcpheader *)(datagram + sizeof(ipheader)); этот код размечает эту строку на ip header и tcp header. Ну и сниффер показывает какую-то информацию в пакете 2razb - pcap сложный, стоит не везде 2slesh - проверил, совпадают
при использовании IP_HDRINCL да, но для udp. а для tcp эта опция запрещена вообще. поэтому решением является пикап =) а вообще, если хочется чегото "своего", то есть хороший пример из WDK - NDISPROT, для отправки вплоть до фальшивого исходного мак адреса вполне подойдет