📄 kinject.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 + -