From 2fe497ab2f8de6acb1dec003449b19a068e2da02 Mon Sep 17 00:00:00 2001 From: gerald Date: Mon, 2 Oct 2006 23:44:10 +0000 Subject: [PATCH] Fix WEP key bug in the AirPcap code that could cause a crash. Enable AirPcap by default. Add initial support for the "Any" device in AirPcap (more to come). git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@19401 f5534014-38df-0310-8fa8-9805f1628bb7 --- airpcap.h | 6 +++++ airpcap_loader.c | 53 ++++++++++++++++++++++++++---------- airpcap_loader.h | 8 ++++++ config.nmake | 2 +- configure.in | 2 +- gtk/airpcap_dlg.c | 59 ++++++++++++++++++++++++++--------------- gtk/airpcap_gui_utils.c | 44 +++++++++++++++++++++++++++--- gtk/airpcap_gui_utils.h | 12 +++++++++ gtk/capture_dlg.c | 4 +-- gtk/keys.h | 4 ++- 10 files changed, 150 insertions(+), 44 deletions(-) diff --git a/airpcap.h b/airpcap.h index d44206cfd6..f7e6cff331 100644 --- a/airpcap.h +++ b/airpcap.h @@ -67,6 +67,12 @@ extern "C" { */ #define AIRPCAP_DEVICE_NUMBER_EXTRACT_STRING "\\\\.\\airpcap%u" +/*! + \brief This string is the scanf modifier to extract the adapter "Any" string from an adapter name. + It can be used to parse the name field in an AirpcapDeviceDescription structure with scanf. +*/ +#define AIRPCAP_DEVICE_ANY_EXTRACT_STRING "\\\\.\\airpcap_any" + /*! \brief Entry in the list returned by \ref AirpcapGetDeviceList(); */ diff --git a/airpcap_loader.c b/airpcap_loader.c index a04f9734c2..92eb5f9cc4 100644 --- a/airpcap_loader.c +++ b/airpcap_loader.c @@ -261,7 +261,7 @@ airpcap_if_info_t * airpcap_if_info_new(char *name, char *description) { PAirpcapHandle ad; -char* ebuf = NULL; +gchar ebuf[AIRPCAP_ERRBUF_SIZE]; airpcap_if_info_t *if_info; @@ -493,27 +493,39 @@ return NULL; } /* - * Returns the ASCII string of a key given the key bites + * Returns the ASCII string of a key given the key bytes */ gchar* airpcap_get_key_string(AirpcapKey key) { unsigned int j = 0; -gchar *s,*s1; +unsigned int l = 0; +gchar *dst,*src; -s = NULL; -s1 = NULL; +src = NULL; if(key.KeyType == AIRPCAP_KEYTYPE_WEP) { - s = g_strdup_printf(""); - for(j = 0; j < key.KeyLen != 0; j++) - { - s1 = g_strdup_printf("%.2x", key.KeyData[j]); - g_strlcat(s,s1,WEP_KEY_MAX_SIZE); - } + if(key.KeyLen != 0) + { + /* Allocate the string used to store the ASCII representation of the WEP key */ + dst = (gchar*)g_malloc(sizeof(gchar)*WEP_KEY_MAX_CHAR_SIZE + 1); + /* Make sure that the first char is '\0' in order to make g_strlcat() work */ + dst[0]='\0'; + + for(j = 0; j < key.KeyLen; j++) + { + src = g_strdup_printf("%.2x\0", key.KeyData[j]); + /* + * XXX - use g_strconcat() instead ??? + */ + l = g_strlcat(dst,src,WEP_KEY_MAX_CHAR_SIZE+1); + } + g_free(src); + } } -return s; + +return dst; } /* @@ -558,8 +570,21 @@ airpcap_get_if_string_number(airpcap_if_info_t* if_info) int a; a = sscanf(if_info->name,AIRPCAP_DEVICE_NUMBER_EXTRACT_STRING,&n); - - number = g_strdup_printf("%.2u\0",n); + + /* If sscanf() returned 1, it means that has read a number, so interface is not "Any" + * Otherwise, check if it is the "Any" adapter... + */ + if(a == 0) + { + if(g_strcasecmp(if_info->name,AIRPCAP_DEVICE_ANY_EXTRACT_STRING)!=0) + number = g_strdup_printf("??"); + else + number = g_strdup_printf(AIRPCAP_CHANNEL_ANY_NAME); + } + else + { + number = g_strdup_printf("%.2u\0",n); + } return number; } diff --git a/airpcap_loader.h b/airpcap_loader.h index cb6c9eb495..831e5519b1 100644 --- a/airpcap_loader.h +++ b/airpcap_loader.h @@ -34,6 +34,14 @@ #define MAX_ENCRYPTION_KEYS 64 +#define AIRPCAP_CHANNEL_ANY_NAME "ANY" + +/* + * WEP_KEY_MAX_SIZE is in bytes. but each byte is rapresented in strings with an ascii char + * 4 bit are needed to store an exadecimal number, 8 bit to store a char... + */ +#define WEP_KEY_MAX_CHAR_SIZE (WEP_KEY_MAX_SIZE*2) + typedef PCHAR (*AirpcapGetLastErrorHandler)(PAirpcapHandle AdapterHandle); typedef BOOL (*AirpcapGetDeviceListHandler)(PAirpcapDeviceDescription *PPAllDevs, PCHAR Ebuf); typedef VOID (*AirpcapFreeDeviceListHandler)(PAirpcapDeviceDescription PAllDevs); diff --git a/config.nmake b/config.nmake index cd8019c4df..fb79f74f09 100644 --- a/config.nmake +++ b/config.nmake @@ -238,7 +238,7 @@ GETTEXT_DIR=$(WIRESHARK_LIBS)\gettext-runtime-0.13.1 # If you don't have the AirPcap developer's pack, comment this line out, # so that AIRPCAP_DIR isn't defined. # -# AIRPCAP_DIR=$(WIRESHARK_LIBS)\AirPcap +AIRPCAP_DIR=$(WIRESHARK_LIBS)\AirPcap diff --git a/configure.in b/configure.in index ba5825eacd..1ae7226348 100644 --- a/configure.in +++ b/configure.in @@ -8,7 +8,7 @@ dnl Check for CPU / vendor / OS AC_CANONICAL_HOST AC_CANONICAL_TARGET -AM_INIT_AUTOMAKE(wireshark, 0.99.4) +AM_INIT_AUTOMAKE(wireshark, 0.99.4-Freightliner-19394) AM_DISABLE_STATIC diff --git a/gtk/airpcap_dlg.c b/gtk/airpcap_dlg.c index aed0fc7389..41737d47a9 100644 --- a/gtk/airpcap_dlg.c +++ b/gtk/airpcap_dlg.c @@ -32,11 +32,14 @@ #include #include +#include #include #include +#include + #include "gtk/main.h" #include "dlg_utils.h" #include "gui_utils.h" @@ -264,7 +267,6 @@ if(keys_in_list > 0) /* * Allocate the collection - * We use malloc so it's easier to reuse the code in C programs */ KeysCollection = (PAirpcapKeysCollection)malloc(KeysCollectionSize); if(!KeysCollection) @@ -304,7 +306,7 @@ if(keys_in_list > 0) } /* - * XXX - Free the old adapter key collection! + * Free the old adapter key collection! */ if(airpcap_if_selected->keysCollection != NULL) g_free(airpcap_if_selected->keysCollection); @@ -315,6 +317,8 @@ if(keys_in_list > 0) airpcap_if_selected->keysCollection = KeysCollection; airpcap_if_selected->keysCollectionSize = KeysCollectionSize; } + +return; } @@ -528,7 +532,7 @@ void update_blink(gpointer data _U_) { airpcap_if_info_t* sel; PAirpcapHandle ad; -char* ebuf = NULL; +gchar ebuf[AIRPCAP_ERRBUF_SIZE]; sel = (airpcap_if_info_t*)data; @@ -556,7 +560,7 @@ void blink_cb( GtkWidget *blink_bt _U_, gpointer if_data ) { PAirpcapHandle ad = NULL; -char* ebuf = NULL; +gchar ebuf[AIRPCAP_ERRBUF_SIZE]; if(airpcap_if_selected != NULL) if(!(airpcap_if_selected->blinking)) @@ -596,7 +600,7 @@ static void airpcap_if_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_) { PAirpcapHandle ad = NULL; - char* ebuf = NULL; + gchar ebuf[AIRPCAP_ERRBUF_SIZE]; /* Retrieve object data */ GtkWidget *main_w; @@ -706,8 +710,10 @@ airpcap_if_destroy_cb(GtkWidget *w _U_, gpointer user_data _U_) if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0) { gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected))); - airpcap_channel_combo_set_by_number(toolbar_channel_cm,airpcap_if_selected->channel); - airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn); + + airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected); + + airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn); gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar); if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON) @@ -791,7 +797,7 @@ airpcap_advanced_apply_cb(GtkWidget *button, gpointer data _U_) if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0) { gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected))); - airpcap_channel_combo_set_by_number(toolbar_channel_cm,airpcap_if_selected->channel); + airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected); airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn); gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar); @@ -844,7 +850,7 @@ airpcap_advanced_ok_cb(GtkWidget *w, gpointer data _U_) if( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0) { gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected))); - airpcap_channel_combo_set_by_number(toolbar_channel_cm,airpcap_if_selected->channel); + airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected); airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn); gtk_signal_handler_block_by_func (GTK_OBJECT(toolbar_decryption_ck),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), toolbar); @@ -911,9 +917,15 @@ new_key = g_string_new(text_entered); g_strchug(new_key->str); g_strchomp(new_key->str); +if((new_key->len) > WEP_KEY_MAX_CHAR_SIZE) + { + simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is 2-%d characters (8-%d bits).",WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MAX_SIZE*8); + return; + } + if((new_key->len % 2) != 0) { - simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"%s","1) A Wep key must is an arbitrary length hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.\nThe number of characters must be even."); + simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nThe number of characters must be even."); return; } @@ -921,7 +933,7 @@ for(i = 0; i < new_key->len; i++) { if(!g_ascii_isxdigit(new_key->str[i])) { - simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"%s","2) A Wep key must is an arbitrary length hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.\nThe number of characters must be even."); + simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF."); return; } } @@ -935,6 +947,7 @@ g_string_free(new_key,TRUE); g_free(text_entered); window_destroy(GTK_WIDGET(data)); + return; } @@ -972,9 +985,15 @@ new_key = g_string_new(text_entered); g_strchug(new_key->str); g_strchomp(new_key->str); +if((new_key->len) > WEP_KEY_MAX_CHAR_SIZE) + { + simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"WEP key size out of range!\nValid key size range is 2-%d characters (8-%d bits).",WEP_KEY_MAX_CHAR_SIZE,WEP_KEY_MAX_SIZE*8); + return; + } + if((new_key->len % 2) != 0) { - simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"%s","1) A Wep key must is an arbitrary length hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.\nThe number of characters must be even."); + simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nThe number of characters must be even."); return; } @@ -982,7 +1001,7 @@ for(i = 0; i < new_key->len; i++) { if(!g_ascii_isxdigit(new_key->str[i])) { - simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"%s","2) A Wep key must is an arbitrary length hexadecimal number.\nThe valid characters are: 0123456789ABCDEF.\nThe number of characters must be even."); + simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Wrong WEP key!\nA WEP key must be an hexadecimal number.\nThe valid characters are: 0123456789ABCDEF."); return; } } @@ -1403,7 +1422,7 @@ airpcap_if_selected->saved = FALSE; /* Turns the decryption on or off */ static void -encryption_check_cb(GtkWidget *w, gpointer data) +wep_encryption_check_cb(GtkWidget *w, gpointer data) { if( !block_advanced_signals && (airpcap_if_selected != NULL)) { @@ -1420,14 +1439,13 @@ if( !block_advanced_signals && (airpcap_if_selected != NULL)) } } - /* Called to create the airpcap settings' window */ void display_airpcap_advanced_cb(GtkWidget *w, gpointer data) { /* Main window */ GtkWidget *airpcap_advanced_w; - + /* Blink button */ GtkWidget *blink_bt, *channel_combo; @@ -1497,7 +1515,7 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) /* other stuff */ GList *channel_list,*capture_list; GList *linktype_list = NULL; - gchar *channel_s,*capture_s; + gchar *capture_s; /* user data - RETRIEVE pointers of toolbar widgets */ @@ -1659,8 +1677,7 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) /* Select the first entry */ if(airpcap_if_selected != NULL) { - channel_s = g_strdup_printf("%d",airpcap_if_selected->channel); - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_combo)->entry), channel_s); + airpcap_update_channel_combo(GTK_WIDGET(channel_combo), airpcap_if_selected); } channel_te = GTK_COMBO(channel_combo)->entry; @@ -1755,7 +1772,7 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) /* encryption enabled box */ encryption_check = gtk_check_button_new_with_label("Enable WEP Decryption"); - OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_DECRYPTION_KEY,encryption_check); + OBJECT_SET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_WEP_DECRYPTION_KEY,encryption_check); /* Fcs Presence check box */ if(airpcap_if_selected != NULL) @@ -1766,7 +1783,7 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(encryption_check),FALSE); } - SIGNAL_CONNECT(encryption_check,"toggled",encryption_check_cb,NULL); + SIGNAL_CONNECT(encryption_check,"toggled",wep_encryption_check_cb,NULL); gtk_box_pack_start (GTK_BOX (encryption_box), encryption_check, FALSE, FALSE, 0); gtk_widget_show(encryption_check); diff --git a/gtk/airpcap_gui_utils.c b/gtk/airpcap_gui_utils.c index d6bc5bcba3..3c02320ca2 100755 --- a/gtk/airpcap_gui_utils.c +++ b/gtk/airpcap_gui_utils.c @@ -82,7 +82,7 @@ if(if_info != NULL) gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); gtk_widget_set_sensitive(airpcap_toolbar_decryption,FALSE); airpcap_validation_type_combo_set_by_type(GTK_WIDGET(airpcap_toolbar_crc_filter_combo),if_info->CrcValidationOn); - airpcap_channel_combo_set_by_number(GTK_WIDGET(airpcap_toolbar_channel),if_info->channel); + airpcap_update_channel_combo(GTK_WIDGET(airpcap_toolbar_channel),if_info); /*decription check box*/ gtk_signal_handler_block_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); @@ -145,7 +145,7 @@ if(if_info != NULL) gtk_widget_set_sensitive(airpcap_toolbar_button,TRUE); gtk_widget_set_sensitive(airpcap_toolbar_decryption,TRUE); airpcap_validation_type_combo_set_by_type(GTK_WIDGET(airpcap_toolbar_crc_filter_combo),if_info->CrcValidationOn); - airpcap_channel_combo_set_by_number(GTK_WIDGET(airpcap_toolbar_channel),if_info->channel); + airpcap_update_channel_combo(GTK_WIDGET(airpcap_toolbar_channel),if_info); /*decription check box*/ gtk_signal_handler_block_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); @@ -205,14 +205,20 @@ airpcap_fill_key_list(GtkWidget *keylist,airpcap_if_info_t* if_info) { GtkWidget *nl_item,*nl_lb; gchar* s; -unsigned int i; +unsigned int i,n; + +n = 0; if( (if_info != NULL) && (if_info->keysCollection != NULL)) { + n = if_info->keysCollection->nKeys; for(i = 0; i < if_info->keysCollection->nKeys; i++) { - s = airpcap_get_key_string(if_info->keysCollection->Keys[i]); + s = airpcap_get_key_string(if_info->keysCollection->Keys[i]); /* g_strdup_printf("1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef\0"); */ + nl_lb = gtk_label_new(s); + g_free(s); + nl_item = gtk_list_item_new(); gtk_misc_set_alignment (GTK_MISC (nl_lb), 0.0, 0.5); gtk_container_add(GTK_CONTAINER(nl_item), nl_lb); @@ -398,4 +404,34 @@ airpcap_channel_combo_set_by_number(GtkWidget* w,UINT channel) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),airpcap_get_channel_name(channel)); } +/* + * Returns '1' if this is the "Any" adapter, '0' otherwise + */ +int +airpcap_if_is_any(airpcap_if_info_t* if_info) +{ +if(g_strcasecmp(if_info->name,AIRPCAP_DEVICE_ANY_EXTRACT_STRING)==0) + return 1; +else + return 0; +} + +/* + * Update channel combo box. If the airpcap interface is "Any", the combo box will be disabled. + */ +void +airpcap_update_channel_combo(GtkWidget* w, airpcap_if_info_t* if_info) +{ +if(airpcap_if_is_any(if_info)) + { + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry)," "); + gtk_widget_set_sensitive(GTK_WIDGET(w),FALSE); + } +else + { + airpcap_channel_combo_set_by_number(w,if_info->channel); + gtk_widget_set_sensitive(GTK_WIDGET(w),TRUE); + } +} + #endif /* HAVE_AIRPCAP */ diff --git a/gtk/airpcap_gui_utils.h b/gtk/airpcap_gui_utils.h index f4c74fe952..0c3048f231 100755 --- a/gtk/airpcap_gui_utils.h +++ b/gtk/airpcap_gui_utils.h @@ -127,4 +127,16 @@ airpcap_get_channel_name(UINT n); void airpcap_channel_combo_set_by_number(GtkWidget* w,UINT channel); +/* + * Returns '1' if this is the "Any" adapter, '0' otherwise + */ +int +airpcap_if_is_any(airpcap_if_info_t* if_info); + +/* + * Update channel combo box. If the airpcap interface is "Any", the combo box will be disabled. + */ +void +airpcap_update_channel_combo(GtkWidget* w, airpcap_if_info_t* if_info); + #endif diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c index fa2d96da0f..12e5029821 100644 --- a/gtk/capture_dlg.c +++ b/gtk/capture_dlg.c @@ -850,11 +850,11 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) advanced_hb = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(capture_vb), advanced_hb, FALSE, FALSE, 0); - advanced_bt = gtk_button_new(); + advanced_bt = gtk_button_new_with_label("Wireless Settings"); /* set the text */ #if GTK_MAJOR_VERSION >= 2 - /* XXX - find a way to set the GtkButton label in GTK 1.x */ + /* XXX - find a way to set the GtkButton label in GTK 2.x */ gtk_button_set_label(GTK_BUTTON(advanced_bt), "Wireless Settings"); #else /* Set the GtkButton label in GTK 1.x */ diff --git a/gtk/keys.h b/gtk/keys.h index 9df70b4214..840b677b21 100644 --- a/gtk/keys.h +++ b/gtk/keys.h @@ -72,7 +72,9 @@ #define AIRPCAP_ADVANCED_EDIT_KEY_TEXT_KEY "airpcap_advanced_edit_key_text_key" #define AIRPCAP_ADVANCED_EDIT_KEY_OK_KEY "airpcap_advanced_edit_key_ok_key" #define AIRPCAP_ADVANCED_EDIT_KEY_LABEL_KEY "airpcap_advanced_edit_key_label_key" -#define AIRPCAP_ADVANCED_DECRYPTION_KEY "airpcap_advanced_decryption_key" +#define AIRPCAP_ADVANCED_WEP_DECRYPTION_KEY "airpcap_advanced_wep_decryption_key" +#define AIRPCAP_ADVANCED_WPA_DECRYPTION_KEY "airpcap_advanced_wpa_decryption_key" +#define AIRPCAP_ADVANCED_NOTEBOOK_KEY "airpcap_advanced_notebook_key" #define AIRPCAP_OPTIONS_ADVANCED_KEY "airpcap_options_advanced_key" -- 2.34.1