|
psdHeader.saddr=ipHeader.sourceIP; psdHeader.daddr=ipHeader.destIP; psdHeader.mbz=0; psdHeader.ptcl=IPPROTO_TCP; psdHeader.tcpl=htons(sizeof(tcpHeader));
//计算校验和 memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4); ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader));
memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));
rect=sendto(sock, szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader), 0, (struct sockaddr*)&addr_in, sizeof(addr_in)); if (rect==SOCKET_ERROR) { printf("send error!:%d\n",WSAGetLastError()); return false; } else printf("send ok!\n");
closesocket(sock); WSACleanup();
return 0; }
上面这个程序不光是一个Ping的程序,也可以更改成为一个比connect()更优秀的端口扫描器。
上面这个程序实际上就是通过原始套接字发送自己构造的TCP和IP数据头,如果对这个程序作修改,也很容易改为一个SYN FLOOD的工具。SYN位前面说了,是三次握手过程的第一步,表示发出一个连接请求,这时目标主机同意的时候就会返回一个ACK SYN的数据报,来确认客户端的连接,然后需要客户端进行最后一次ACK的确认,来建立这个连接。但是,如果客户步发送一个ACK来确认,那么,服务器端就有一个缓冲来等待这个确认。当有大量的SYN缓冲等待的时候,正常的连接请求就会被放在一大堆队列中,从而影响正常用户的正常连接。同样相似的,就是RST拒绝服务了。
进行上面的探测应该是探测的第一步,比如主机活动状态,端口。接来下应该针对相应端口进行更详细的判别,以及探测主机系统。
上一页 [1] [2] [3] [4] [5] [6] |