diff options
Diffstat (limited to 'examples/parse_eapol/parse_eapol.c')
-rw-r--r-- | examples/parse_eapol/parse_eapol.c | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/examples/parse_eapol/parse_eapol.c b/examples/parse_eapol/parse_eapol.c new file mode 100644 index 0000000..259ee5f --- /dev/null +++ b/examples/parse_eapol/parse_eapol.c | |||
@@ -0,0 +1,140 @@ | |||
1 | #include <libwifi.h> | ||
2 | |||
3 | #include <pcap.h> | ||
4 | |||
5 | #include <stdio.h> | ||
6 | #include <stdlib.h> | ||
7 | #include <string.h> | ||
8 | |||
9 | static int has_radiotap = 0; | ||
10 | |||
11 | void handle_pkt(unsigned char *args, const struct pcap_pkthdr *header, const unsigned char *packet) { | ||
12 | unsigned long data_len = header->caplen; | ||
13 | unsigned char *data = (unsigned char *) packet; | ||
14 | |||
15 | // Initialise a libwifi_frame struct and populate it | ||
16 | struct libwifi_frame frame = {0}; | ||
17 | int ret = libwifi_get_wifi_frame(&frame, data, data_len, has_radiotap); | ||
18 | if (ret != 0) { | ||
19 | return; | ||
20 | } | ||
21 | |||
22 | // Ensure the parsed frame is a data frame | ||
23 | if (frame.frame_control.type == TYPE_DATA) { | ||
24 | // Ensure the parsed data frame is a WPA handshake | ||
25 | if (libwifi_check_wpa_handshake(&frame) > 0) { | ||
26 | // Use libwifi to get the EAPOL message part, and also pretty-print it | ||
27 | int part = libwifi_check_wpa_message(&frame); | ||
28 | printf("WPA Handshake Message: %d (%s)\n", part, libwifi_get_wpa_message_string(&frame)); | ||
29 | |||
30 | // Initlaise a WPA Authentication Data struct and populate it | ||
31 | struct libwifi_wpa_auth_data data = {0}; | ||
32 | libwifi_get_wpa_data(&frame, &data); | ||
33 | |||
34 | // Print all of the available WPA Auth data | ||
35 | printf("EAPOL: Version: %d\n", data.version); | ||
36 | printf("EAPOL: Type: %d\n", data.type); | ||
37 | printf("EAPOL: Length: %d\n", data.length); | ||
38 | printf("EAPOL: Descriptor: %d\n", data.descriptor); | ||
39 | printf("EAPOL: Key Info: Information: 0x%04x\n", data.key_info.information); | ||
40 | printf("EAPOL: Key Info: Key Length: %d\n", data.key_info.key_length); | ||
41 | printf("EAPOL: Key Info: Replay Counter: %lu\n", data.key_info.replay_counter); | ||
42 | printf("EAPOL: Key Info: Nonce: "); | ||
43 | for (size_t i = 0; i < sizeof(data.key_info.nonce); ++i) { | ||
44 | printf("%02x ", data.key_info.nonce[i]); | ||
45 | } | ||
46 | printf("\n"); | ||
47 | |||
48 | printf("EAPOL: Key Info: IV: "); | ||
49 | for (size_t i = 0; i < sizeof(data.key_info.iv); ++i) { | ||
50 | printf("%02x ", data.key_info.iv[i]); | ||
51 | } | ||
52 | printf("\n"); | ||
53 | |||
54 | printf("EAPOL: Key Info: RSC: "); | ||
55 | for (size_t i = 0; i < sizeof(data.key_info.rsc); ++i) { | ||
56 | printf("%02x ", data.key_info.rsc[i]); | ||
57 | } | ||
58 | printf("\n"); | ||
59 | |||
60 | printf("EAPOL: Key Info: ID: "); | ||
61 | for (size_t i = 0; i < sizeof(data.key_info.id); ++i) { | ||
62 | printf("%02x ", data.key_info.id[i]); | ||
63 | } | ||
64 | printf("\n"); | ||
65 | |||
66 | printf("EAPOL: Key Info: MIC: "); | ||
67 | for (size_t i = 0; i < sizeof(data.key_info.mic); ++i) { | ||
68 | printf("%02x ", data.key_info.mic[i]); | ||
69 | } | ||
70 | printf("\n"); | ||
71 | |||
72 | printf("EAPOL: Key Info: Key Data Length: %d\n", data.key_info.key_data_length); | ||
73 | if (data.key_info.key_data_length) { | ||
74 | printf("EAPOL: Key Info: Key Data: "); | ||
75 | for (size_t i = 0; i < data.key_info.key_data_length; ++i) { | ||
76 | printf("%02x ", data.key_info.key_data[i]); | ||
77 | } | ||
78 | printf("\n"); | ||
79 | } | ||
80 | |||
81 | // Cleanup the WPA Data | ||
82 | libwifi_free_wpa_data(&data); | ||
83 | |||
84 | printf("\n"); | ||
85 | } | ||
86 | } | ||
87 | |||
88 | // Clean up the libwifi frame | ||
89 | libwifi_free_wifi_frame(&frame); | ||
90 | } | ||
91 | |||
92 | void helpexit() { | ||
93 | fprintf(stderr, "[!] Usage: ./parse_eapol --file <file.pcap>\n"); | ||
94 | exit(EXIT_FAILURE); | ||
95 | } | ||
96 | |||
97 | int main(int argc, char **argv) { | ||
98 | struct bpf_program *filter = NULL; | ||
99 | pcap_t *handle = NULL; | ||
100 | pcap_dumper_t *dumper = NULL; | ||
101 | char errbuf[PCAP_ERRBUF_SIZE]; | ||
102 | |||
103 | if (argc < 2) { | ||
104 | helpexit(); | ||
105 | } | ||
106 | if (strcmp(argv[1], "--file") == 0) { | ||
107 | if ((handle = pcap_open_offline(argv[2], errbuf)) == NULL) { | ||
108 | fprintf(stderr, "[!] Error opening file %s (%s)\n", argv[2], errbuf); | ||
109 | exit(EXIT_FAILURE); | ||
110 | } | ||
111 | } else { | ||
112 | helpexit(); | ||
113 | } | ||
114 | |||
115 | int linktype = pcap_datalink(handle); | ||
116 | if (linktype == DLT_IEEE802_11_RADIO) { | ||
117 | has_radiotap = 1; | ||
118 | } | ||
119 | if (linktype != DLT_IEEE802_11 && linktype != DLT_IEEE802_11_RADIO) { | ||
120 | fprintf(stderr, "[!] 802.11 and radiotap headers not provided (%d)\n", pcap_datalink(handle)); | ||
121 | pcap_close(handle); | ||
122 | exit(EXIT_FAILURE); | ||
123 | } | ||
124 | |||
125 | if ((filter = malloc(sizeof(struct bpf_program))) == NULL) { | ||
126 | fprintf(stderr, "[!] There was an error allocating memory for the filter.\n"); | ||
127 | pcap_close(handle); | ||
128 | exit(EXIT_FAILURE); | ||
129 | } | ||
130 | |||
131 | printf("[+] Setup Complete\n"); | ||
132 | |||
133 | dumper = pcap_dump_open(handle, "/tmp/parse_eapol.pcap"); | ||
134 | pcap_loop(handle, -1 /*INFINITY*/, &handle_pkt, (unsigned char *) dumper); | ||
135 | |||
136 | pcap_dump_close(dumper); | ||
137 | pcap_close(handle); | ||
138 | |||
139 | return 0; | ||
140 | } | ||