PDA

Просмотр полной версии : Отправка сырого пакета


ntldr
23.02.2010, 02:27
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 И адрес сетевухи совпадают

desTiny
23.02.2010, 02:33
я не вижу слова socket

ntldr
23.02.2010, 02:38
я не вижу слова socket
ну я как бы убрал все лишнее тк работает как надо. ну вот то что перед этим

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))

razb
23.02.2010, 03:41
Мб лучше pcap заюзать? )

xa-xa89
23.02.2010, 04:47
я может глупость скажу, но...
memset(datagram, 0, sizeof(datagram));
после этого с datagram ничего не произошло кроме как:
sendto(s, datagram, sizeof(datagram), 0, (SOCKADDR *)&sin, sizeof(sin)
соответственно оно отправляет все пустое(забитое нулями)
или я чего-то не понял...

slesh
23.02.2010, 11:33
Также не забывай, что винда не выпустит пакеты с поддельным адресом отправителя.

ntldr
23.02.2010, 12:26
я может глупость скажу, но...
memset(datagram, 0, sizeof(datagram));
после этого с datagram ничего не произошло кроме как:
sendto(s, datagram, sizeof(datagram), 0, (SOCKADDR *)&sin, sizeof(sin)
соответственно оно отправляет все пустое(забитое нулями)
или я чего-то не понял...
ну да, вы не поняли :)
ipheader *iph = (ipheader *)datagram;
tcpheader *tcph = (tcpheader *)(datagram + sizeof(ipheader));

этот код размечает эту строку на ip header и tcp header. Ну и сниффер показывает какую-то информацию в пакете

2razb - pcap сложный, стоит не везде

2slesh - проверил, совпадают

ntldr
24.02.2010, 00:35
http://dl.dropbox.com/u/3104173/syn.jpg

сниффер показывает, как я понял, что эти данные как-то попали в тело пакета, а не в заголовок

sn0w
25.02.2010, 12:06
Также не забывай, что винда не выпустит пакеты с поддельным адресом отправителя.

при использовании IP_HDRINCL да, но для udp.
а для tcp эта опция запрещена вообще.

поэтому решением является пикап =)

а вообще, если хочется чегото "своего", то
есть хороший пример из WDK - NDISPROT, для отправки вплоть до фальшивого исходного мак адреса вполне подойдет

ntldr
25.02.2010, 14:54
при использовании IP_HDRINCL да, но для udp.
а для tcp эта опция запрещена вообще.

поэтому решением является пикап =)

а вообще, если хочется чегото "своего", то
есть хороший пример из WDK - NDISPROT, для отправки вплоть до фальшивого исходного мак адреса вполне подойдет
мне кажется лишний sys за собой таскать не айс. Обойдусь connect() ;)