From 0348aff9b8b1d83a5d9c28ac3a656ae2fc38fb90 Mon Sep 17 00:00:00 2001 From: Willy-JL <49810075+Willy-JL@users.noreply.github.com> Date: Mon, 12 Jun 2023 01:46:13 +0100 Subject: [PATCH] BadKB usb go brrr --- applications/main/bad_kb/bad_kb_app.c | 25 ++++++ .../main/bad_kb/helpers/ducky_script.h | 4 +- .../main/bad_kb/scenes/bad_kb_scene_config.c | 89 ++++++++++++++++--- .../main/bad_kb/scenes/bad_kb_scene_config.h | 6 +- ...fig_mac.c => bad_kb_scene_config_bt_mac.c} | 13 ++- ...g_name.c => bad_kb_scene_config_bt_name.c} | 11 ++- .../scenes/bad_kb_scene_config_usb_name.c | 56 ++++++++++++ .../scenes/bad_kb_scene_config_usb_vidpid.c | 50 +++++++++++ 8 files changed, 224 insertions(+), 30 deletions(-) rename applications/main/bad_kb/scenes/{bad_kb_scene_config_mac.c => bad_kb_scene_config_bt_mac.c} (78%) rename applications/main/bad_kb/scenes/{bad_kb_scene_config_name.c => bad_kb_scene_config_bt_name.c} (77%) create mode 100644 applications/main/bad_kb/scenes/bad_kb_scene_config_usb_name.c create mode 100644 applications/main/bad_kb/scenes/bad_kb_scene_config_usb_vidpid.c diff --git a/applications/main/bad_kb/bad_kb_app.c b/applications/main/bad_kb/bad_kb_app.c index 8d31f4da4..5459fef10 100644 --- a/applications/main/bad_kb/bad_kb_app.c +++ b/applications/main/bad_kb/bad_kb_app.c @@ -33,6 +33,10 @@ static void bad_kb_load_settings(BadKbApp* app) { BadKbConfig* cfg = &app->config; strcpy(cfg->bt_name, ""); memcpy(cfg->bt_mac, BAD_KB_EMPTY_MAC, BAD_KB_MAC_LEN); + strcpy(cfg->usb_cfg.manuf, ""); + strcpy(cfg->usb_cfg.product, ""); + cfg->usb_cfg.vid = 0; + cfg->usb_cfg.pid = 0; Storage* storage = furi_record_open(RECORD_STORAGE); FlipperFormat* file = flipper_format_file_alloc(storage); @@ -49,6 +53,23 @@ static void bad_kb_load_settings(BadKbApp* app) { if(!flipper_format_read_hex(file, "Bt_Mac", (uint8_t*)&cfg->bt_mac, BAD_KB_MAC_LEN)) { memcpy(cfg->bt_mac, BAD_KB_EMPTY_MAC, BAD_KB_MAC_LEN); } + if(flipper_format_read_string(file, "Usb_Manuf", tmp_str) && !furi_string_empty(tmp_str)) { + strcpy(cfg->usb_cfg.manuf, furi_string_get_cstr(tmp_str)); + } else { + strcpy(cfg->usb_cfg.manuf, ""); + } + if(flipper_format_read_string(file, "Usb_Product", tmp_str) && + !furi_string_empty(tmp_str)) { + strcpy(cfg->usb_cfg.product, furi_string_get_cstr(tmp_str)); + } else { + strcpy(cfg->usb_cfg.product, ""); + } + if(!flipper_format_read_uint32(file, "Usb_Vid", &cfg->usb_cfg.vid, 1)) { + cfg->usb_cfg.vid = 0; + } + if(!flipper_format_read_uint32(file, "Usb_Pid", &cfg->usb_cfg.pid, 1)) { + cfg->usb_cfg.pid = 0; + } furi_string_free(tmp_str); flipper_format_file_close(file); } @@ -78,6 +99,10 @@ static void bad_kb_save_settings(BadKbApp* app) { flipper_format_write_string(file, "Keyboard_Layout", app->keyboard_layout); flipper_format_write_string_cstr(file, "Bt_Name", cfg->bt_name); flipper_format_write_hex(file, "Bt_Mac", (uint8_t*)&cfg->bt_mac, BAD_KB_MAC_LEN); + flipper_format_write_string_cstr(file, "Usb_Manuf", cfg->usb_cfg.manuf); + flipper_format_write_string_cstr(file, "Usb_Product", cfg->usb_cfg.product); + flipper_format_write_uint32(file, "Usb_Vid", &cfg->usb_cfg.vid, 1); + flipper_format_write_uint32(file, "Usb_Pid", &cfg->usb_cfg.pid, 1); flipper_format_file_close(file); } flipper_format_free(file); diff --git a/applications/main/bad_kb/helpers/ducky_script.h b/applications/main/bad_kb/helpers/ducky_script.h index b027c3f56..23f225ab7 100644 --- a/applications/main/bad_kb/helpers/ducky_script.h +++ b/applications/main/bad_kb/helpers/ducky_script.h @@ -137,6 +137,8 @@ struct BadKbApp { VariableItemList* var_item_list; TextInput* text_input; ByteInput* byte_input; + char usb_name_buf[32]; + uint16_t usb_vidpid_buf[2]; char bt_name_buf[BAD_KB_NAME_LEN]; uint8_t bt_mac_buf[BAD_KB_MAC_LEN]; @@ -149,7 +151,7 @@ struct BadKbApp { Bt* bt; bool is_bt; bool bt_remember; - BadKbConfig config; // User options (TODO: allow users to change usb cfg) + BadKbConfig config; // User options BadKbConfig id_config; // ID and BT_ID values BadKbConfig prev_config; // State to restore at exit diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config.c b/applications/main/bad_kb/scenes/bad_kb_scene_config.c index 7d8d4dca3..f17a52b97 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config.c @@ -7,10 +7,20 @@ enum VarItemListIndex { VarItemListIndexKeyboardLayout, VarItemListIndexConnection, - VarItemListIndexBtRemember, +}; + +enum VarItemListIndexBt { + VarItemListIndexBtRemember = VarItemListIndexConnection + 1, VarItemListIndexBtDeviceName, VarItemListIndexBtMacAddress, - VarItemListIndexRandomizeBtMac, + VarItemListIndexBtRandomizeMac, +}; + +enum VarItemListIndexUsb { + VarItemListIndexUsbManufacturerName = VarItemListIndexConnection + 1, + VarItemListIndexUsbProductName, + VarItemListIndexUsbVidPid, + VarItemListIndexUsbRandomizeVidPid, }; void bad_kb_scene_config_connection_callback(VariableItem* item) { @@ -73,6 +83,26 @@ void bad_kb_scene_config_on_enter(void* context) { } else if(bad_kb->set_bt_id) { variable_item_set_locked(item, true, "Script has\nBT_ID cmd!\nLocked to\nset MAC!"); } + } else { + item = variable_item_list_add(var_item_list, "USB Manufacturer Name", 0, NULL, bad_kb); + if(bad_kb->set_usb_id) { + variable_item_set_locked(item, true, "Script has\nID cmd!\nLocked to\nset Mname!"); + } + + item = variable_item_list_add(var_item_list, "USB Product Name", 0, NULL, bad_kb); + if(bad_kb->set_usb_id) { + variable_item_set_locked(item, true, "Script has\nID cmd!\nLocked to\nset Pname!"); + } + + item = variable_item_list_add(var_item_list, "USB VID and PID", 0, NULL, bad_kb); + if(bad_kb->set_usb_id) { + variable_item_set_locked(item, true, "Script has\nID cmd!\nLocked to\nset IDs!"); + } + + item = variable_item_list_add(var_item_list, "Randomize USB VID:PID", 0, NULL, bad_kb); + if(bad_kb->set_usb_id) { + variable_item_set_locked(item, true, "Script has\nID cmd!\nLocked to\nset IDs!"); + } } variable_item_list_set_enter_callback( @@ -95,23 +125,56 @@ bool bad_kb_scene_config_on_event(void* context, SceneManagerEvent event) { case VarItemListIndexKeyboardLayout: scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigLayout); break; - case VarItemListIndexBtDeviceName: - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigName); - break; - case VarItemListIndexBtMacAddress: - scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigMac); - break; - case VarItemListIndexRandomizeBtMac: - furi_hal_random_fill_buf(bad_kb->config.bt_mac, BAD_KB_MAC_LEN); - /* fall through */ - case VarItemListIndexBtRemember: - /* fall through */ case VarItemListIndexConnection: bad_kb_config_refresh(bad_kb); break; default: break; } + if(bad_kb->is_bt) { + switch(event.event) { + case VarItemListIndexBtRemember: + bad_kb_config_refresh(bad_kb); + break; + case VarItemListIndexBtDeviceName: + scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBtName); + break; + case VarItemListIndexBtMacAddress: + scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigBtMac); + break; + case VarItemListIndexBtRandomizeMac: + furi_hal_random_fill_buf(bad_kb->config.bt_mac, BAD_KB_MAC_LEN); + bad_kb_config_refresh(bad_kb); + break; + default: + break; + } + } else { + switch(event.event) { + case VarItemListIndexUsbManufacturerName: + scene_manager_set_scene_state( + bad_kb->scene_manager, BadKbSceneConfigUsbName, true); + scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbName); + break; + case VarItemListIndexUsbProductName: + scene_manager_set_scene_state( + bad_kb->scene_manager, BadKbSceneConfigUsbName, false); + scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbName); + break; + case VarItemListIndexUsbVidPid: + scene_manager_next_scene(bad_kb->scene_manager, BadKbSceneConfigUsbVidPid); + break; + case VarItemListIndexUsbRandomizeVidPid: + furi_hal_random_fill_buf( + (void*)bad_kb->usb_vidpid_buf, sizeof(bad_kb->usb_vidpid_buf)); + bad_kb->config.usb_cfg.vid = bad_kb->usb_vidpid_buf[0]; + bad_kb->config.usb_cfg.pid = bad_kb->usb_vidpid_buf[1]; + bad_kb_config_refresh(bad_kb); + break; + default: + break; + } + } } return consumed; diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config.h b/applications/main/bad_kb/scenes/bad_kb_scene_config.h index ac445c673..034a898a4 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config.h +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config.h @@ -3,5 +3,7 @@ ADD_SCENE(bad_kb, work, Work) ADD_SCENE(bad_kb, error, Error) ADD_SCENE(bad_kb, config, Config) ADD_SCENE(bad_kb, config_layout, ConfigLayout) -ADD_SCENE(bad_kb, config_name, ConfigName) -ADD_SCENE(bad_kb, config_mac, ConfigMac) +ADD_SCENE(bad_kb, config_bt_name, ConfigBtName) +ADD_SCENE(bad_kb, config_bt_mac, ConfigBtMac) +ADD_SCENE(bad_kb, config_usb_name, ConfigUsbName) +ADD_SCENE(bad_kb, config_usb_vidpid, ConfigUsbVidPid) diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt_mac.c similarity index 78% rename from applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c rename to applications/main/bad_kb/scenes/bad_kb_scene_config_bt_mac.c index 7d7c5e57f..8005fdff3 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_mac.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt_mac.c @@ -1,24 +1,21 @@ #include "../bad_kb_app.h" -#define TAG "BadKbConfigMac" - -void bad_kb_scene_config_mac_byte_input_callback(void* context) { +void bad_kb_scene_config_bt_mac_byte_input_callback(void* context) { BadKbApp* bad_kb = context; view_dispatcher_send_custom_event(bad_kb->view_dispatcher, BadKbAppCustomEventByteInputDone); } -void bad_kb_scene_config_mac_on_enter(void* context) { +void bad_kb_scene_config_bt_mac_on_enter(void* context) { BadKbApp* bad_kb = context; ByteInput* byte_input = bad_kb->byte_input; memmove(bad_kb->bt_mac_buf, bad_kb->config.bt_mac, BAD_KB_MAC_LEN); - byte_input_set_header_text(byte_input, "Set BT MAC address"); byte_input_set_result_callback( byte_input, - bad_kb_scene_config_mac_byte_input_callback, + bad_kb_scene_config_bt_mac_byte_input_callback, NULL, bad_kb, bad_kb->bt_mac_buf, @@ -27,7 +24,7 @@ void bad_kb_scene_config_mac_on_enter(void* context) { view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewByteInput); } -bool bad_kb_scene_config_mac_on_event(void* context, SceneManagerEvent event) { +bool bad_kb_scene_config_bt_mac_on_event(void* context, SceneManagerEvent event) { BadKbApp* bad_kb = context; bool consumed = false; @@ -42,7 +39,7 @@ bool bad_kb_scene_config_mac_on_event(void* context, SceneManagerEvent event) { return consumed; } -void bad_kb_scene_config_mac_on_exit(void* context) { +void bad_kb_scene_config_bt_mac_on_exit(void* context) { BadKbApp* bad_kb = context; ByteInput* byte_input = bad_kb->byte_input; diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_name.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt_name.c similarity index 77% rename from applications/main/bad_kb/scenes/bad_kb_scene_config_name.c rename to applications/main/bad_kb/scenes/bad_kb_scene_config_bt_name.c index fc541490b..3ce2c99b4 100644 --- a/applications/main/bad_kb/scenes/bad_kb_scene_config_name.c +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_bt_name.c @@ -1,22 +1,21 @@ #include "../bad_kb_app.h" -static void bad_kb_scene_config_name_text_input_callback(void* context) { +static void bad_kb_scene_config_bt_name_text_input_callback(void* context) { BadKbApp* bad_kb = context; view_dispatcher_send_custom_event(bad_kb->view_dispatcher, BadKbAppCustomEventTextInputDone); } -void bad_kb_scene_config_name_on_enter(void* context) { +void bad_kb_scene_config_bt_name_on_enter(void* context) { BadKbApp* bad_kb = context; TextInput* text_input = bad_kb->text_input; strlcpy(bad_kb->bt_name_buf, bad_kb->config.bt_name, BAD_KB_NAME_LEN); - text_input_set_header_text(text_input, "Set BT device name"); text_input_set_result_callback( text_input, - bad_kb_scene_config_name_text_input_callback, + bad_kb_scene_config_bt_name_text_input_callback, bad_kb, bad_kb->bt_name_buf, BAD_KB_NAME_LEN, @@ -25,7 +24,7 @@ void bad_kb_scene_config_name_on_enter(void* context) { view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewTextInput); } -bool bad_kb_scene_config_name_on_event(void* context, SceneManagerEvent event) { +bool bad_kb_scene_config_bt_name_on_event(void* context, SceneManagerEvent event) { BadKbApp* bad_kb = context; bool consumed = false; @@ -40,7 +39,7 @@ bool bad_kb_scene_config_name_on_event(void* context, SceneManagerEvent event) { return consumed; } -void bad_kb_scene_config_name_on_exit(void* context) { +void bad_kb_scene_config_bt_name_on_exit(void* context) { BadKbApp* bad_kb = context; TextInput* text_input = bad_kb->text_input; diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb_name.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb_name.c new file mode 100644 index 000000000..250a3fde7 --- /dev/null +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb_name.c @@ -0,0 +1,56 @@ +#include "../bad_kb_app.h" + +static void bad_kb_scene_config_usb_name_text_input_callback(void* context) { + BadKbApp* bad_kb = context; + + view_dispatcher_send_custom_event(bad_kb->view_dispatcher, BadKbAppCustomEventTextInputDone); +} + +void bad_kb_scene_config_usb_name_on_enter(void* context) { + BadKbApp* bad_kb = context; + TextInput* text_input = bad_kb->text_input; + + if(scene_manager_get_scene_state(bad_kb->scene_manager, BadKbSceneConfigUsbName)) { + strlcpy(bad_kb->usb_name_buf, bad_kb->config.usb_cfg.manuf, 32); + text_input_set_header_text(text_input, "Set USB manufacturer name"); + } else { + strlcpy(bad_kb->usb_name_buf, bad_kb->config.usb_cfg.product, 32); + text_input_set_header_text(text_input, "Set USB product name"); + } + + text_input_set_result_callback( + text_input, + bad_kb_scene_config_usb_name_text_input_callback, + bad_kb, + bad_kb->usb_name_buf, + 32, + true); + + view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewTextInput); +} + +bool bad_kb_scene_config_usb_name_on_event(void* context, SceneManagerEvent event) { + BadKbApp* bad_kb = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == BadKbAppCustomEventTextInputDone) { + if(scene_manager_get_scene_state(bad_kb->scene_manager, BadKbSceneConfigUsbName)) { + strlcpy(bad_kb->config.usb_cfg.manuf, bad_kb->usb_name_buf, 32); + } else { + strlcpy(bad_kb->config.usb_cfg.product, bad_kb->usb_name_buf, 32); + } + bad_kb_config_refresh(bad_kb); + } + scene_manager_previous_scene(bad_kb->scene_manager); + } + return consumed; +} + +void bad_kb_scene_config_usb_name_on_exit(void* context) { + BadKbApp* bad_kb = context; + TextInput* text_input = bad_kb->text_input; + + text_input_reset(text_input); +} diff --git a/applications/main/bad_kb/scenes/bad_kb_scene_config_usb_vidpid.c b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb_vidpid.c new file mode 100644 index 000000000..ef1a4700f --- /dev/null +++ b/applications/main/bad_kb/scenes/bad_kb_scene_config_usb_vidpid.c @@ -0,0 +1,50 @@ +#include "../bad_kb_app.h" + +void bad_kb_scene_config_usb_vidpid_byte_input_callback(void* context) { + BadKbApp* bad_kb = context; + + view_dispatcher_send_custom_event(bad_kb->view_dispatcher, BadKbAppCustomEventByteInputDone); +} + +void bad_kb_scene_config_usb_vidpid_on_enter(void* context) { + BadKbApp* bad_kb = context; + ByteInput* byte_input = bad_kb->byte_input; + + bad_kb->usb_vidpid_buf[0] = __REVSH(bad_kb->config.usb_cfg.vid); + bad_kb->usb_vidpid_buf[1] = __REVSH(bad_kb->config.usb_cfg.pid); + byte_input_set_header_text(byte_input, "Set USB VID:PID"); + + byte_input_set_result_callback( + byte_input, + bad_kb_scene_config_usb_vidpid_byte_input_callback, + NULL, + bad_kb, + (void*)bad_kb->usb_vidpid_buf, + sizeof(bad_kb->usb_vidpid_buf)); + + view_dispatcher_switch_to_view(bad_kb->view_dispatcher, BadKbAppViewByteInput); +} + +bool bad_kb_scene_config_usb_vidpid_on_event(void* context, SceneManagerEvent event) { + BadKbApp* bad_kb = context; + bool consumed = false; + + if(event.type == SceneManagerEventTypeCustom) { + consumed = true; + if(event.event == BadKbAppCustomEventByteInputDone) { + bad_kb->config.usb_cfg.vid = __REVSH(bad_kb->usb_vidpid_buf[0]); + bad_kb->config.usb_cfg.pid = __REVSH(bad_kb->usb_vidpid_buf[1]); + bad_kb_config_refresh(bad_kb); + } + scene_manager_previous_scene(bad_kb->scene_manager); + } + return consumed; +} + +void bad_kb_scene_config_usb_vidpid_on_exit(void* context) { + BadKbApp* bad_kb = context; + ByteInput* byte_input = bad_kb->byte_input; + + byte_input_set_result_callback(byte_input, NULL, NULL, NULL, NULL, 0); + byte_input_set_header_text(byte_input, ""); +}