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

📄 ana.c

📁 在命令行状态下
💻 C
字号:
#include <string.h>#include <sys/types.h>#include <getopt.h>#include <stdio.h>#include <stdlib.h>#include <netinet/in.h>#include <netinet/ip.h>#include <netinet/ether.h>#include <pcap.h>#include <netinet/udp.h>#include <netinet/tcp.h>#define DEFAULT_SNAPLEN 68/* The name of this program.  */const char* program_name;int g_sflag;	//source ipint g_eflag;	//end ipint g_pflag;	//protocolint g_oflag;	//offsetint g_nflag;	//numberint g_fflag;	//open fileint g_Iflag;	//output ipint g_Pflag;	//output portchar *g_sourip, *g_endip, *g_protocol;int  g_offset, g_number;int g_iphdrlen;////////////////////////////////////////////////// write result to file/////////////////////////////////////////////////void  WRsltFile(char* proto, char*spstr, 	char*dpstr, u_short s_port, 	u_short d_port, int len, const u_char *p){        char data[128]={0};	char datb[8152]={0};	char datc[3]={0};        FILE *pf=NULL;	u_char *pdata=NULL;	static int g_first=1;	int i=0,j=0;        if(g_first == 1)        {                pf=fopen("Result.txt", "w+");                g_first =0;        }        else        {                pf=fopen("Result.txt", "a+");        }        if(pf==NULL)        {                fprintf(stderr, "file open failure!\n");                return;	}	if(proto[0]!=0)	{	        snprintf(data,sizeof(data),		    "%s:\n------------------------------------\n",		     proto);	        fputs(data, pf);		fprintf(stderr, "%s",data);	}	if(g_Iflag==1 	    &&spstr[0] !=0	    &&dpstr[0] !=0)	{		snprintf(data,sizeof(data),"\tsrc ip:%s\tdst ip:%s\n",                spstr,dpstr);		fputs(data, pf);		fprintf(stderr, "%s",data);	}	if(g_Pflag==1 &&s_port!=0 &&d_port!=0)	{		snprintf(data,sizeof(data),"\tsrc port:%d\t\tdst port:%d\n",                s_port,d_port);		fputs(data, pf);		fprintf(stderr,"%s",data);	}	if(g_oflag==1)	{		if(g_offset > len)		{		    fputs("\toffset out of range!\n", pf);		    fclose(pf);		    return;		}		pdata= (u_char*)(p+g_offset);		j=g_offset;		while(pdata!=NULL && j<len)		{		    if(g_nflag==1			&& (j-g_offset)>=g_number)		    {			break;		    }		    snprintf(datc,3,"%02X",*pdata);		    memcpy(&datb[i],datc,2);		    pdata++;		    i=i+2;		    j++; 		}		len = i;		for(i=0; i<len; i++)		{		    if(i%2 ==0 && i%16!=0 && i%32!=0)		    {			fputc(' ', pf);			fprintf(stderr," ");		    }		    else if(i%16 ==0 && i%32 !=0)		    {			fputc('\t', pf);			fputc('\t', pf);			fprintf(stderr,"\t\t");					    }		    else if (i%32 ==0)		    {			fputc('\n', pf);			fputc('\t', pf);			fprintf(stderr,"\n\t");		    }		    fputc(datb[i], pf);		    fprintf(stderr,"%c",datb[i]);		}		//printf("\n%s",pdata);		fputc('\n', pf);		fputc('\n', pf);		fputc('\n', pf);		fprintf(stderr,"\n\n\n");	}        fclose(pf);        return;}                                        /////////////////////////////////////////// analysis every packet//////////////////////////////////////////void AnalysePacket(u_char *_deviceId,			 const struct pcap_pkthdr *h,			 const u_char *p){	struct ether_header* ethdr=NULL;	struct ip*  iphdr=NULL;	struct udphdr* udphdr=NULL;	struct tcphdr* tcphdr=NULL;	unsigned int etype;	char spstr[16]={0};	char dpstr[16]={0};	u_char ptype;	u_char* app_data;	int pack_len=0;	u_long n_sip=0;	u_long n_eip=0;	u_short s_port=0;	u_short d_port=0;	char proto[8]={0};	ethdr = (struct ether_header*) p;	etype = ntohs(ethdr->ether_type);	if (etype == ETHERTYPE_IP)	{		iphdr = (struct ip*)(p + 14);		g_iphdrlen = iphdr->ip_hl *4;				//fetch a range of ip		if(g_sflag==1 && g_eflag==1 			&&g_sourip!=NULL			&&g_endip!=NULL)		{			if(inet_pton(AF_INET, g_sourip, &n_sip)==-1)				return;			if(inet_pton(AF_INET, g_endip, &n_eip)==-1)				return;			if(iphdr->ip_src.s_addr < n_sip				||iphdr->ip_src.s_addr > n_eip)			{				return;			}			}		else if(g_sflag==1 && g_sourip!=NULL)		{			if(inet_pton(AF_INET, g_sourip, &n_sip)==-1				|| n_sip !=iphdr->ip_src.s_addr)				return;		}		//source and dest ip		if(g_Iflag==1)		{			if(inet_ntop(AF_INET, 				&iphdr->ip_src, spstr, sizeof(spstr))== 0)			{				return;			}			if(inet_ntop(AF_INET, 				&iphdr->ip_dst, dpstr, sizeof(dpstr))== 0)			{				return;			}		}		ptype = iphdr->ip_p;				if(ptype ==IPPROTO_TCP)		{			if( g_pflag==1 				&& g_protocol != NULL				&& memcmp(g_protocol,"udp",3)==0)			{				return;			}						memcpy(proto,"tcp",3);			tcphdr = (struct tcphdr*)(p + 14 +g_iphdrlen);			if(g_Pflag==1)			{				s_port = ntohs(tcphdr->source);				d_port = ntohs(tcphdr->dest);			}		}		else if(ptype  ==IPPROTO_UDP)				{                        if( g_pflag==1                                && g_protocol != NULL                                && memcmp(g_protocol,"tcp",3)==0)                        {                                return;                        }			memcpy(proto,"udp",3);			udphdr = (struct udphdr*)(p + 14 +g_iphdrlen);			if(g_Pflag==1)			{                                s_port = ntohs(udphdr->source);                                d_port = ntohs(udphdr->dest);			}						printf("%s",p+14+g_iphdrlen+8);		}		else		{                        if( g_protocol != NULL			    &&(memcmp(g_protocol,"tcp",3)==0			    ||memcmp(g_protocol,"udp",3)==0))			{				return;			}		}	}	else	{  		//if specified protocol and not identical,then exit                if( g_protocol != NULL		    &&(memcmp(g_protocol,"tcp",3)==0		    ||memcmp(g_protocol,"udp",3)==0))		{			return;		}		}	WRsltFile(proto, spstr, dpstr, s_port, d_port, h->len, p);	return;}///////////////////////////////////////////// capture every packet and save to file////////////////////////////////////////////void CatchToFile(){	pcap_dumper_t *pw;	pcap_t * pd;	char *device = NULL;	char errbuf[PCAP_ERRBUF_SIZE];	int  promisc;	u_char *pack=NULL;	struct pcap_pkthdr h;	if((device = pcap_lookupdev(errbuf)) == NULL) {		printf("pcap_lookup: %s", errbuf);		return;	}	promisc = 1;	if((pd = pcap_open_live("eth0", DEFAULT_SNAPLEN, 		promisc, 500, errbuf)) == NULL) {		printf("pcap_open_live: %s\n", errbuf);		return;	}	if((pw = pcap_dump_open(pd, "savefile"))==NULL)	{		fprintf(stderr,"dump_open:%s",pcap_geterr(pd));	}	while(1)	{		pack = (u_char*)pcap_next(pd, &h);			if(pack !=NULL)		{			pcap_dump((u_char*)pw, &h, pack);			AnalysePacket(NULL, &h, pack);		}	}	pcap_dump_close(pw);	pcap_close(pd);	return;}///////////////////////////////////////////// read packet data from file and analysis////////////////////////////////////////////void ReadFmFile(char * filename){        pcap_t *pt;        char errbuf[PCAP_ERRBUF_SIZE];	if(filename == NULL)		return;        fprintf(stderr,"in read:%s\n",filename);        if( filename!=NULL	    &&(pt=pcap_open_offline(filename,errbuf))==NULL)        {                pcap_perror(pt, "open file");                return;        }        if(pcap_loop(pt, -1, AnalysePacket, NULL)==-1)        {                pcap_perror(pt, "loop");        }        pcap_close(pt);        return;}////////////////////////////////////////////////// print help infomation//////////////////////////////////////////////////void print_usage (FILE* stream, int exit_code){	fprintf (stream, "Usage:  %s options [ inputfile ... ]\n", program_name);	fprintf (stream,		"  -h  --help		Display this usage information.\n"		"  -s  --source   	Source ip address.\n"		"  -b  --begin		Source begin ip address.\n"		"  -e  --end		Source end ip address.\n"		"  -p  --protocol	Protocol.\n"		"  -f  --from		From what location to catch bytes.\n"		"  -n  --number		Catch bytes number.\n"		"  -P  --port		Output source & destination port.\n"		"  -I  --ip		Output source & destination ip.\n"		"  -o  --open		Open exist file to analyses.\n"	);	exit (exit_code);}///////////////////////////////////////////////// main function/////////////////////////////////////////////////int main(int argc, char* argv[]){	int next_option;	char *filename = NULL;	program_name = (const char*)argv[0];	const char* const short_options = "hs:b:e:p:f:n:PIo:";	const struct option long_options[] = {		{ "help",     0, NULL, 'h' },		{ "source",   1, NULL, 's' },		{ "begin",    1, NULL, 'b' },		{ "end",      1, NULL, 'e' },		{ "protocol", 1, NULL, 'p' },		{ "from",     1, NULL, 'f' },		{ "number",   1, NULL, 'n' },		{ "port",     0, NULL, 'P' },		{ "ip",       0, NULL, 'I' },		{ "open",     1, NULL, 'o' },		{ NULL,       0, NULL, 0   }   /* Required at end of array.  */	};	//init globle variable 	g_sourip=NULL;	g_endip=NULL;	g_protocol=NULL;	g_offset=0;	g_number=0;	g_sflag=0;	g_eflag=0;	g_pflag=0;	g_oflag=0;	g_nflag=0;	g_fflag=0;	g_Iflag=0;	g_Pflag=0;	g_iphdrlen=0;	do{		next_option = getopt_long (argc, argv, short_options,                               long_options, NULL);		switch(next_option)		{		case 'h':			print_usage (stdout, 0);		case '?':			print_usage(stdout, 0);		case 's':			g_sflag=1;			g_sourip = optarg;			break;		case 'b':			g_sflag=1;			g_sourip = optarg;			break;		case 'e':			g_eflag=1;			g_endip = optarg;			break;		case 'p':			g_pflag=1;			g_protocol = optarg;			break;		case 'f':			g_oflag=1;			g_offset = atoi(optarg);			break;		case 'n':			g_nflag=1;			g_number = atoi(optarg);			break;		case 'P':			g_Pflag=1;			break;		case 'I':			g_Iflag=1;			break;		case 'o': 			g_fflag=1;			filename = optarg;			break;		default:			break;		}	}while(next_option != -1);		if(g_fflag==1)	{		ReadFmFile(filename);	}		else	{		CatchToFile();	}	return 1;}

⌨️ 快捷键说明

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