From 37bc38a1749f61f3e54dbebca7b33df844b6de82 Mon Sep 17 00:00:00 2001 From: Andras Gemes Date: Fri, 20 Jan 2023 14:53:59 +0100 Subject: [PATCH 2/9] airodump-ng: add PCRE2 support --- src/airodump-ng/airodump-ng.c | 75 +++++++++++++++++++++++++++++++---- 1 file changed, 67 insertions(+), 8 deletions(-) --- a/src/airodump-ng/airodump-ng.c +++ b/src/airodump-ng/airodump-ng.c @@ -68,7 +68,10 @@ #include -#ifdef HAVE_PCRE +#ifdef HAVE_PCRE2 +#define PCRE2_CODE_UNIT_WIDTH 8 +#include +#elif defined HAVE_PCRE #include #endif @@ -150,7 +153,10 @@ static struct local_options unsigned char prev_bssid[6]; char ** f_essid; int f_essid_count; -#ifdef HAVE_PCRE +#ifdef HAVE_PCRE2 + pcre2_code * f_essid_regex; + pcre2_match_data * f_essid_match_data; +#elif defined HAVE_PCRE pcre * f_essid_regex; #endif char * dump_prefix; @@ -784,7 +790,7 @@ static const char usage[] = " --netmask : Filter APs by mask\n" " --bssid : Filter APs by BSSID\n" " --essid : Filter APs by ESSID\n" -#ifdef HAVE_PCRE +#if defined HAVE_PCRE2 || defined HAVE_PCRE " --essid-regex : Filter APs by ESSID using a regular\n" " expression\n" #endif @@ -857,7 +863,22 @@ int is_filtered_essid(const uint8_t * es ret = 1; } -#ifdef HAVE_PCRE +#ifdef HAVE_PCRE2 + if (lopt.f_essid_regex) + { + lopt.f_essid_match_data + = pcre2_match_data_create_from_pattern(lopt.f_essid_regex, NULL); + + return pcre2_match(lopt.f_essid_regex, + (PCRE2_SPTR) essid, + (int) strnlen((char *) essid, ESSID_LENGTH), + 0, + 0, + lopt.f_essid_match_data, + 0) + < 0; + } +#elif defined HAVE_PCRE if (lopt.f_essid_regex) { return pcre_exec(lopt.f_essid_regex, @@ -5782,7 +5803,10 @@ int main(int argc, char * argv[]) int wi_read_failed = 0; int n = 0; int output_format_first_time = 1; -#ifdef HAVE_PCRE +#ifdef HAVE_PCRE2 + int pcreerror; + PCRE2_SIZE pcreerroffset; +#elif defined HAVE_PCRE const char * pcreerror; int pcreerroffset; #endif @@ -5938,7 +5962,9 @@ int main(int argc, char * argv[]) #ifdef CONFIG_LIBNL lopt.htval = CHANNEL_NO_HT; #endif -#ifdef HAVE_PCRE +#ifdef HAVE_PCRE2 + lopt.f_essid_regex = NULL; +#elif defined HAVE_PCRE lopt.f_essid_regex = NULL; #endif @@ -6359,7 +6385,34 @@ int main(int argc, char * argv[]) case 'R': -#ifdef HAVE_PCRE +#ifdef HAVE_PCRE2 + if (lopt.f_essid_regex != NULL) + { + printf("Error: ESSID regular expression already given. " + "Aborting\n"); + exit(EXIT_FAILURE); + } + + lopt.f_essid_regex = pcre2_compile((PCRE2_SPTR) optarg, + PCRE2_ZERO_TERMINATED, + 0, + &pcreerror, + &pcreerroffset, + NULL); + + if (lopt.f_essid_regex == NULL) + { + PCRE2_UCHAR pcreerrbuffer[256]; + pcre2_get_error_message( + pcreerror, pcreerrbuffer, sizeof(pcreerrbuffer)); + + printf("Error: regular expression compilation failed at " + "offset %lu: %s; aborting\n", + pcreerroffset, + pcreerrbuffer); + exit(EXIT_FAILURE); + } +#elif defined HAVE_PCRE if (lopt.f_essid_regex != NULL) { printf("Error: ESSID regular expression already given. " @@ -7297,7 +7350,13 @@ int main(int argc, char * argv[]) if (lopt.keyout) free(lopt.keyout); -#ifdef HAVE_PCRE +#ifdef HAVE_PCRE2 + if (lopt.f_essid_regex) + { + pcre2_match_data_free(lopt.f_essid_match_data); + pcre2_code_free(lopt.f_essid_regex); + } +#elif defined HAVE_PCRE if (lopt.f_essid_regex) pcre_free(lopt.f_essid_regex); #endif