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

📄 mps.c

📁 linux下的多功能发包工具
💻 C
字号:
/* * File: mps.c * * Description: Multi-functional Packet Sender. * * Author: llliu  * * Date: 2008-11-22 * * Usage: * mps -s [source-ip source-port] -d [dest-ip dest-port] -p [icmp/tcp/udp] -l [pkt-len] -i [ms] -c [count] -I [interface] * *  */#include "mps.h"#include "version.h"char        send_pkt[1518];_iphdr   ipheader;_icmphdr icmpheader;_tcphdr  tcpheader;_udphdr  udpheader;psdhdr _psdhdr;struct sockaddr_in sockAddr;/* * get source ip. */struct sockaddr_in source;char *device = "eth0";volatile int exiting;static void usage(void) __attribute__((noreturn));__u16 checksum(__u16 *buffer, int size){	unsigned long cksum=0;	while(size >1) {		cksum+=*buffer++;		size-=sizeof(__u16);	}	if(size) cksum+=*(__u8*)buffer;	cksum=(cksum >> 16)+(cksum&0xffff);	cksum+=(cksum >>16);	return (__u16)(~cksum); }#define ICMP_ECHO		8	/* Echo Request			*/static int build_icmp(int pkt_len){	int send_pkt_size;	int data_len;	unsigned char *append_buffer;	data_len = pkt_len - MACHDRSIZE - sizeof(_iphdr) - sizeof(icmpheader);	assert(data_len >= 0);	append_buffer = (unsigned char *)malloc(data_len);	icmpheader.type = ICMP_ECHO;	icmpheader.code = 1;	icmpheader.checksum = 0;	icmpheader.id = htons(12345);	icmpheader.seq = htons(1);	/*	 * build the packet.	 */	memcpy(send_pkt, &ipheader, sizeof(ipheader));	memcpy(send_pkt + sizeof(ipheader), &icmpheader, sizeof(icmpheader));	memcpy(send_pkt + sizeof(ipheader) + sizeof(icmpheader),			append_buffer,			data_len);	send_pkt_size = sizeof(ipheader) + sizeof(icmpheader) + data_len;	icmpheader.checksum = checksum((__u16 *)(send_pkt+sizeof(ipheader)),			send_pkt_size - sizeof(ipheader));	memcpy(send_pkt+sizeof(ipheader), &icmpheader, sizeof(icmpheader));	memcpy(send_pkt + sizeof(ipheader) + sizeof(icmpheader),			append_buffer,			data_len);	ipheader.checksum = checksum((__u16 *)send_pkt, send_pkt_size);	memcpy(send_pkt, &ipheader, sizeof(ipheader));	return send_pkt_size;}static int build_tcp(__u16 sport, __u16 dport, int pkt_len){	int send_pkt_size;	int data_len;	unsigned char *append_buffer;	data_len = pkt_len - MACHDRSIZE - sizeof(_iphdr) - sizeof(tcpheader);	assert(data_len >= 0);	append_buffer = (unsigned char *)malloc(data_len);	tcpheader.th_dport= htons(dport);	tcpheader.th_sport = htons(sport);	tcpheader.th_seq = htonl(SENDTCPSEQ);	tcpheader.th_ack = 0;	/*	 * TODO: pkt_len	 */	tcpheader.th_lenres =(sizeof(_tcphdr)/4<<4|0);	//tcpheader.th_lenres =((sizeof(_tcphdr) + data_len)/4<<4|0);	tcpheader.th_flag = 2;	tcpheader.th_win = htons(16384);	tcpheader.th_urp = 0;	tcpheader.th_sum = 0;	_psdhdr.saddr=ipheader.sourceIP;	_psdhdr.daddr=ipheader.destIP;	_psdhdr.mbz=0; 	_psdhdr.ptcl=IPPROTO_TCP;	/*	 * TODO: pkt_len	 */	_psdhdr.tcpl = htons(sizeof(tcpheader) + data_len);		/*	 *	 */	ipheader.checksum = 0;	tcpheader.th_sum = 0;	/*	 * psdhdr + tcpheader + data.	 */	memcpy(send_pkt,&_psdhdr,sizeof(_psdhdr));	memcpy(send_pkt+sizeof(_psdhdr),&tcpheader,sizeof(tcpheader));	memcpy(send_pkt+sizeof(_psdhdr)+sizeof(tcpheader), append_buffer, data_len);	free(append_buffer);	tcpheader.th_sum=checksum((__u16 *)send_pkt,sizeof(_psdhdr)+sizeof(tcpheader) + data_len);	/*	 * the actual packet.	 */	memcpy(send_pkt,&ipheader,sizeof(ipheader));	memcpy(send_pkt+sizeof(ipheader),&tcpheader,sizeof(tcpheader));	memcpy(send_pkt+sizeof(ipheader)+sizeof(tcpheader), append_buffer, data_len);	//memset(send_pkt+sizeof(ipheader)+sizeof(tcpheader),0,4);	send_pkt_size=sizeof(ipheader)+sizeof(tcpheader) + data_len;	ipheader.checksum=checksum((__u16 *)send_pkt,send_pkt_size);	memcpy(send_pkt,&ipheader,sizeof(ipheader));	return send_pkt_size;}static int send_udp(__u16 sport, __u16 dport, int pkt_len){	int send_pkt_size;	int data_len;	unsigned char *append_buffer;	data_len = pkt_len - MACHDRSIZE - sizeof(_iphdr) - sizeof(udpheader);	assert(data_len >= 0);	append_buffer = (unsigned char *)malloc(data_len);	udpheader.dport= htons(dport);	udpheader.sport = htons(sport);	udpheader.len = htons(sizeof(udpheader) + data_len);	udpheader.checksum = 0;	/*	 * TODO: pkt_len	 */	_psdhdr.saddr=ipheader.sourceIP;	_psdhdr.daddr=ipheader.destIP;	_psdhdr.mbz=0; 	_psdhdr.ptcl=IPPROTO_UDP;	/*	 * TODO: pkt_len	 */	_psdhdr.tcpl = htons(sizeof(udpheader) + data_len);		ipheader.checksum = 0;	/*	 * psdhdr + udpheader + data.	 */	memcpy(send_pkt,&_psdhdr,sizeof(_psdhdr));	memcpy(send_pkt+sizeof(_psdhdr),&udpheader,sizeof(udpheader));	memcpy(send_pkt+sizeof(_psdhdr)+sizeof(udpheader), append_buffer, data_len);	free(append_buffer);	udpheader.checksum = checksum((__u16 *)send_pkt,			sizeof(_psdhdr) + sizeof(udpheader) + data_len);	/*	 * the actual packet.	 */	memcpy(send_pkt,&ipheader,sizeof(ipheader));	memcpy(send_pkt+sizeof(ipheader),&udpheader,sizeof(udpheader));	memcpy(send_pkt+sizeof(ipheader)+sizeof(udpheader), append_buffer, data_len);	send_pkt_size = sizeof(ipheader) + sizeof(udpheader) + data_len;	ipheader.checksum = checksum((__u16 *)send_pkt, send_pkt_size);	memcpy(send_pkt, &ipheader, sizeof(ipheader));	return send_pkt_size;}static Boolean protocol_check(char *protocol, int *id){	if (strcmp(protocol, "icmp") == 0) {		*id = IPPROTO_ICMP;		return TRUE;	}	else if (strcmp(protocol, "tcp") == 0) {		*id = IPPROTO_TCP;		return TRUE;	}	else if (strcmp(protocol, "udp") == 0) {		*id = IPPROTO_UDP;		return TRUE;	}	else {		return FALSE;	}}static int is_ip(char *ip){	int dot[4];	int a;	char *leg;	int leg_cnt = 0;	leg = strchr(ip,'.');	while(leg_cnt <= 4) {		if(leg) {			leg++;			leg_cnt++;			leg = strchr(leg,'.');		}		else 			break;	}	if(leg_cnt != 3) {		//printf("illegal ip\n");		return -1;	}	sscanf(ip,"%d.%d.%d.%d",&dot[0],&dot[1],&dot[2],&dot[3]);	for(a = 0;a < 3;a++) {		if(dot[a] < 0 || dot[a] > 255) {			printf("IP:%s  format:dot[%d]:%d\n",ip,a,dot[a]);			return -1;		}	}	return 0;}__attribute__((used)) static char *ip_to_str(__u32 ip){	static char buffer[100];	memset(buffer, 0, 100);	sprintf(buffer, "%u.%u.%u.%u", IPTOSTR(ip));	return buffer;}static void sigexit(int signo){	exiting = 1;}int main(int argc, char **argv){	char *options = "s:d:p:l:i:c:I:Vh";	int ch;	int skfd;	int send_pkt_size;	int rtn;	int map;	__u32 send_cnt;	__u32 sip, dip;	__u16 sport, dport;	char *protocol;	int protocol_id;	int pkt_len;	double interval;	int count;	map = 0;	send_cnt = 0;	rtn = 0;	sip = 0;	dip = 0;	sport = 0;	dport = 0;	protocol = "icmp";	protocol_id = IPPROTO_ICMP;	pkt_len = 64;	interval = 1000000;	count = 0;	while ((ch = getopt(argc, argv, options)) != -1) {		switch (ch) {		case 's':			if (is_ip(optarg)) {				printf("Argument-Error: optarg:%s not ip address format.\n", optarg);				exit(2);			}			sip = inet_addr(optarg);			sport = atoi(argv[optind]);			if (sport == 0) {				sport = 65535;			}			break;		case 'd':			if (is_ip(optarg)) {				printf("Argument-Error: optarg:%s not ip address format.\n", optarg);				exit(2);			}			dip = inet_addr(optarg);			dport = atoi(argv[optind]);			if (dport == 0) {				dport = 65535;			}			break;		case 'p':			protocol = optarg;			if (protocol_check(protocol, &protocol_id) == FALSE) {				printf("Argument-Error: %s bad protocol name, should be [icmp/udp/tcp].\n", protocol);				exit (-1);			}			break;		case 'l':			pkt_len = atoi(optarg);			break;		case 'i':			interval = (atof(optarg) * 1000000);			break;		case 'c':			count = atoi(optarg);			break;		case 'I':			if (inet_pton(AF_INET, optarg, &source.sin_addr) > 0) {				assert(0);				exit(2);			}			else {				device = optarg;			}			break;		case 'V':			printf("Multi-functional Packet Sender, %s\n", VERSION);			exit(0);		case 'h':			usage();		default:			usage();		}	}	//argc -= optind;	//argv += optind;	if (argc == 1) {		usage();	}	if (dip == 0) {		printf("Argument-Error: please specify the destination.\n");		exit(2);	}	if (sip == 0) {		int probe_fd;		probe_fd = socket(AF_INET, SOCK_DGRAM, 0);		if (probe_fd < 0) {			perror("socket");			exit(2);		}		if (device) {			/*			 * SIOCGIFADDR			 */			struct ifreq ifr;			struct sockaddr_in my_addr;			memset(&my_addr, 0, sizeof(my_addr));			memset(&ifr, 0, sizeof(ifr));			strncpy(ifr.ifr_name, device, IFNAMSIZ -1);			if (ioctl(probe_fd, SIOCGIFADDR, &ifr) < 0) {				perror("ioctl");				exit(2);			}			memcpy(&my_addr, &ifr.ifr_addr, sizeof(my_addr));			sip = my_addr.sin_addr.s_addr;			sport = 65535;		}		close(probe_fd);	}	assert(sip);	assert(sport);	skfd = socket(PF_INET, SOCK_RAW, IPPROTO_RAW);	if(skfd == -1) {		perror(":");		printf("error to creat socket\n");		return -1;	}	memset(&sockAddr,0,sizeof(sockAddr));	sockAddr.sin_family=AF_INET;	sockAddr.sin_addr.s_addr = dip;	ipheader.h_verlen=(4<<4 | sizeof(_iphdr)/sizeof(unsigned long));	ipheader.total_len = htons(pkt_len - MACHDRSIZE);		ipheader.ident = 1;	ipheader.frag_and_flags = 0;	ipheader.ttl = 128;	ipheader.proto = protocol_id;	ipheader.checksum = 0;	ipheader.sourceIP = sip;	ipheader.destIP = dip;	if (strcmp(protocol, "icmp") == 0) {		send_pkt_size = build_icmp(pkt_len);	}	else if (strcmp(protocol, "tcp") == 0) {		send_pkt_size = build_tcp(sport, dport, pkt_len);	}	else if (strcmp(protocol, "udp") == 0) {		send_pkt_size = send_udp(sport, dport, pkt_len);	}	else {		printf("bad protocol!");		exit (-1);	}	printf("\n\nsending info:\n");	printf("\tsip: %u.%u.%u.%u sport: %d\n"		       "\tdip: %u.%u.%u.%u dport: %d\n"		       "\tprotocol: %s\n"		       "\tpacket length: %d\n"		       "\tinterval: %.8fs\n"		       "\tcount: %d\n",			IPTOSTR(sip), sport,			IPTOSTR(dip), dport,			protocol,			pkt_len,			interval/1000000,			count);	printf("start sending...............\n");	set_signal(SIGINT, sigexit);	assert(map == 0);	while (1) {		if (map == 0) {			map = 1;			printf("|");			printf("\b");		}		else if (map == 1) {			map = 2;			printf("/");			printf("\b");		}		else if (map == 2) {			map = 3;			printf("-");			printf("\b");		}		else if (map == 3) {			map = 4;			printf("|");			printf("\b");		}		else if (map == 4) {			map = 5;			printf("/");			printf("\b");		}		else if (map == 5) {			map = 6;			printf("-");			printf("\b");		}		else if (map == 6) {			map = 0;			printf("\\");			printf("\b");		}		else {			assert(0);		}		if (exiting) {			break;		}		rtn = sendto(skfd,				send_pkt,				send_pkt_size,				0,				(struct sockaddr*) &sockAddr,				sizeof(sockAddr)				);		if(rtn == -1) {			printf("\nCan't connect this IP!Pls check it.\n");			exit(0);		}		send_cnt++;		if (count && send_cnt >= count) {			break;		}		usleep(interval);		/*		 * flush the stdout, or no printf.		 *		 */		fflush(stdout);	}	close(skfd);	printf("\n\nend sending.....\n");	printf("packets sent: %u.\n", send_cnt);	printf("\n\n");	return 0;}void usage(void){	fprintf(stderr,	"Usage: mps [-Vh] [-s source-ip source-port] [-d dest-ip dest-port]\n"	   " [-c count] [-i interval] [-l pkt-length] [-I interface] [-p protocol]\n");	exit(2);}

⌨️ 快捷键说明

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