关于原始套接字的问题,高手们多指教
听说过 syn flood 攻击,书上说原始套接字可以发任意 ip 包,甚至错误的包。
我想用他发一个 tcp syn 请求包,应该怎么写?我的代码不干活
WSADATA wsd;
SOCKET s=INVALID_SOCKET;
struct sockaddr_in remote;
IpHeader ih;
BOOL bOpt;
int totallen;
char * ipsrc="172.16.0.111";
char * ipdes="172.16.0.188";
char * sendbuff;
//定义了一个 tcp 头,里边的数据是截包截下来的,省地自己去定义每个部分。
char tcphead[28] = {(char)0x11,(char)0x8d,(char)0x00,(char)0x50,(char)0x0d,(char)0xb8,(char)0x85,
(char)0x8f,(char)0x00,(char)0x00,(char)0x00,(char)0x00,(char)0x70,(char)0x02,
(char)0x40,(char)0x00,(char)0x00,(char)0x00,(char)0x00,(char)0x00,(char)0x02,
(char)0x04,(char)0x05,(char)0xb4,(char)0x01,(char)0x01,(char)0x04,(char)0x02};
sendbuff=(char *)malloc(1024);
ZeroMemory(sendbuff,1024);
WSAStartup(MAKEWORD(2,2),&wsd);
//下面用了 IPPROTO_UDP,不知道这样是否可行?
s=WSASocket(AF_INET,SOCK_RAW,IPPROTO_UDP,NULL,0,0);
::setsockopt (s,IPPROTO_IP,IP_HDRINCL,(char *)&bOpt,sizeof(bOpt));
totallen=sizeof(ih)+sizeof(tcphead);
ih.ip_verlen = (4<<4)|sizeof(ih);
ih.tos =0;
ih.total_len = totallen;
ih.ident = 0;
ih.ip_offset = 0;
ih.ttl = 128;
ih.proto = 6; //tcp, 0x11 for udp
ih.checksum = 0;
ih.sourceIP = inet_addr(ipsrc);
ih.desIP = inet_addr(ipsrc);
//计算校验值
*(unsigned short *)(tcphead+16)=checksum(sendbuff+sizeof(ih),sizeof(tcphead));
ih.checksum = checksum(sendbuff,sizeof(ih)+sizeof(tcphead));
//把 ip 头复制到发送缓冲区里
memcpy(sendbuff,&ih,sizeof(ih));
//把tcp 头复制到缓冲区里
memcpy(sendbuff+sizeof(ih),tcphead,sizeof(tcphead));
remote.sin_family = AF_INET;
remote.sin_port = htons(80);
remote.sin_addr.s_addr = inet_addr(ipdes);
int j=sendto(s,sendbuff,totallen,0,(SOCKADDR *)&remote,sizeof(remote));
int t=::WSAGetLastError ();
最后 t 的值为:WSAEADDRNOTAVAIL,好象是地址无效。。。