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

📄 kinject.c

📁 一个学习SNMP项目:tmoerlan.
💻 C
字号:
/* $Id: kinject.c,v 1.2 2003/09/17 11:26:10 tmoerlan Exp $ */#include <sys/types.h>#include <netinet/in_systm.h>#include <arpa/inet.h>#include <assert.h>#include <fcntl.h>#include <netinet/ip.h>#include <netdb.h>#include <netinet/in.h>#include <unistd.h>#include <stdio.h>#include <string.h>#include <sys/socket.h>#include <sys/stat.h>//#include <sys/types.h>#include "../lib/snap.h"#include "../lib/bytecode.h"#include "../lib/packet.h"#include "../lib/d_printf.h"#include "../lib/memalloc.h"#include "../lib/io.h"#define NIPQUAD(addr) \        ((unsigned char *)&addr)[0], \        ((unsigned char *)&addr)[1], \        ((unsigned char *)&addr)[2], \        ((unsigned char *)&addr)[3]#define IPPROTO_SNAP 130/* settable options */unsigned char out_ttl = 16;short int udpport = 7777;struct sockaddr_in destaddr;#ifdef USER_SPACEstruct sockaddr_in srcaddr;#endifextern char *basename(const char *);void parse_cmdline(int argc,char **argv);int infd;int main(int argc,char **argv) {  buffer_t inbuf;  int sd;  int packet_lenb;  struct snaphdr *hdr;  char ra_space[4];  parse_cmdline(argc,argv);  /* first suck in the binary packet */  packet_lenb = file_to_str(infd,&inbuf);  if (packet_lenb < inbuf.lenb)    inbuf.lenb = packet_lenb;  printf("read in %d bytes\n",inbuf.lenb);  /* touch up certain SNAP header entries */  hdr = (struct snaphdr *)inbuf.s;#ifdef USER_SPACE  hdr->saddr = srcaddr.sin_addr.s_addr;  hdr->daddr = destaddr.sin_addr.s_addr;#endif  hdr->version = 1;  hdr->flags = 0;  hdr->sport = htons(udpport);    /* open up raw socket */  if ((sd = socket(AF_INET, SOCK_RAW, IPPROTO_SNAP)) < 0) {    perror("inject: socket");    exit(1);  }    /* set socket options : first, router alert */  bzero(ra_space,4);  ra_space[IPOPT_OPTVAL] = IPOPT_RA;  ra_space[IPOPT_OLEN] = 4;  if (setsockopt(sd, IPPROTO_IP, IP_OPTIONS, ra_space,		 sizeof(ra_space)) < 0) {    perror("inject: setsockopt: router alert");    exit(1);  }  /* now set resource bound as requested */  if (setsockopt(sd, IPPROTO_IP, IP_TTL, 		 (char *)&out_ttl, sizeof(out_ttl)) < 0) {    perror("inject: setsockopt: ttl");    exit(1);  }  printf("sending to %d.%d.%d.%d\n",NIPQUAD(destaddr.sin_addr.s_addr));  if (sendto(sd, inbuf.s, inbuf.lenb, 0, (struct sockaddr *)&destaddr,	     sizeof(destaddr)) < 0) {    perror("sendto");  }  return(0);}void usage(int argc, char **argv) {#ifdef USER_SPACE  printf("usage: %s [-?] [-t ttl] [-p udpport] src dest infile\n",basename(argv[0]));  printf("\t-t : set the outgoing TTL (resource bound) (default=16)\n");  printf("\t-p : set the source port number (default=7777)\n");  printf("\t-? : print this help\n");#else  printf("usage: %s [-?] [-t ttl] [-p udpport] dest infile\n",basename(argv[0]));  printf("\t-t : set the outgoing TTL (resource bound) (default=16)\n");  printf("\t-p : set the source port number (default=7777)\n");  printf("\t-? : print this help\n");#endif}void parse_cmdline(int argc, char **argv) {  char *opts = "?t:p:";  char c;  int args_expected = 3;  int args_processed = 0;  int argidx;  char *infilename;  while((c = getopt(argc,argv,opts)) != EOF) {    switch(c) {    case '?':      usage(argc,argv);      exit(1);    case 't':      out_ttl = atoi(optarg);      if (out_ttl <= 0) {	fprintf(stderr,"%s: invalid TTL: %d\n",basename(argv[0]),out_ttl);	fflush(stderr);	usage(argc,argv);	exit(1);      }      fprintf(stderr,"%s: setting TTL to %d\n",basename(argv[0]),out_ttl);      break;    case 'p':      udpport = atoi(optarg);      if (udpport <= 0) {	fprintf(stderr,"%s: invalid source port: %d\n",		basename(argv[0]),udpport);	fflush(stderr);	usage(argc,argv);	exit(1);      }      break;    default:      fprintf(stderr,"%s: unrecognized option -%c\n",	      basename(argv[0]),c);      fflush(stderr);      usage(argc,argv);      exit(1);    }  }  argidx = optind;  bzero(&destaddr,sizeof(destaddr));  while(args_processed < args_expected) {    if (argidx >= argc) {      /* missing arguments */      printf("%s: missing argument(s)\n",basename(argv[0]));      usage(argc,argv);      exit(1);    }    switch(args_processed) {    case 0: {			/* source address */      struct hostent *srchostp = gethostbyname(argv[argidx]);      if (srchostp == NULL) {	fprintf(stderr,"%s: unknown dest host %s\n",		basename(argv[0]),argv[argidx]);	fflush(stderr);	usage(argc,argv);	exit(1);      }      assert(srchostp->h_addrtype == AF_INET);      assert(srchostp->h_length == sizeof(unsigned int));      memcpy(&srcaddr.sin_addr.s_addr,srchostp->h_addr,srchostp->h_length);      srcaddr.sin_family = AF_INET;      break;    }    case 1: {			/* destination address */      struct hostent *desthostp = gethostbyname(argv[argidx]);      if (desthostp == NULL) {	fprintf(stderr,"%s: unknown dest host %s\n",		basename(argv[0]),argv[argidx]);	fflush(stderr);	usage(argc,argv);	exit(1);      }      assert(desthostp->h_addrtype == AF_INET);      assert(desthostp->h_length == sizeof(unsigned int));      memcpy(&destaddr.sin_addr.s_addr,desthostp->h_addr,desthostp->h_length);      destaddr.sin_family = AF_INET;      break;    }    case 2:			/* packet file name */      infilename = argv[argidx];      if (strcmp(infilename,"-") == 0) {	infd = 0;		/* stdin */      } else {	infd = open(infilename,O_RDONLY);	if (infd == -1) {	  fprintf(stderr,"%s: unable to open file \"%s\" for input\n",		  basename(argv[0]),infilename);	  fflush(stderr);	  exit(1);	}      }      break;    }    argidx++;    args_processed++;  }  if (argidx < argc) {    /* extra arguments */    printf("%s: extra argument(s)\n",basename(argv[0]));    usage(argc,argv);    exit(1);  }  return;}

⌨️ 快捷键说明

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