nexmon – Blame information for rev 1

Subversion Repositories:
Rev:
Rev Author Line No. Line
1 office 1 #define _XOPEN_SOURCE 700
2  
3  
4 #include <argp.h>
5 #include <string.h>
6 #include <byteswap.h>
7 #include <pthread.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <sys/socket.h>
11 #include <unistd.h>
12 #include <linux/netlink.h>
13 #include <pcap.h>
14  
15  
16 #include <netinet/in.h>
17  
18 #include <unistd.h>
19  
20 #define AS_STR2(TEXT) #TEXT
21 #define AS_STR(TEXT) AS_STR2(TEXT)
22  
23 #define NETLINK_USER 31
24 #define MAX_PAYLOAD 1024 /* maximum payload size*/
25  
26 char *pcap_file_name = NULL;
27  
28  
29 int pid = -1;
30 pthread_t p1;
31 const char *argp_program_version = VERSION;
32 const char *argp_program_bug_address = "<fknapp@seemoo.tu-darmstadt.de>";
33  
34 static char doc[] = "rawproxyreverse -- program to open a raw socket and inject frames as UDP datagrams.";
35  
36 static struct argp_option options[] = {
37  
38 {"interface", 'i', "INTERFACE", 0, "Interface used as RAW interface."},
39 {"parent", 'p', "PARENT", 0, "Parent process id to monitor."},
40 { 0 }
41 };
42  
43 static error_t
44 parse_opt(int key, char *arg, struct argp_state *state)
45 {
46 switch (key) {
47  
48 case 'i':
49 pcap_file_name = arg;
50 break;
51  
52 case 'p':
53 pid = atoi(arg);
54 break;
55 default:
56 return ARGP_ERR_UNKNOWN;
57 }
58  
59 return 0;
60 }
61  
62 struct map {
63 struct map *next;
64 unsigned int addr;
65 char *name;
66 };
67  
68  
69  
70 static struct argp argp = { options, parse_opt, 0, doc };
71  
72 void *check_parent(void *unused)
73 {
74  
75 if(pid != -1) {
76 while(1) {
77 if(kill(pid, 0) != 0) {
78 exit(EXIT_SUCCESS);
79 } else {
80 sleep(1);
81 }
82 }
83 }
84 return NULL;
85 }
86  
87 int
88 main(int argc, char **argv)
89 {
90 pcap_t *handle;
91 unsigned char packet[1500];
92 char errbuf[PCAP_ERRBUF_SIZE];
93 struct sockaddr_in si_app;
94 socklen_t si_app_len = sizeof(si_app);
95 int sock, ret, recv_len;
96  
97 argp_parse(&argp, argc, argv, 0, 0, 0);
98  
99 pthread_create(&p1, NULL, check_parent, (void *)NULL);
100  
101  
102 handle = pcap_open_live(pcap_file_name, BUFSIZ, 1, 1000, errbuf);
103 struct sockaddr_in sin = {
104 .sin_family = AF_INET,
105 .sin_port = htons(5556),
106 .sin_addr.s_addr = inet_addr("127.0.0.1"),
107 .sin_zero = { 0 }
108 };
109  
110 sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
111 bind(sock, (struct sockaddr *)&sin, sizeof(sin));
112  
113 while(1) {
114 recv_len = recvfrom(sock, packet, 1500, 0, (struct sockaddr *) &si_app, &si_app_len);
115 printf("Successful recevied %d bytes\n", recv_len);
116  
117  
118  
119 ret = pcap_inject(handle, &packet, recv_len);
120 if(ret != -1)
121 printf("Successful injected %d bytes\n", ret);
122 else
123 printf("pcap_inject error");
124  
125 }
126  
127  
128 exit(EXIT_SUCCESS);
129 }