about summary refs log tree commit diff stats
path: root/utils/src/test_parsing.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/src/test_parsing.c')
-rw-r--r--utils/src/test_parsing.c613
1 files changed, 613 insertions, 0 deletions
diff --git a/utils/src/test_parsing.c b/utils/src/test_parsing.c new file mode 100644 index 0000000..c345346 --- /dev/null +++ b/utils/src/test_parsing.c
@@ -0,0 +1,613 @@
1#include "helpers.h"
2#include <errno.h>
3#include <libwifi.h>
4#include <pcap.h>
5#include <pcap/pcap.h>
6#include <stddef.h>
7#include <stdint.h>
8#include <stdio.h>
9#include <stdlib.h>
10#include <string.h>
11#include <sys/types.h>
12
13#define PCAP_SAVEFILE "/tmp/debug.pcap"
14#define FILTER ""
15#define MODE_BEACON 1
16#define MODE_PROBE_RESPONSE 2
17#define MODE_PROBE_REQUEST 3
18#define MODE_EAPOL 4
19#define MODE_DEAUTH 5
20#define MODE_DISASSOC 6
21#define MODE_ASSOC_RESPONSE 7
22#define MODE_ASSOC_REQUEST 8
23#define MODE_REASSOC_REQUEST 9
24#define MODE_REASSOC_RESPONSE 10
25#define MODE_DATA 11
26#define MODE_ALL 99
27
28static pcap_t *handle;
29pcap_dumper_t *pd;
30static struct bpf_program *filter;
31static int got_radiotap;
32static unsigned long packet_num = 0;
33static int mode = 0;
34static int parse_radiotap_header = 0;
35
36struct libwifi_bss bss = {0};
37struct libwifi_sta sta = {0};
38
39void help(const char *);
40void parse_packet(unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet);
41void print_bss_info(struct libwifi_bss *bss);
42void print_sta_info(struct libwifi_sta *sta);
43void print_tag_info(unsigned char *data, size_t data_len);
44
45void interrupted(int signum) {
46 pcap_dump_close(pd);
47 pcap_close(handle);
48}
49
50void print_bss_info(struct libwifi_bss *bss) {
51 if (bss == NULL) {
52 return;
53 }
54
55 printf("=== BSS Parsing ===\n");
56 printf("ESSID: %s\n", bss->hidden ? "(hidden)" : bss->ssid);
57 printf("BSSID: " MACSTR "\n", MAC2STR(bss->bssid));
58 printf("Receiver: " MACSTR "\n", MAC2STR(bss->receiver));
59 printf("Transmitter: " MACSTR "\n", MAC2STR(bss->transmitter));
60 printf("Channel: %d\n", bss->channel);
61 printf("WPS: %s\n", bss->wps ? "yes" : "no");
62
63 char sec_buf[LIBWIFI_SECURITY_BUF_LEN];
64 libwifi_get_security_type(bss, sec_buf);
65 printf("Encryption: %s\n", sec_buf);
66
67 libwifi_get_group_ciphers(bss, sec_buf);
68 printf("\tGroup Ciphers: %s\n", sec_buf);
69
70 libwifi_get_pairwise_ciphers(bss, sec_buf);
71 printf("\tPairwise Ciphers: %s\n", sec_buf);
72
73 libwifi_get_auth_key_suites(bss, sec_buf);
74 printf("\tAuth Key Suites: %s\n", sec_buf);
75
76 if (bss->rsn_info.rsn_capabilities & LIBWIFI_RSN_CAPAB_MFP_CAPABLE) {
77 printf("\tMFP Capable: Yes\n");
78 }
79 if (bss->rsn_info.rsn_capabilities & LIBWIFI_RSN_CAPAB_MFP_REQUIRED) {
80 printf("\tMFP Required: Yes\n");
81 }
82
83 if (bss->tags.length) {
84 printf("Tagged Parameters:\n");
85 print_tag_info(bss->tags.parameters, bss->tags.length);
86 } else {
87 printf("Tagged Parameters: None\n");
88 }
89
90 printf("=== BSS End ===\n");
91 printf("\n\n");
92}
93
94void print_sta_info(struct libwifi_sta *sta) {
95 if (sta == NULL) {
96 return;
97 }
98
99 printf("=== STA Parsing ===\n");
100
101 if (sta->broadcast_ssid) {
102 printf("ESSID: <broadcast>\n");
103 } else {
104 printf("ESSID: %s\n", sta->ssid);
105 }
106 printf("Channel: %u\n", sta->channel);
107 printf("BSSID: " MACSTR "\n", MAC2STR(sta->bssid));
108 printf("MAC: " MACSTR "\n", MAC2STR(sta->transmitter));
109
110 printf("=== STA End ===\n");
111 printf("\n\n");
112}
113
114void print_tag_info(unsigned char *data, size_t data_len) {
115 struct libwifi_tag_iterator it;
116 if (libwifi_tag_iterator_init(&it, data, data_len) != 0) {
117 printf("Couldn't initialise tag iterator\n");
118 return;
119 }
120 do {
121 printf("\tTag: %d (Size: %d)\n", it.tag_header->tag_num, it.tag_header->tag_len);
122
123 int max_size = 16;
124 if (it.tag_header->tag_len < 16) {
125 max_size = it.tag_header->tag_len;
126 }
127 printf("\t%d bytes of Tag Data: ", max_size);
128 for (size_t i = 0; i < max_size; i++) {
129 printf("%02x ", it.tag_data[i]);
130 }
131 printf("\n");
132 } while (libwifi_tag_iterator_next(&it) != -1);
133}
134
135void parse_radiotap(const unsigned char *packet) {
136 struct libwifi_radiotap_info rtap_info;
137 libwifi_parse_radiotap_info(&rtap_info, packet);
138
139 printf("=== Radiotap Parsing ===\n");
140 printf("Radiotap Channel: %d\n", rtap_info.channel.freq);
141 printf("Radiotap Channel Flags: 0x%04x\n", rtap_info.channel.flags);
142 printf("Radiotap Rate: %.2f Mb/s\n", rtap_info.rate);
143 printf("Radiotap Rate Raw: 0x%02x\n", rtap_info.rate_raw);
144 printf("Radiotap Signal: %d dBm\n", rtap_info.signal);
145 for (int i = 0; i < rtap_info.antenna_count; i++) {
146 printf("Radiotap Antenna %d: %d dBm\n", rtap_info.antennas[i].antenna_number, rtap_info.antennas[i].signal);
147 }
148 printf("Radiotap Flags: 0x%04x\n", rtap_info.flags);
149 printf("Radiotap Extended Flags: 0x%08x\n", rtap_info.extended_flags);
150 printf("Radiotap RX Flags: 0x%04x\n", rtap_info.rx_flags);
151 printf("Radiotap TX Flags: 0x%04x\n", rtap_info.tx_flags);
152 printf("Radiotap TX Power: %d\n", rtap_info.tx_power);
153 printf("Radiotap RTS Retries: %d\n", rtap_info.rts_retries);
154 printf("Radiotap Data Retries: %d\n", rtap_info.data_retries);
155 printf("=== Radiotap End ===\n");
156}
157
158void parse_beacon(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
159 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_BEACON) {
160 printf("Packet : %lu\n", packet_num);
161 int ret = libwifi_parse_beacon(&bss, &frame);
162 if (ret != 0) {
163 printf("Failed to parse beacon: %d\n", ret);
164 pcap_dump(args, header, packet);
165 return;
166 }
167
168 if (got_radiotap && parse_radiotap_header) {
169 parse_radiotap(packet);
170 }
171
172 print_bss_info(&bss);
173 }
174}
175
176void parse_probe_request(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
177 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_PROBE_REQ) {
178 printf("Packet : %lu\n", packet_num);
179 int ret = libwifi_parse_probe_req(&sta, &frame);
180 if (ret != 0) {
181 printf("Failed to parse probe request: %d\n", ret);
182 pcap_dump(args, header, packet);
183 return;
184 }
185
186 if (got_radiotap && parse_radiotap_header) {
187 parse_radiotap(packet);
188 }
189
190 print_sta_info(&sta);
191 }
192}
193void parse_probe_response(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
194 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_PROBE_RESP) {
195 printf("Packet : %lu\n", packet_num);
196 int ret = libwifi_parse_probe_resp(&bss, &frame);
197 if (ret != 0) {
198 printf("Failed to parse probe response: %d\n", ret);
199 pcap_dump(args, header, packet);
200 return;
201 }
202
203 if (got_radiotap && parse_radiotap_header) {
204 parse_radiotap(packet);
205 }
206
207 print_bss_info(&bss);
208 }
209}
210void parse_deauth(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
211 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_DEAUTH) {
212 printf("Packet : %lu\n", packet_num);
213 struct libwifi_parsed_deauth deauth;
214 int ret = libwifi_parse_deauth(&deauth, &frame);
215 if (ret != 0) {
216 printf("Failed to parse deauthentication: %d\n", ret);
217 pcap_dump(args, header, packet);
218 return;
219 }
220
221 if (got_radiotap && parse_radiotap_header) {
222 parse_radiotap(packet);
223 }
224
225 printf("=== Deauthentication Frame ===\n");
226 if (deauth.ordered) {
227 printf("Address 1: " MACSTR "\n", MAC2STR(deauth.frame_header.ordered.addr1));
228 printf("Address 2: " MACSTR "\n", MAC2STR(deauth.frame_header.ordered.addr2));
229 printf("Address 3: " MACSTR "\n", MAC2STR(deauth.frame_header.ordered.addr3));
230 } else {
231 printf("Address 1: " MACSTR "\n", MAC2STR(deauth.frame_header.unordered.addr1));
232 printf("Address 2: " MACSTR "\n", MAC2STR(deauth.frame_header.unordered.addr2));
233 printf("Address 3: " MACSTR "\n", MAC2STR(deauth.frame_header.unordered.addr3));
234 }
235
236 printf("Reason: %d (0x%04x)\n", deauth.fixed_parameters.reason_code, deauth.fixed_parameters.reason_code);
237
238 if (deauth.tags.length) {
239 printf("Tagged Parameters:\n");
240 print_tag_info(deauth.tags.parameters, deauth.tags.length);
241 } else {
242 printf("Tagged Parameters: None\n");
243 }
244
245 printf("=== End Deauthentication Frame ===\n");
246 printf("\n\n");
247 }
248}
249void parse_disassoc(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
250 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_DISASSOC) {
251 printf("Packet : %lu\n", packet_num);
252 struct libwifi_parsed_disassoc disassoc;
253 int ret = libwifi_parse_disassoc(&disassoc, &frame);
254 if (ret != 0) {
255 printf("Failed to parse diassociation: %d\n", ret);
256 pcap_dump(args, header, packet);
257 return;
258 }
259
260 if (got_radiotap && parse_radiotap_header) {
261 parse_radiotap(packet);
262 }
263
264 printf("=== Disassociation Frame ===\n");
265 if (disassoc.ordered) {
266 printf("Address 1: " MACSTR "\n", MAC2STR(disassoc.frame_header.ordered.addr1));
267 printf("Address 2: " MACSTR "\n", MAC2STR(disassoc.frame_header.ordered.addr2));
268 printf("Address 3: " MACSTR "\n", MAC2STR(disassoc.frame_header.ordered.addr3));
269 } else {
270 printf("Address 1: " MACSTR "\n", MAC2STR(disassoc.frame_header.unordered.addr1));
271 printf("Address 2: " MACSTR "\n", MAC2STR(disassoc.frame_header.unordered.addr2));
272 printf("Address 3: " MACSTR "\n", MAC2STR(disassoc.frame_header.unordered.addr3));
273 }
274
275 printf("Reason: %d (0x%04x)\n", disassoc.fixed_parameters.reason_code, disassoc.fixed_parameters.reason_code);
276
277 printf("Tagged Parameters:\n");
278 if (disassoc.tags.length == 0) {
279 printf("\tNo Tags\n");
280 } else {
281 printf("\tTags Found\n");
282 }
283
284 printf("=== End Disassociation Frame ===\n");
285 printf("\n\n");
286 }
287}
288void parse_assoc_request(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
289 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_ASSOC_REQ) {
290 printf("Packet : %lu\n", packet_num);
291 int ret = libwifi_parse_assoc_req(&sta, &frame);
292 if (ret != 0) {
293 printf("Failed to parse association request: %d\n", ret);
294 pcap_dump(args, header, packet);
295 return;
296 }
297
298 if (got_radiotap && parse_radiotap_header) {
299 parse_radiotap(packet);
300 }
301
302 print_sta_info(&sta);
303 }
304}
305void parse_assoc_response(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
306 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_ASSOC_RESP) {
307 printf("Packet : %lu\n", packet_num);
308 int ret = libwifi_parse_assoc_resp(&bss, &frame);
309 if (ret != 0) {
310 printf("Failed to parse association response: %d\n", ret);
311 pcap_dump(args, header, packet);
312 return;
313 }
314
315 if (got_radiotap && parse_radiotap_header) {
316 parse_radiotap(packet);
317 }
318
319 print_bss_info(&bss);
320 }
321}
322void parse_reassoc_request(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
323 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_REASSOC_REQ) {
324 printf("Packet : %lu\n", packet_num);
325 int ret = libwifi_parse_reassoc_req(&sta, &frame);
326 if (ret != 0) {
327 printf("Failed to parse reassociation request: %d\n", ret);
328 pcap_dump(args, header, packet);
329 return;
330 }
331
332 if (got_radiotap && parse_radiotap_header) {
333 parse_radiotap(packet);
334 }
335
336 print_sta_info(&sta);
337 }
338}
339void parse_reassoc_response(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
340 if (frame.frame_control.type == TYPE_MANAGEMENT && frame.frame_control.subtype == SUBTYPE_REASSOC_RESP) {
341 printf("Packet : %lu\n", packet_num);
342 int ret = libwifi_parse_reassoc_resp(&bss, &frame);
343 if (ret != 0) {
344 printf("Failed to parse reassociation response: %d\n", ret);
345 pcap_dump(args, header, packet);
346 return;
347 }
348
349 if (got_radiotap && parse_radiotap_header) {
350 parse_radiotap(packet);
351 }
352
353 print_bss_info(&bss);
354 }
355}
356void parse_data_eapol(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
357 if (frame.frame_control.type == TYPE_DATA) {
358 if (libwifi_check_wpa_handshake(&frame) > 0) {
359 printf("=== EAPOL ===\n");
360 printf("WPA Handshake\n");
361 int part = libwifi_check_wpa_message(&frame);
362 printf("WPA Handshake Message: %s\n", libwifi_get_wpa_message_string(&frame));
363
364 struct libwifi_wpa_auth_data data = {0};
365 libwifi_get_wpa_data(&frame, &data);
366
367 printf("EAPOL: Version: %d\n", data.version);
368 printf("EAPOL: Type: %d\n", data.type);
369 printf("EAPOL: Length: %d\n", data.length);
370 printf("EAPOL: Descriptor: %d\n", data.descriptor);
371 printf("EAPOL: Key Info: Information: 0x%04x\n", data.key_info.information);
372 printf("EAPOL: Key Info: Key Length: %d\n", data.key_info.key_length);
373 printf("EAPOL: Key Info: Replay Counter: %lu\n", data.key_info.replay_counter);
374 printf("EAPOL: Key Info: Nonce: ");
375 for (size_t i = 0; i < sizeof(data.key_info.nonce); ++i) printf("%02x ", data.key_info.nonce[i]);
376 printf("\n");
377 printf("EAPOL: Key Info: IV: ");
378 for (size_t i = 0; i < sizeof(data.key_info.iv); ++i) printf("%02x ", data.key_info.iv[i]);
379 printf("\n");
380 printf("EAPOL: Key Info: RSC: ");
381 for (size_t i = 0; i < sizeof(data.key_info.rsc); ++i) printf("%02x ", data.key_info.rsc[i]);
382 printf("\n");
383 printf("EAPOL: Key Info: ID: ");
384 for (size_t i = 0; i < sizeof(data.key_info.id); ++i) printf("%02x ", data.key_info.id[i]);
385 printf("\n");
386 printf("EAPOL: Key Info: MIC: ");
387 for (size_t i = 0; i < sizeof(data.key_info.mic); ++i) printf("%02x ", data.key_info.mic[i]);
388 printf("\n");
389 printf("EAPOL: Key Info: Key Data Length: %d\n", data.key_info.key_data_length);
390 if (data.key_info.key_data_length) {
391 printf("EAPOL: Key Info: Key Data: ");
392 for (size_t i = 0; i < data.key_info.key_data_length; ++i) printf("%02x ", data.key_info.key_data[i]);
393 printf("\n");
394 }
395
396 libwifi_free_wpa_data(&data);
397
398 printf("\n\n");
399 }
400 }
401}
402
403void parse_data(struct libwifi_frame frame, unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
404 if (frame.frame_control.type == TYPE_DATA) {
405 if (frame.flags & LIBWIFI_FLAGS_IS_QOS) {
406 printf("Receiver: " MACSTR "\n", MAC2STR(frame.header.data_qos.addr1));
407 printf("Transmitter: " MACSTR "\n", MAC2STR(frame.header.data_qos.addr2));
408 } else {
409 printf("Receiver: " MACSTR "\n", MAC2STR(frame.header.data.addr1));
410 printf("Transmitter: " MACSTR "\n", MAC2STR(frame.header.data.addr2));
411 }
412 printf("Body Length: %zu\n", frame.len - frame.header_len);
413 printf("Body:\n");
414 hexdump(frame.body, frame.len - frame.header_len);
415 }
416}
417
418void parse_packet(unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) {
419 ++packet_num;
420 unsigned long data_len = header->caplen;
421 unsigned char *data = (unsigned char *) packet;
422
423 struct libwifi_frame frame = {0};
424 int ret = libwifi_get_wifi_frame(&frame, data, data_len, 1);
425 if (ret != 0) {
426 printf("[!] Error getting libwifi_frame: %d\n", ret);
427 return;
428 }
429
430 memset(&bss, 0, sizeof(struct libwifi_bss));
431 memset(&sta, 0, sizeof(struct libwifi_sta));
432
433 switch (mode) {
434 case MODE_BEACON:
435 parse_beacon(frame, args, header, packet);
436 break;
437 case MODE_PROBE_REQUEST:
438 parse_probe_request(frame, args, header, packet);
439 break;
440 case MODE_PROBE_RESPONSE:
441 parse_probe_response(frame, args, header, packet);
442 break;
443 case MODE_DEAUTH:
444 parse_deauth(frame, args, header, packet);
445 break;
446 case MODE_DISASSOC:
447 parse_disassoc(frame, args, header, packet);
448 break;
449 case MODE_ASSOC_REQUEST:
450 parse_assoc_request(frame, args, header, packet);
451 break;
452 case MODE_ASSOC_RESPONSE:
453 parse_assoc_response(frame, args, header, packet);
454 break;
455 case MODE_REASSOC_REQUEST:
456 parse_reassoc_request(frame, args, header, packet);
457 break;
458 case MODE_REASSOC_RESPONSE:
459 parse_reassoc_response(frame, args, header, packet);
460 break;
461 case MODE_EAPOL:
462 parse_data_eapol(frame, args, header, packet);
463 break;
464 case MODE_DATA:
465 parse_data(frame, args, header, packet);
466 break;
467 case MODE_ALL:
468 parse_beacon(frame, args, header, packet);
469 parse_probe_request(frame, args, header, packet);
470 parse_probe_response(frame, args, header, packet);
471 parse_deauth(frame, args, header, packet);
472 parse_disassoc(frame, args, header, packet);
473 parse_assoc_request(frame, args, header, packet);
474 parse_assoc_response(frame, args, header, packet);
475 parse_reassoc_request(frame, args, header, packet);
476 parse_reassoc_response(frame, args, header, packet);
477 parse_data_eapol(frame, args, header, packet);
478 parse_data(frame, args, header, packet);
479 default:
480 break;
481 }
482
483 libwifi_free_bss(&bss);
484 libwifi_free_wifi_frame(&frame);
485}
486
487void help(const char *name) {
488 fprintf(stderr, "Usage:\n");
489 fprintf(stderr, "\t%s --interface [interface] [--mode] [--radiotap]\n", name);
490 fprintf(stderr, "\t\tor\n");
491 fprintf(stderr, "\t%s --file [capture file] [--mode] [--radiotap]\n", name);
492 fprintf(stderr, "\n");
493 fprintf(stderr, "Modes:\n");
494 fprintf(stderr, "\t--beacon\n");
495 fprintf(stderr, "\t--probe-req\n");
496 fprintf(stderr, "\t--probe-resp\n");
497 fprintf(stderr, "\t--deauth\n");
498 fprintf(stderr, "\t--disassoc\n");
499 fprintf(stderr, "\t--assoc-req\n");
500 fprintf(stderr, "\t--assoc-resp\n");
501 fprintf(stderr, "\t--reassoc-req\n");
502 fprintf(stderr, "\t--reassoc-resp\n");
503 fprintf(stderr, "\t--eapol\n");
504}
505
506void handle_args(int argc, const char *argv[]) {
507 char errbuf[PCAP_ERRBUF_SIZE];
508
509 if (argc < 4) {
510 help(argv[0]);
511 exit(EXIT_SUCCESS);
512 }
513
514 if (strcmp(argv[1], "--file") == 0) {
515 if ((handle = pcap_open_offline(argv[2], errbuf)) == NULL) {
516 fprintf(stderr, "Couldn't read file %s: %s\n", argv[2], errbuf);
517 exit(EXIT_FAILURE);
518 }
519 } else if (strcmp(argv[1], "--interface") == 0) {
520 if ((handle = pcap_create(argv[2], errbuf)) == NULL) {
521 fprintf(stderr, "Failed to open interface \"%s\" for sniffing: %s\n", argv[2], errbuf);
522 exit(EXIT_FAILURE);
523 }
524 if (pcap_activate(handle) == 0) {
525 printf("[+] Started sniffing on %s\n", argv[2]);
526 } else {
527 fprintf(stderr, "[!] Couldn't activate capture: %s.\n", pcap_geterr(handle));
528 pcap_close(handle);
529 exit(EXIT_FAILURE);
530 }
531 } else {
532 help(argv[0]);
533 exit(EXIT_SUCCESS);
534 }
535
536 if (strcmp(argv[3], "--beacon") == 0) {
537 mode = MODE_BEACON;
538 } else if (strcmp(argv[3], "--probe-req") == 0) {
539 mode = MODE_PROBE_REQUEST;
540 } else if (strcmp(argv[3], "--probe-resp") == 0) {
541 mode = MODE_PROBE_RESPONSE;
542 } else if (strcmp(argv[3], "--deauth") == 0) {
543 mode = MODE_DEAUTH;
544 } else if (strcmp(argv[3], "--disassoc") == 0) {
545 mode = MODE_DISASSOC;
546 } else if (strcmp(argv[3], "--assoc-req") == 0) {
547 mode = MODE_ASSOC_REQUEST;
548 } else if (strcmp(argv[3], "--assoc-resp") == 0) {
549 mode = MODE_ASSOC_RESPONSE;
550 } else if (strcmp(argv[3], "--reassoc-req") == 0) {
551 mode = MODE_REASSOC_REQUEST;
552 } else if (strcmp(argv[3], "--reassoc-resp") == 0) {
553 mode = MODE_REASSOC_RESPONSE;
554 } else if (strcmp(argv[3], "--eapol") == 0) {
555 mode = MODE_EAPOL;
556 } else if (strcmp(argv[3], "--data") == 0) {
557 mode = MODE_DATA;
558 } else if (strcmp(argv[3], "--all") == 0) {
559 mode = MODE_ALL;
560 } else {
561 help(argv[0]);
562 exit(EXIT_SUCCESS);
563 }
564
565 if (argc > 4) {
566 if (strcmp(argv[4], "--radiotap") == 0) {
567 parse_radiotap_header = 1;
568 }
569 }
570}
571
572int main(int argc, const char *argv[]) {
573 packet_num = 0;
574 char errbuf[PCAP_ERRBUF_SIZE];
575
576 handle_args(argc, argv);
577
578 int linktype = pcap_datalink(handle);
579 if (linktype == DLT_IEEE802_11_RADIO) {
580 got_radiotap = 1;
581 } else if (linktype == DLT_IEEE802_11) {
582 got_radiotap = 0;
583 } else {
584 fprintf(stderr, "[!] 802.11 and radiotap headers not provided (%d)\n", pcap_datalink(handle));
585 pcap_close(handle);
586 exit(EXIT_FAILURE);
587 }
588
589 if ((filter = malloc(sizeof(struct bpf_program))) == NULL) {
590 perror("Malloc failure");
591 pcap_close(handle);
592 exit(EXIT_FAILURE);
593 }
594 printf("[*] Compiling and optimizing frame filter, this can take a second\n");
595 if (pcap_compile(handle, filter, FILTER, 0, 0) != 0) {
596 fprintf(stderr, "[!] Couldn't compile filter: %s\n", pcap_geterr(handle));
597 pcap_close(handle);
598 free(filter);
599 exit(EXIT_FAILURE);
600 }
601 if (pcap_setfilter(handle, filter) != 0) {
602 fprintf(stderr, "[!] Couldn't set filter: %s\n", pcap_geterr(handle));
603 pcap_close(handle);
604 free(filter);
605 exit(EXIT_FAILURE);
606 }
607 printf("[+] Complete\n");
608
609 pd = pcap_dump_open(handle, PCAP_SAVEFILE);
610 pcap_loop(handle, -1 /*INFINITY*/, &parse_packet, (unsigned char *) pd);
611
612 return 0;
613}