mirror of
https://github.com/DarkFlippers/unleashed-firmware
synced 2024-11-23 21:13:16 +00:00
Update WifI marauder app
https://github.com/0xchocolate/flipperzero-firmware-with-wifi-marauder-companion/pull/11
This commit is contained in:
parent
451ec9cba0
commit
10c4cd0f41
43 changed files with 6966 additions and 29 deletions
BIN
applications/external/wifi_marauder_companion/assets/DolphinCommon_56x48.png
vendored
Normal file
BIN
applications/external/wifi_marauder_companion/assets/DolphinCommon_56x48.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 KiB |
46
applications/external/wifi_marauder_companion/file/sequential_file.c
vendored
Normal file
46
applications/external/wifi_marauder_companion/file/sequential_file.c
vendored
Normal file
|
@ -0,0 +1,46 @@
|
|||
#include "sequential_file.h"
|
||||
|
||||
char* sequential_file_resolve_path(
|
||||
Storage* storage,
|
||||
const char* dir,
|
||||
const char* prefix,
|
||||
const char* extension) {
|
||||
if(storage == NULL || dir == NULL || prefix == NULL || extension == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char file_path[256];
|
||||
int file_index = 0;
|
||||
|
||||
do {
|
||||
if(snprintf(
|
||||
file_path, sizeof(file_path), "%s/%s_%d.%s", dir, prefix, file_index, extension) <
|
||||
0) {
|
||||
return NULL;
|
||||
}
|
||||
file_index++;
|
||||
} while(storage_file_exists(storage, file_path));
|
||||
|
||||
return strdup(file_path);
|
||||
}
|
||||
|
||||
bool sequential_file_open(
|
||||
Storage* storage,
|
||||
File* file,
|
||||
const char* dir,
|
||||
const char* prefix,
|
||||
const char* extension) {
|
||||
if(storage == NULL || file == NULL || dir == NULL || prefix == NULL || extension == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
char* file_path = sequential_file_resolve_path(storage, dir, prefix, extension);
|
||||
if(file_path == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool success = storage_file_open(file, file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS);
|
||||
free(file_path);
|
||||
|
||||
return success;
|
||||
}
|
15
applications/external/wifi_marauder_companion/file/sequential_file.h
vendored
Normal file
15
applications/external/wifi_marauder_companion/file/sequential_file.h
vendored
Normal file
|
@ -0,0 +1,15 @@
|
|||
#pragma once
|
||||
|
||||
#include <storage/storage.h>
|
||||
|
||||
char* sequential_file_resolve_path(
|
||||
Storage* storage,
|
||||
const char* dir,
|
||||
const char* prefix,
|
||||
const char* extension);
|
||||
bool sequential_file_open(
|
||||
Storage* storage,
|
||||
File* file,
|
||||
const char* dir,
|
||||
const char* prefix,
|
||||
const char* extension);
|
|
@ -3,3 +3,12 @@ ADD_SCENE(wifi_marauder, console_output, ConsoleOutput)
|
|||
ADD_SCENE(wifi_marauder, text_input, TextInput)
|
||||
ADD_SCENE(wifi_marauder, settings_init, SettingsInit)
|
||||
ADD_SCENE(wifi_marauder, log_viewer, LogViewer)
|
||||
ADD_SCENE(wifi_marauder, user_input, UserInput)
|
||||
ADD_SCENE(wifi_marauder, script_select, ScriptSelect)
|
||||
ADD_SCENE(wifi_marauder, script_options, ScriptOptions)
|
||||
ADD_SCENE(wifi_marauder, script_edit, ScriptEdit)
|
||||
ADD_SCENE(wifi_marauder, script_settings, ScriptSettings)
|
||||
ADD_SCENE(wifi_marauder, script_confirm_delete, ScriptConfirmDelete)
|
||||
ADD_SCENE(wifi_marauder, script_stage_edit, ScriptStageEdit)
|
||||
ADD_SCENE(wifi_marauder, script_stage_add, ScriptStageAdd)
|
||||
ADD_SCENE(wifi_marauder, script_stage_edit_list, ScriptStageEditList)
|
||||
|
|
|
@ -1,5 +1,34 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
char* _wifi_marauder_get_prefix_from_cmd(const char* command) {
|
||||
int end = strcspn(command, " ");
|
||||
char* prefix = (char*)malloc(sizeof(char) * (end + 1));
|
||||
strncpy(prefix, command, end);
|
||||
prefix[end] = '\0';
|
||||
return prefix;
|
||||
}
|
||||
|
||||
bool _wifi_marauder_is_save_pcaps_enabled(WifiMarauderApp* app) {
|
||||
if(!app->ok_to_save_pcaps) {
|
||||
return false;
|
||||
}
|
||||
// If it is a script that contains a sniff function
|
||||
if(app->script != NULL) {
|
||||
return wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffRaw) ||
|
||||
wifi_marauder_script_has_stage(
|
||||
app->script, WifiMarauderScriptStageTypeSniffBeacon) ||
|
||||
wifi_marauder_script_has_stage(
|
||||
app->script, WifiMarauderScriptStageTypeSniffDeauth) ||
|
||||
wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffEsp) ||
|
||||
wifi_marauder_script_has_stage(
|
||||
app->script, WifiMarauderScriptStageTypeSniffPmkid) ||
|
||||
wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffPwn);
|
||||
}
|
||||
// If it is a sniff function
|
||||
return app->is_command && app->selected_tx_string &&
|
||||
strncmp("sniff", app->selected_tx_string, strlen("sniff")) == 0;
|
||||
}
|
||||
|
||||
void wifi_marauder_console_output_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
|
||||
furi_assert(context);
|
||||
WifiMarauderApp* app = context;
|
||||
|
@ -34,23 +63,29 @@ void wifi_marauder_console_output_handle_rx_packets_cb(uint8_t* buf, size_t len,
|
|||
void wifi_marauder_scene_console_output_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
// Reset text box and set font
|
||||
TextBox* text_box = app->text_box;
|
||||
text_box_reset(app->text_box);
|
||||
text_box_reset(text_box);
|
||||
text_box_set_font(text_box, TextBoxFontText);
|
||||
|
||||
// Set focus on start or end
|
||||
if(app->focus_console_start) {
|
||||
text_box_set_focus(text_box, TextBoxFocusStart);
|
||||
} else {
|
||||
text_box_set_focus(text_box, TextBoxFocusEnd);
|
||||
}
|
||||
|
||||
// Set command-related messages
|
||||
if(app->is_command) {
|
||||
furi_string_reset(app->text_box_store);
|
||||
app->text_box_store_strlen = 0;
|
||||
// Help message
|
||||
if(0 == strncmp("help", app->selected_tx_string, strlen("help"))) {
|
||||
const char* help_msg = "Marauder companion " WIFI_MARAUDER_APP_VERSION "\n";
|
||||
furi_string_cat_str(app->text_box_store, help_msg);
|
||||
app->text_box_store_strlen += strlen(help_msg);
|
||||
}
|
||||
|
||||
// Stopscan message
|
||||
if(app->show_stopscan_tip) {
|
||||
const char* help_msg = "Press BACK to send stopscan\n";
|
||||
furi_string_cat_str(app->text_box_store, help_msg);
|
||||
|
@ -58,13 +93,14 @@ void wifi_marauder_scene_console_output_on_enter(void* context) {
|
|||
}
|
||||
}
|
||||
|
||||
// Set starting text - for "View Log from end", this will just be what was already in the text box store
|
||||
// Set starting text
|
||||
text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store));
|
||||
|
||||
// Set scene state and switch view
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneConsoleOutput, 0);
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewConsoleOutput);
|
||||
|
||||
// Register callback to receive data
|
||||
// Register callbacks to receive data
|
||||
wifi_marauder_uart_set_handle_rx_data_cb(
|
||||
app->uart,
|
||||
wifi_marauder_console_output_handle_rx_data_cb); // setup callback for general log rx thread
|
||||
|
@ -73,25 +109,53 @@ void wifi_marauder_scene_console_output_on_enter(void* context) {
|
|||
wifi_marauder_console_output_handle_rx_packets_cb); // setup callback for packets rx thread
|
||||
|
||||
// Get ready to send command
|
||||
if(app->is_command && app->selected_tx_string) {
|
||||
if((app->is_command && app->selected_tx_string) || app->script) {
|
||||
const char* prefix =
|
||||
strlen(app->selected_tx_string) > 0 ?
|
||||
_wifi_marauder_get_prefix_from_cmd(app->selected_tx_string) : // Function name
|
||||
app->script->name; // Script name
|
||||
|
||||
// Create files *before* sending command
|
||||
// (it takes time to iterate through the directory)
|
||||
if(app->ok_to_save_logs) {
|
||||
app->is_writing_log = true;
|
||||
wifi_marauder_create_log_file(app);
|
||||
strcpy(
|
||||
app->log_file_path,
|
||||
sequential_file_resolve_path(
|
||||
app->storage, MARAUDER_APP_FOLDER_LOGS, prefix, "log"));
|
||||
if(app->log_file_path != NULL) {
|
||||
if(storage_file_open(
|
||||
app->log_file, app->log_file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
|
||||
app->is_writing_log = true;
|
||||
} else {
|
||||
dialog_message_show_storage_error(app->dialogs, "Cannot open log file");
|
||||
}
|
||||
} else {
|
||||
dialog_message_show_storage_error(app->dialogs, "Cannot resolve log path");
|
||||
}
|
||||
}
|
||||
|
||||
// If it is a sniff function, open the pcap file for recording
|
||||
if(app->ok_to_save_pcaps &&
|
||||
strncmp("sniff", app->selected_tx_string, strlen("sniff")) == 0) {
|
||||
app->is_writing_pcap = true;
|
||||
wifi_marauder_create_pcap_file(app);
|
||||
// If it is a sniff function or script, open the pcap file for recording
|
||||
if(_wifi_marauder_is_save_pcaps_enabled(app)) {
|
||||
if(sequential_file_open(
|
||||
app->storage, app->capture_file, MARAUDER_APP_FOLDER_PCAPS, prefix, "pcap")) {
|
||||
app->is_writing_pcap = true;
|
||||
} else {
|
||||
dialog_message_show_storage_error(app->dialogs, "Cannot open pcap file");
|
||||
}
|
||||
}
|
||||
|
||||
// Send command with newline '\n'
|
||||
wifi_marauder_uart_tx(
|
||||
(uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
|
||||
wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
|
||||
if(app->selected_tx_string) {
|
||||
wifi_marauder_uart_tx(
|
||||
(uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
|
||||
wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
|
||||
}
|
||||
|
||||
// Run the script if the file with the script has been opened
|
||||
if(app->script != NULL) {
|
||||
app->script_worker = wifi_marauder_script_worker_alloc();
|
||||
wifi_marauder_script_worker_start(app->script_worker, app->script);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -113,14 +177,18 @@ bool wifi_marauder_scene_console_output_on_event(void* context, SceneManagerEven
|
|||
void wifi_marauder_scene_console_output_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
// Automatically stop the scan when exiting view
|
||||
if(app->is_command) {
|
||||
wifi_marauder_uart_tx((uint8_t*)("stopscan\n"), strlen("stopscan\n"));
|
||||
furi_delay_ms(50);
|
||||
}
|
||||
|
||||
// Unregister rx callback
|
||||
wifi_marauder_uart_set_handle_rx_data_cb(app->uart, NULL);
|
||||
wifi_marauder_uart_set_handle_rx_data_cb(app->lp_uart, NULL);
|
||||
|
||||
// Automatically stop the scan when exiting view
|
||||
if(app->is_command) {
|
||||
wifi_marauder_uart_tx((uint8_t*)("stopscan\n"), strlen("stopscan\n"));
|
||||
}
|
||||
wifi_marauder_script_worker_free(app->script_worker);
|
||||
app->script_worker = NULL;
|
||||
|
||||
app->is_writing_pcap = false;
|
||||
if(app->capture_file && storage_file_is_open(app->capture_file)) {
|
||||
|
|
83
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_confirm_delete.c
vendored
Normal file
83
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_confirm_delete.c
vendored
Normal file
|
@ -0,0 +1,83 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_scene_script_confirm_delete_widget_callback(
|
||||
GuiButtonType result,
|
||||
InputType type,
|
||||
void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
if(type == InputTypeShort) {
|
||||
view_dispatcher_send_custom_event(app->view_dispatcher, result);
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_confirm_delete_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
widget_add_button_element(
|
||||
app->widget,
|
||||
GuiButtonTypeLeft,
|
||||
"No",
|
||||
wifi_marauder_scene_script_confirm_delete_widget_callback,
|
||||
app);
|
||||
widget_add_button_element(
|
||||
app->widget,
|
||||
GuiButtonTypeRight,
|
||||
"Yes",
|
||||
wifi_marauder_scene_script_confirm_delete_widget_callback,
|
||||
app);
|
||||
|
||||
widget_add_string_element(
|
||||
app->widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "Are you sure?");
|
||||
widget_add_text_box_element(
|
||||
app->widget,
|
||||
0,
|
||||
12,
|
||||
128,
|
||||
38,
|
||||
AlignCenter,
|
||||
AlignCenter,
|
||||
"The script will be\npermanently deleted",
|
||||
false);
|
||||
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewWidget);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_script_confirm_delete_on_event(void* context, SceneManagerEvent event) {
|
||||
WifiMarauderApp* app = context;
|
||||
bool consumed = false;
|
||||
|
||||
if(event.type == SceneManagerEventTypeCustom) {
|
||||
// get which button press: "Yes" or "No"
|
||||
if(event.event == GuiButtonTypeRight) {
|
||||
// Yes
|
||||
if(app->script != NULL) {
|
||||
char script_path[256];
|
||||
snprintf(
|
||||
script_path,
|
||||
sizeof(script_path),
|
||||
"%s/%s.json",
|
||||
MARAUDER_APP_FOLDER_SCRIPTS,
|
||||
app->script->name);
|
||||
storage_simply_remove(app->storage, script_path);
|
||||
wifi_marauder_script_free(app->script);
|
||||
app->script = NULL;
|
||||
|
||||
DialogMessage* message = dialog_message_alloc();
|
||||
dialog_message_set_text(message, "Deleted!", 88, 32, AlignCenter, AlignCenter);
|
||||
dialog_message_set_icon(message, &I_DolphinCommon_56x48, 5, 6);
|
||||
dialog_message_set_buttons(message, NULL, "Ok", NULL);
|
||||
dialog_message_show(app->dialogs, message);
|
||||
dialog_message_free(message);
|
||||
}
|
||||
}
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
consumed = true;
|
||||
}
|
||||
|
||||
return consumed;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_confirm_delete_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
widget_reset(app->widget);
|
||||
}
|
125
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_edit.c
vendored
Normal file
125
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_edit.c
vendored
Normal file
|
@ -0,0 +1,125 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
static void wifi_marauder_scene_script_edit_callback(void* context, uint32_t index) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStage* current_stage = app->script->first_stage;
|
||||
uint32_t stage_index = 0;
|
||||
|
||||
while(current_stage != NULL && stage_index < index) {
|
||||
current_stage = current_stage->next_stage;
|
||||
stage_index++;
|
||||
}
|
||||
app->script_edit_selected_stage = current_stage;
|
||||
|
||||
if(app->script_edit_selected_stage != NULL) {
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptStageEdit);
|
||||
}
|
||||
}
|
||||
|
||||
static void wifi_marauder_scene_script_edit_add_callback(void* context, uint32_t index) {
|
||||
WifiMarauderApp* app = context;
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptStageAdd);
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_edit_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
Submenu* submenu = app->submenu;
|
||||
WifiMarauderScript* script = app->script;
|
||||
submenu_set_header(submenu, script->name);
|
||||
|
||||
WifiMarauderScriptStage* current_stage = script->first_stage;
|
||||
int stage_index = 0;
|
||||
while(current_stage != NULL) {
|
||||
switch(current_stage->type) {
|
||||
case WifiMarauderScriptStageTypeScan:
|
||||
submenu_add_item(
|
||||
submenu, "Scan", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSelect:
|
||||
submenu_add_item(
|
||||
submenu, "Select", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeDeauth:
|
||||
submenu_add_item(
|
||||
submenu, "Deauth", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeProbe:
|
||||
submenu_add_item(
|
||||
submenu, "Probe", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffRaw:
|
||||
submenu_add_item(
|
||||
submenu, "Sniff raw", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffBeacon:
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"Sniff beacon",
|
||||
stage_index,
|
||||
wifi_marauder_scene_script_edit_callback,
|
||||
app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffDeauth:
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"Sniff deauth",
|
||||
stage_index,
|
||||
wifi_marauder_scene_script_edit_callback,
|
||||
app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffEsp:
|
||||
submenu_add_item(
|
||||
submenu, "Sniff esp", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffPmkid:
|
||||
submenu_add_item(
|
||||
submenu, "Sniff PMKID", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffPwn:
|
||||
submenu_add_item(
|
||||
submenu, "Sniff pwn", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeBeaconList:
|
||||
submenu_add_item(
|
||||
submenu, "Beacon list", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeBeaconAp:
|
||||
submenu_add_item(
|
||||
submenu, "Beacon AP", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeExec:
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"Custom command",
|
||||
stage_index,
|
||||
wifi_marauder_scene_script_edit_callback,
|
||||
app);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeDelay:
|
||||
submenu_add_item(
|
||||
submenu, "Delay", stage_index, wifi_marauder_scene_script_edit_callback, app);
|
||||
break;
|
||||
}
|
||||
current_stage = current_stage->next_stage;
|
||||
stage_index++;
|
||||
}
|
||||
|
||||
submenu_add_item(
|
||||
submenu, "[+] ADD STAGE", stage_index++, wifi_marauder_scene_script_edit_add_callback, app);
|
||||
submenu_set_selected_item(
|
||||
submenu, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit));
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_script_edit_on_event(void* context, SceneManagerEvent event) {
|
||||
UNUSED(context);
|
||||
UNUSED(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_edit_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
submenu_reset(app->submenu);
|
||||
}
|
188
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_edit_list.c
vendored
Normal file
188
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_edit_list.c
vendored
Normal file
|
@ -0,0 +1,188 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
static void
|
||||
wifi_marauder_scene_script_stage_edit_list_add_callback(void* context, uint32_t index) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
// Creates new item
|
||||
WifiMarauderScriptStageListItem* new_item =
|
||||
(WifiMarauderScriptStageListItem*)malloc(sizeof(WifiMarauderScriptStageListItem));
|
||||
new_item->value = malloc(64);
|
||||
new_item->next_item = NULL;
|
||||
|
||||
if(app->script_stage_edit_first_item == NULL) {
|
||||
app->script_stage_edit_first_item = new_item;
|
||||
} else {
|
||||
WifiMarauderScriptStageListItem* last_item = app->script_stage_edit_first_item;
|
||||
while(last_item->next_item != NULL) {
|
||||
last_item = last_item->next_item;
|
||||
}
|
||||
last_item->next_item = new_item;
|
||||
}
|
||||
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEditList, index);
|
||||
app->user_input_type = WifiMarauderUserInputTypeString;
|
||||
app->user_input_string_reference = &new_item->value;
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
|
||||
}
|
||||
|
||||
static void wifi_marauder_scene_script_stage_edit_list_deallocate_items(WifiMarauderApp* app) {
|
||||
WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
|
||||
while(current_item != NULL) {
|
||||
WifiMarauderScriptStageListItem* next_item = current_item->next_item;
|
||||
free(current_item->value);
|
||||
free(current_item);
|
||||
current_item = next_item;
|
||||
}
|
||||
app->script_stage_edit_first_item = NULL;
|
||||
}
|
||||
|
||||
static void wifi_marauder_scene_script_stage_edit_list_save_strings(WifiMarauderApp* app) {
|
||||
WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
|
||||
int array_size = 0;
|
||||
|
||||
// Calculates the required array size
|
||||
while(current_item != NULL) {
|
||||
array_size++;
|
||||
current_item = current_item->next_item;
|
||||
}
|
||||
|
||||
// Reallocate the array of strings if necessary
|
||||
if(*app->script_stage_edit_string_count_reference < array_size) {
|
||||
*app->script_stage_edit_strings_reference =
|
||||
realloc(*app->script_stage_edit_strings_reference, array_size * sizeof(char*));
|
||||
}
|
||||
|
||||
// Fills the array of strings
|
||||
current_item = app->script_stage_edit_first_item;
|
||||
int i = 0;
|
||||
while(current_item != NULL) {
|
||||
char* current_str = malloc(strlen(current_item->value) + 1);
|
||||
strncpy(current_str, current_item->value, strlen(current_item->value) + 1);
|
||||
(*app->script_stage_edit_strings_reference)[i] = current_str;
|
||||
current_item = current_item->next_item;
|
||||
i++;
|
||||
}
|
||||
|
||||
*app->script_stage_edit_string_count_reference = array_size;
|
||||
}
|
||||
|
||||
static void wifi_marauder_scene_script_stage_edit_list_save_numbers(WifiMarauderApp* app) {
|
||||
WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
|
||||
int array_size = 0;
|
||||
|
||||
// Calculates the required array size
|
||||
while(current_item != NULL) {
|
||||
array_size++;
|
||||
current_item = current_item->next_item;
|
||||
}
|
||||
|
||||
// Reallocate the array of integers if necessary
|
||||
if(*app->script_stage_edit_number_count_reference < array_size) {
|
||||
*app->script_stage_edit_numbers_reference =
|
||||
realloc(*app->script_stage_edit_numbers_reference, array_size * sizeof(int));
|
||||
}
|
||||
|
||||
// Fills the array of integers
|
||||
current_item = app->script_stage_edit_first_item;
|
||||
int i = 0;
|
||||
while(current_item != NULL) {
|
||||
(*app->script_stage_edit_numbers_reference)[i] = atoi(current_item->value);
|
||||
current_item = current_item->next_item;
|
||||
i++;
|
||||
}
|
||||
|
||||
*app->script_stage_edit_number_count_reference = array_size;
|
||||
}
|
||||
|
||||
static void
|
||||
wifi_marauder_scene_script_stage_edit_list_save_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
if(app->script_stage_edit_strings_reference != NULL &&
|
||||
app->script_stage_edit_string_count_reference != NULL) {
|
||||
wifi_marauder_scene_script_stage_edit_list_save_strings(app);
|
||||
}
|
||||
|
||||
if(app->script_stage_edit_numbers_reference != NULL &&
|
||||
app->script_stage_edit_number_count_reference != NULL) {
|
||||
wifi_marauder_scene_script_stage_edit_list_save_numbers(app);
|
||||
}
|
||||
|
||||
wifi_marauder_scene_script_stage_edit_list_deallocate_items(app);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
static void
|
||||
wifi_marauder_scene_script_stage_edit_list_clear_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
wifi_marauder_scene_script_stage_edit_list_deallocate_items(app);
|
||||
|
||||
submenu_reset(app->submenu);
|
||||
submenu_add_item(
|
||||
app->submenu,
|
||||
"[+] ADD ITEM",
|
||||
99,
|
||||
wifi_marauder_scene_script_stage_edit_list_add_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
app->submenu,
|
||||
"[*] SAVE ITEMS",
|
||||
99,
|
||||
wifi_marauder_scene_script_stage_edit_list_save_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
app->submenu,
|
||||
"[-] CLEAR LIST",
|
||||
99,
|
||||
wifi_marauder_scene_script_stage_edit_list_clear_callback,
|
||||
app);
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_stage_edit_list_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
int item_index = 0;
|
||||
WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
|
||||
|
||||
while(current_item != NULL) {
|
||||
submenu_add_item(app->submenu, current_item->value, item_index++, NULL, app);
|
||||
current_item = current_item->next_item;
|
||||
}
|
||||
submenu_add_item(
|
||||
app->submenu,
|
||||
"[+] ADD ITEM",
|
||||
99,
|
||||
wifi_marauder_scene_script_stage_edit_list_add_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
app->submenu,
|
||||
"[*] SAVE ITEMS",
|
||||
99,
|
||||
wifi_marauder_scene_script_stage_edit_list_save_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
app->submenu,
|
||||
"[-] CLEAR LIST",
|
||||
99,
|
||||
wifi_marauder_scene_script_stage_edit_list_clear_callback,
|
||||
app);
|
||||
|
||||
submenu_set_selected_item(
|
||||
app->submenu,
|
||||
scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEditList));
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_script_stage_edit_list_on_event(void* context, SceneManagerEvent event) {
|
||||
UNUSED(context);
|
||||
UNUSED(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_stage_edit_list_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
submenu_reset(app->submenu);
|
||||
}
|
111
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_options.c
vendored
Normal file
111
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_options.c
vendored
Normal file
|
@ -0,0 +1,111 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
enum SubmenuIndex {
|
||||
SubmenuIndexRun,
|
||||
SubmenuIndexSettings,
|
||||
SubmenuIndexEditStages,
|
||||
SubmenuIndexSave,
|
||||
SubmenuIndexDelete
|
||||
};
|
||||
|
||||
void wifi_marauder_scene_script_options_save_script(WifiMarauderApp* app) {
|
||||
char script_path[256];
|
||||
snprintf(
|
||||
script_path,
|
||||
sizeof(script_path),
|
||||
"%s/%s.json",
|
||||
MARAUDER_APP_FOLDER_SCRIPTS,
|
||||
app->script->name);
|
||||
wifi_marauder_script_save_json(app->storage, script_path, app->script);
|
||||
|
||||
DialogMessage* message = dialog_message_alloc();
|
||||
dialog_message_set_text(message, "Saved!", 88, 32, AlignCenter, AlignCenter);
|
||||
dialog_message_set_icon(message, &I_DolphinCommon_56x48, 5, 6);
|
||||
dialog_message_set_buttons(message, NULL, "Ok", NULL);
|
||||
dialog_message_show(app->dialogs, message);
|
||||
dialog_message_free(message);
|
||||
}
|
||||
|
||||
static void wifi_marauder_scene_script_options_callback(void* context, uint32_t index) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
switch(index) {
|
||||
case SubmenuIndexRun:
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptOptions, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneConsoleOutput);
|
||||
break;
|
||||
case SubmenuIndexSettings:
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptOptions, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptSettings);
|
||||
break;
|
||||
case SubmenuIndexEditStages:
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptOptions, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptEdit);
|
||||
break;
|
||||
case SubmenuIndexSave:
|
||||
wifi_marauder_scene_script_options_save_script(app);
|
||||
break;
|
||||
case SubmenuIndexDelete:
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptOptions, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptConfirmDelete);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_options_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
// If returning after confirming script deletion
|
||||
if(app->script == NULL) {
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
return;
|
||||
}
|
||||
|
||||
Submenu* submenu = app->submenu;
|
||||
|
||||
submenu_set_header(submenu, app->script->name);
|
||||
submenu_add_item(
|
||||
submenu, "[>] RUN", SubmenuIndexRun, wifi_marauder_scene_script_options_callback, app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[S] SETTINGS",
|
||||
SubmenuIndexSettings,
|
||||
wifi_marauder_scene_script_options_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] EDIT STAGES",
|
||||
SubmenuIndexEditStages,
|
||||
wifi_marauder_scene_script_options_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu, "[*] SAVE", SubmenuIndexSave, wifi_marauder_scene_script_options_callback, app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[X] DELETE",
|
||||
SubmenuIndexDelete,
|
||||
wifi_marauder_scene_script_options_callback,
|
||||
app);
|
||||
|
||||
submenu_set_selected_item(
|
||||
submenu,
|
||||
scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptOptions));
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_script_options_on_event(void* context, SceneManagerEvent event) {
|
||||
WifiMarauderApp* app = context;
|
||||
bool consumed = false;
|
||||
|
||||
if(event.type == SceneManagerEventTypeBack) {
|
||||
wifi_marauder_script_free(app->script);
|
||||
app->script = NULL;
|
||||
}
|
||||
|
||||
return consumed;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_options_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
submenu_reset(app->submenu);
|
||||
}
|
90
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_select.c
vendored
Normal file
90
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_select.c
vendored
Normal file
|
@ -0,0 +1,90 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
static void wifi_marauder_scene_script_select_callback(void* context, uint32_t index) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
char script_path[256];
|
||||
snprintf(
|
||||
script_path,
|
||||
sizeof(script_path),
|
||||
"%s/%s.json",
|
||||
MARAUDER_APP_FOLDER_SCRIPTS,
|
||||
furi_string_get_cstr(app->script_list[index]));
|
||||
|
||||
app->script = wifi_marauder_script_parse_json(app->storage, script_path);
|
||||
if(app->script) {
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptSelect, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptOptions);
|
||||
}
|
||||
}
|
||||
|
||||
static void wifi_marauder_scene_script_select_add_callback(void* context, uint32_t index) {
|
||||
WifiMarauderApp* app = context;
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptSelect, index);
|
||||
|
||||
app->user_input_type = WifiMarauderUserInputTypeFileName;
|
||||
app->user_input_file_dir = strdup(MARAUDER_APP_FOLDER_SCRIPTS);
|
||||
app->user_input_file_extension = strdup("json");
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_select_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
Submenu* submenu = app->submenu;
|
||||
|
||||
File* dir_scripts = storage_file_alloc(app->storage);
|
||||
if(storage_dir_open(dir_scripts, MARAUDER_APP_FOLDER_SCRIPTS)) {
|
||||
FileInfo file_info;
|
||||
char file_path[255];
|
||||
app->script_list_count = 0;
|
||||
// Goes through the files in the folder counting the ones that end with the json extension
|
||||
while(storage_dir_read(dir_scripts, &file_info, file_path, 255)) {
|
||||
app->script_list_count++;
|
||||
}
|
||||
if(app->script_list_count > 0) {
|
||||
submenu_set_header(submenu, "Select a script:");
|
||||
app->script_list = malloc(app->script_list_count * sizeof(FuriString*));
|
||||
storage_dir_close(dir_scripts);
|
||||
storage_dir_open(dir_scripts, MARAUDER_APP_FOLDER_SCRIPTS);
|
||||
// Read the files again from the beginning, adding the scripts in the list
|
||||
int script_index = 0;
|
||||
while(storage_dir_read(dir_scripts, &file_info, file_path, 255)) {
|
||||
app->script_list[script_index] = furi_string_alloc();
|
||||
path_extract_filename_no_ext(file_path, app->script_list[script_index]);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
furi_string_get_cstr(app->script_list[script_index]),
|
||||
script_index,
|
||||
wifi_marauder_scene_script_select_callback,
|
||||
app);
|
||||
script_index++;
|
||||
}
|
||||
} else {
|
||||
submenu_set_header(submenu, "No script found");
|
||||
}
|
||||
submenu_add_item(
|
||||
submenu, "[+] ADD SCRIPT", 99, wifi_marauder_scene_script_select_add_callback, app);
|
||||
storage_dir_close(dir_scripts);
|
||||
}
|
||||
storage_file_free(dir_scripts);
|
||||
|
||||
submenu_set_selected_item(
|
||||
submenu, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptSelect));
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_script_select_on_event(void* context, SceneManagerEvent event) {
|
||||
UNUSED(context);
|
||||
UNUSED(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_select_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
submenu_reset(app->submenu);
|
||||
|
||||
for(int i = 0; i < app->script_list_count; i++) {
|
||||
furi_string_free(app->script_list[i]);
|
||||
}
|
||||
free(app->script_list);
|
||||
}
|
87
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_settings.c
vendored
Normal file
87
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_settings.c
vendored
Normal file
|
@ -0,0 +1,87 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
enum ScriptSettingsOption {
|
||||
ScriptSettingsOptionRepeat,
|
||||
ScriptSettingsOptionSavePcap,
|
||||
ScriptSettingsOptionEnableLed
|
||||
};
|
||||
|
||||
const char* option_values[3] = {"No", "Yes", "Default"};
|
||||
|
||||
static void wifi_marauder_scene_script_settings_enter_callback(void* context, uint32_t index) {
|
||||
WifiMarauderApp* app = context;
|
||||
// Accept script repeat value
|
||||
if(index == ScriptSettingsOptionRepeat) {
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptSettings, index);
|
||||
app->user_input_type = WifiMarauderUserInputTypeNumber;
|
||||
app->user_input_number_reference = &app->script->repeat;
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
|
||||
}
|
||||
}
|
||||
|
||||
static void wifi_marauder_scene_script_settings_change_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
|
||||
uint8_t current_option = variable_item_list_get_selected_item_index(app->var_item_list);
|
||||
uint8_t option_value_index = variable_item_get_current_value_index(item);
|
||||
|
||||
switch(current_option) {
|
||||
case ScriptSettingsOptionSavePcap:
|
||||
variable_item_set_current_value_text(item, option_values[option_value_index]);
|
||||
app->script->save_pcap = option_value_index;
|
||||
break;
|
||||
case ScriptSettingsOptionEnableLed:
|
||||
variable_item_set_current_value_text(item, option_values[option_value_index]);
|
||||
app->script->enable_led = option_value_index;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_settings_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
VariableItemList* var_item_list = app->var_item_list;
|
||||
variable_item_list_set_enter_callback(
|
||||
app->var_item_list, wifi_marauder_scene_script_settings_enter_callback, app);
|
||||
|
||||
// Script repeat option
|
||||
VariableItem* repeat_item = variable_item_list_add(app->var_item_list, "Repeat", 1, NULL, app);
|
||||
char repeat_str[32];
|
||||
snprintf(repeat_str, sizeof(repeat_str), "%d", app->script->repeat);
|
||||
variable_item_set_current_value_text(repeat_item, repeat_str);
|
||||
|
||||
// Save PCAP option
|
||||
VariableItem* save_pcap_item = variable_item_list_add(
|
||||
app->var_item_list,
|
||||
"Save PCAP",
|
||||
3,
|
||||
wifi_marauder_scene_script_settings_change_callback,
|
||||
app);
|
||||
variable_item_set_current_value_index(save_pcap_item, app->script->save_pcap);
|
||||
variable_item_set_current_value_text(save_pcap_item, option_values[app->script->save_pcap]);
|
||||
|
||||
// Enable board LED option
|
||||
VariableItem* enable_led_item = variable_item_list_add(
|
||||
app->var_item_list,
|
||||
"Enable LED",
|
||||
3,
|
||||
wifi_marauder_scene_script_settings_change_callback,
|
||||
app);
|
||||
variable_item_set_current_value_index(enable_led_item, app->script->enable_led);
|
||||
variable_item_set_current_value_text(enable_led_item, option_values[app->script->enable_led]);
|
||||
|
||||
variable_item_list_set_selected_item(
|
||||
var_item_list,
|
||||
scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptSettings));
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewVarItemList);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_script_settings_on_event(void* context, SceneManagerEvent event) {
|
||||
UNUSED(context);
|
||||
UNUSED(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_settings_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
variable_item_list_reset(app->var_item_list);
|
||||
}
|
297
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_stage_add.c
vendored
Normal file
297
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_stage_add.c
vendored
Normal file
|
@ -0,0 +1,297 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
// Scan
|
||||
static void wifi_marauder_scene_script_stage_add_scan_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageScan* stage =
|
||||
(WifiMarauderScriptStageScan*)malloc(sizeof(WifiMarauderScriptStageScan));
|
||||
stage->type = WifiMarauderScriptScanTypeAp;
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeScan, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Select
|
||||
static void wifi_marauder_scene_script_stage_add_select_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageSelect* stage =
|
||||
(WifiMarauderScriptStageSelect*)malloc(sizeof(WifiMarauderScriptStageSelect));
|
||||
stage->type = WifiMarauderScriptSelectTypeAp;
|
||||
stage->filter = strdup("all");
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeSelect, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Deauth
|
||||
static void wifi_marauder_scene_script_stage_add_deauth_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageDeauth* stage =
|
||||
(WifiMarauderScriptStageDeauth*)malloc(sizeof(WifiMarauderScriptStageDeauth));
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeDeauth, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Probe
|
||||
static void wifi_marauder_scene_script_stage_add_probe_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageProbe* stage =
|
||||
(WifiMarauderScriptStageProbe*)malloc(sizeof(WifiMarauderScriptStageProbe));
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_PROBE;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeProbe, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Sniff RAW
|
||||
static void wifi_marauder_scene_script_stage_add_sniffraw_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageSniffRaw* stage =
|
||||
(WifiMarauderScriptStageSniffRaw*)malloc(sizeof(WifiMarauderScriptStageSniffRaw));
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeSniffRaw, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Sniff Beacon
|
||||
static void
|
||||
wifi_marauder_scene_script_stage_add_sniffbeacon_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageSniffBeacon* stage =
|
||||
(WifiMarauderScriptStageSniffBeacon*)malloc(sizeof(WifiMarauderScriptStageSniffBeacon));
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeSniffBeacon, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Sniff Deauth
|
||||
static void
|
||||
wifi_marauder_scene_script_stage_add_sniffdeauth_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageSniffDeauth* stage =
|
||||
(WifiMarauderScriptStageSniffDeauth*)malloc(sizeof(WifiMarauderScriptStageSniffDeauth));
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeSniffDeauth, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Sniff Esp
|
||||
static void wifi_marauder_scene_script_stage_add_sniffesp_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageSniffEsp* stage =
|
||||
(WifiMarauderScriptStageSniffEsp*)malloc(sizeof(WifiMarauderScriptStageSniffEsp));
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeSniffEsp, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Sniff PMKID
|
||||
static void
|
||||
wifi_marauder_scene_script_stage_add_sniffpmkid_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageSniffPmkid* stage =
|
||||
(WifiMarauderScriptStageSniffPmkid*)malloc(sizeof(WifiMarauderScriptStageSniffPmkid));
|
||||
stage->channel = 0;
|
||||
stage->force_deauth = WifiMarauderScriptBooleanTrue;
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeSniffPmkid, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Sniff Pwn
|
||||
static void wifi_marauder_scene_script_stage_add_sniffpwn_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageSniffPwn* stage =
|
||||
(WifiMarauderScriptStageSniffPwn*)malloc(sizeof(WifiMarauderScriptStageSniffPwn));
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeSniffPwn, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Beacon list
|
||||
static void
|
||||
wifi_marauder_scene_script_stage_add_beaconlist_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageBeaconList* stage =
|
||||
(WifiMarauderScriptStageBeaconList*)malloc(sizeof(WifiMarauderScriptStageBeaconList));
|
||||
stage->ssids = NULL;
|
||||
stage->ssid_count = 0;
|
||||
stage->random_ssids = 0;
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeBeaconList, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Beacon AP
|
||||
static void wifi_marauder_scene_script_stage_add_beaconap_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageBeaconAp* stage =
|
||||
(WifiMarauderScriptStageBeaconAp*)malloc(sizeof(WifiMarauderScriptStageBeaconAp));
|
||||
stage->timeout = WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeBeaconAp, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Exec
|
||||
static void wifi_marauder_scene_script_stage_add_exec_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageExec* stage =
|
||||
(WifiMarauderScriptStageExec*)malloc(sizeof(WifiMarauderScriptStageExec));
|
||||
stage->command = NULL;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeExec, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
// Delay
|
||||
static void wifi_marauder_scene_script_stage_add_delay_callback(void* context, uint32_t index) {
|
||||
UNUSED(index);
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
WifiMarauderScriptStageDelay* stage =
|
||||
(WifiMarauderScriptStageDelay*)malloc(sizeof(WifiMarauderScriptStageDelay));
|
||||
stage->timeout = 0;
|
||||
|
||||
wifi_marauder_script_add_stage(app->script, WifiMarauderScriptStageTypeDelay, stage);
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_stage_add_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
Submenu* submenu = app->submenu;
|
||||
submenu_set_header(submenu, "Add stage");
|
||||
|
||||
int menu_index = 0;
|
||||
submenu_add_item(
|
||||
submenu, "[+] Scan", menu_index++, wifi_marauder_scene_script_stage_add_scan_callback, app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Select",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_select_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Deauth",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_deauth_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Probe",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_probe_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Sniff RAW",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_sniffraw_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Sniff Beacon",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_sniffbeacon_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Sniff Deauth",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_sniffdeauth_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Sniff Esp",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_sniffesp_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Sniff PMKID",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_sniffpmkid_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Sniff Pwnagotchi",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_sniffpwn_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Beacon List",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_beaconlist_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Beacon AP",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_beaconap_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Custom command",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_exec_callback,
|
||||
app);
|
||||
submenu_add_item(
|
||||
submenu,
|
||||
"[+] Delay",
|
||||
menu_index++,
|
||||
wifi_marauder_scene_script_stage_add_delay_callback,
|
||||
app);
|
||||
|
||||
submenu_set_selected_item(
|
||||
submenu, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit));
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_script_stage_add_on_event(void* context, SceneManagerEvent event) {
|
||||
UNUSED(context);
|
||||
UNUSED(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_stage_add_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
submenu_reset(app->submenu);
|
||||
}
|
203
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_stage_edit.c
vendored
Normal file
203
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_script_stage_edit.c
vendored
Normal file
|
@ -0,0 +1,203 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_scene_script_stage_edit_create_list_strings(
|
||||
WifiMarauderApp* app,
|
||||
char** strings,
|
||||
int string_count) {
|
||||
// Deallocates the existing list
|
||||
WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
|
||||
while(current_item != NULL) {
|
||||
WifiMarauderScriptStageListItem* next_item = current_item->next_item;
|
||||
free(current_item->value);
|
||||
free(current_item);
|
||||
current_item = next_item;
|
||||
}
|
||||
|
||||
// Create a new list with numbers
|
||||
WifiMarauderScriptStageListItem* first_item = NULL;
|
||||
WifiMarauderScriptStageListItem* previous_item = NULL;
|
||||
for(int i = 0; i < string_count; i++) {
|
||||
WifiMarauderScriptStageListItem* item = malloc(sizeof(WifiMarauderScriptStageListItem));
|
||||
item->value = strdup(strings[i]);
|
||||
item->next_item = NULL;
|
||||
|
||||
if(previous_item == NULL) {
|
||||
first_item = item;
|
||||
} else {
|
||||
previous_item->next_item = item;
|
||||
}
|
||||
previous_item = item;
|
||||
}
|
||||
|
||||
app->script_stage_edit_first_item = first_item;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_stage_edit_create_list_numbers(
|
||||
WifiMarauderApp* app,
|
||||
int* numbers,
|
||||
int number_count) {
|
||||
// Deallocates the existing list
|
||||
WifiMarauderScriptStageListItem* current_item = app->script_stage_edit_first_item;
|
||||
while(current_item != NULL) {
|
||||
WifiMarauderScriptStageListItem* next_item = current_item->next_item;
|
||||
free(current_item->value);
|
||||
free(current_item);
|
||||
current_item = next_item;
|
||||
}
|
||||
|
||||
// Create a new list with numbers
|
||||
WifiMarauderScriptStageListItem* first_item = NULL;
|
||||
WifiMarauderScriptStageListItem* previous_item = NULL;
|
||||
for(int i = 0; i < number_count; i++) {
|
||||
char number_str[32];
|
||||
snprintf(number_str, sizeof(number_str), "%d", numbers[i]);
|
||||
|
||||
WifiMarauderScriptStageListItem* item = malloc(sizeof(WifiMarauderScriptStageListItem));
|
||||
item->value = strdup(number_str);
|
||||
item->next_item = NULL;
|
||||
|
||||
if(previous_item == NULL) {
|
||||
first_item = item;
|
||||
} else {
|
||||
previous_item->next_item = item;
|
||||
}
|
||||
previous_item = item;
|
||||
}
|
||||
|
||||
app->script_stage_edit_first_item = first_item;
|
||||
}
|
||||
|
||||
static void
|
||||
wifi_marauder_scene_script_stage_edit_list_enter_callback(void* context, uint32_t index) {
|
||||
WifiMarauderApp* app = context;
|
||||
const WifiMarauderScriptMenuItem* menu_item = &app->script_stage_menu->items[index];
|
||||
|
||||
// Fixed delete item
|
||||
if(index == app->script_stage_menu->num_items) {
|
||||
uint32_t deleted_stage_index =
|
||||
scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit);
|
||||
if(deleted_stage_index > 0) {
|
||||
scene_manager_set_scene_state(
|
||||
app->scene_manager, WifiMarauderSceneScriptEdit, deleted_stage_index - 1);
|
||||
}
|
||||
WifiMarauderScriptStage* previous_stage = NULL;
|
||||
WifiMarauderScriptStage* current_stage = app->script->first_stage;
|
||||
uint32_t current_stage_index = 0;
|
||||
|
||||
while(current_stage != NULL && current_stage_index < deleted_stage_index) {
|
||||
previous_stage = current_stage;
|
||||
current_stage = current_stage->next_stage;
|
||||
current_stage_index++;
|
||||
}
|
||||
|
||||
// Delete the stage
|
||||
if(current_stage != NULL) {
|
||||
if(previous_stage != NULL) {
|
||||
if(current_stage->next_stage != NULL) {
|
||||
previous_stage->next_stage = current_stage->next_stage;
|
||||
} else {
|
||||
previous_stage->next_stage = NULL;
|
||||
app->script->last_stage = previous_stage;
|
||||
}
|
||||
} else {
|
||||
if(current_stage->next_stage != NULL) {
|
||||
app->script->first_stage = current_stage->next_stage;
|
||||
} else {
|
||||
app->script->first_stage = NULL;
|
||||
app->script->last_stage = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
app->script_edit_selected_stage = NULL;
|
||||
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
return;
|
||||
}
|
||||
|
||||
if(menu_item->select_callback == NULL) {
|
||||
return;
|
||||
}
|
||||
if(menu_item->type == WifiMarauderScriptMenuItemTypeNumber) {
|
||||
// Accepts user number input, assigning the value to the reference passed as a parameter
|
||||
menu_item->select_callback(app);
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEdit, index);
|
||||
app->user_input_type = WifiMarauderUserInputTypeNumber;
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
|
||||
} else if(menu_item->type == WifiMarauderScriptMenuItemTypeString) {
|
||||
// Accepts user string input, assigning the value to the reference passed as a parameter
|
||||
menu_item->select_callback(app);
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEdit, index);
|
||||
app->user_input_type = WifiMarauderUserInputTypeString;
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUserInput);
|
||||
} else if(menu_item->type == WifiMarauderScriptMenuItemTypeListString) {
|
||||
// Accepts the strings that compose the list
|
||||
menu_item->select_callback(app);
|
||||
wifi_marauder_scene_script_stage_edit_create_list_strings(
|
||||
app,
|
||||
*app->script_stage_edit_strings_reference,
|
||||
*app->script_stage_edit_string_count_reference);
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEdit, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptStageEditList);
|
||||
} else if(menu_item->type == WifiMarauderScriptMenuItemTypeListNumber) {
|
||||
// Accepts the numbers that compose the list
|
||||
menu_item->select_callback(app);
|
||||
wifi_marauder_scene_script_stage_edit_create_list_numbers(
|
||||
app,
|
||||
*app->script_stage_edit_numbers_reference,
|
||||
*app->script_stage_edit_number_count_reference);
|
||||
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEdit, index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptStageEditList);
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_stage_edit_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
VariableItemList* var_item_list = app->var_item_list;
|
||||
|
||||
variable_item_list_set_enter_callback(
|
||||
app->var_item_list, wifi_marauder_scene_script_stage_edit_list_enter_callback, app);
|
||||
app->script_stage_menu =
|
||||
wifi_marauder_script_stage_menu_create(app->script_edit_selected_stage->type);
|
||||
|
||||
if(app->script_stage_menu->items != NULL) {
|
||||
for(uint32_t i = 0; i < app->script_stage_menu->num_items; i++) {
|
||||
WifiMarauderScriptMenuItem* stage_item = &app->script_stage_menu->items[i];
|
||||
|
||||
// Changes the list item to handle it in callbacks
|
||||
VariableItem* list_item = variable_item_list_add(
|
||||
app->var_item_list,
|
||||
stage_item->name,
|
||||
stage_item->num_options,
|
||||
stage_item->change_callback,
|
||||
app);
|
||||
|
||||
variable_item_list_set_selected_item(app->var_item_list, i);
|
||||
if(stage_item->setup_callback != NULL) {
|
||||
stage_item->setup_callback(list_item);
|
||||
}
|
||||
if(stage_item->change_callback != NULL) {
|
||||
stage_item->change_callback(list_item);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variable_item_list_add(app->var_item_list, "[-] DELETE STAGE", 0, NULL, app);
|
||||
|
||||
variable_item_list_set_selected_item(
|
||||
var_item_list,
|
||||
scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptStageEdit));
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewVarItemList);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_script_stage_edit_on_event(void* context, SceneManagerEvent event) {
|
||||
UNUSED(context);
|
||||
UNUSED(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_script_stage_edit_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
wifi_marauder_script_stage_menu_free(app->script_stage_menu);
|
||||
app->script_stage_menu = NULL;
|
||||
variable_item_list_reset(app->var_item_list);
|
||||
}
|
|
@ -127,6 +127,7 @@ const WifiMarauderItem items[NUM_MENU_ITEMS] = {
|
|||
{"Update", {"ota", "sd"}, 2, {"update -w", "update -s"}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP},
|
||||
{"Reboot", {""}, 1, {"reboot"}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP},
|
||||
{"Help", {""}, 1, {"help"}, NO_ARGS, FOCUS_CONSOLE_START, SHOW_STOPSCAN_TIP},
|
||||
{"Scripts", {""}, 1, {""}, NO_ARGS, FOCUS_CONSOLE_END, NO_TIP},
|
||||
{"Save to flipper sdcard", // keep as last entry or change logic in callback below
|
||||
{""},
|
||||
1,
|
||||
|
@ -143,13 +144,6 @@ static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uin
|
|||
furi_assert(index < NUM_MENU_ITEMS);
|
||||
const WifiMarauderItem* item = &items[index];
|
||||
|
||||
if(index == NUM_MENU_ITEMS - 1) {
|
||||
// "Save to flipper sdcard" special case - start SettingsInit widget
|
||||
view_dispatcher_send_custom_event(
|
||||
app->view_dispatcher, WifiMarauderEventStartSettingsInit);
|
||||
return;
|
||||
}
|
||||
|
||||
const int selected_option_index = app->selected_option_index[index];
|
||||
furi_assert(selected_option_index < item->num_options_menu);
|
||||
app->selected_tx_string = item->actual_commands[selected_option_index];
|
||||
|
@ -167,6 +161,20 @@ static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uin
|
|||
return;
|
||||
}
|
||||
|
||||
// Select automation script
|
||||
if(index == NUM_MENU_ITEMS - 2) {
|
||||
view_dispatcher_send_custom_event(
|
||||
app->view_dispatcher, WifiMarauderEventStartScriptSelect);
|
||||
return;
|
||||
}
|
||||
|
||||
if(index == NUM_MENU_ITEMS - 1) {
|
||||
// "Save to flipper sdcard" special case - start SettingsInit widget
|
||||
view_dispatcher_send_custom_event(
|
||||
app->view_dispatcher, WifiMarauderEventStartSettingsInit);
|
||||
return;
|
||||
}
|
||||
|
||||
bool needs_keyboard = (item->needs_keyboard == TOGGLE_ARGS) ? (selected_option_index != 0) :
|
||||
item->needs_keyboard;
|
||||
if(needs_keyboard) {
|
||||
|
@ -242,6 +250,10 @@ bool wifi_marauder_scene_start_on_event(void* context, SceneManagerEvent event)
|
|||
scene_manager_set_scene_state(
|
||||
app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneLogViewer);
|
||||
} else if(event.event == WifiMarauderEventStartScriptSelect) {
|
||||
scene_manager_set_scene_state(
|
||||
app->scene_manager, WifiMarauderSceneStart, app->selected_menu_index);
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptSelect);
|
||||
}
|
||||
consumed = true;
|
||||
} else if(event.type == SceneManagerEventTypeTick) {
|
||||
|
|
155
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_user_input.c
vendored
Normal file
155
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_user_input.c
vendored
Normal file
|
@ -0,0 +1,155 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
|
||||
bool wifi_marauder_scene_user_input_validator_number_callback(
|
||||
const char* text,
|
||||
FuriString* error,
|
||||
void* context) {
|
||||
UNUSED(context);
|
||||
for(int i = 0; text[i] != '\0'; i++) {
|
||||
if(text[i] < '0' || text[i] > '9') {
|
||||
furi_string_printf(error, "This is not\na valid\nnumber!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_user_input_validator_file_callback(
|
||||
const char* text,
|
||||
FuriString* error,
|
||||
void* context) {
|
||||
UNUSED(context);
|
||||
if(strlen(text) == 0) {
|
||||
furi_string_printf(error, "File name\ncannot be\nblank!");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_user_input_ok_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
File* file = NULL;
|
||||
char* file_path = NULL;
|
||||
|
||||
switch(app->user_input_type) {
|
||||
// Writes the string value of the reference
|
||||
case WifiMarauderUserInputTypeString:
|
||||
if(app->user_input_string_reference != NULL) {
|
||||
strncpy(
|
||||
*app->user_input_string_reference,
|
||||
app->text_input_store,
|
||||
strlen(app->text_input_store) + 1);
|
||||
app->user_input_string_reference = NULL;
|
||||
}
|
||||
break;
|
||||
// Writes the numerical value of the reference
|
||||
case WifiMarauderUserInputTypeNumber:
|
||||
if(app->user_input_number_reference != NULL) {
|
||||
*app->user_input_number_reference = atoi(app->text_input_store);
|
||||
app->user_input_number_reference = NULL;
|
||||
}
|
||||
break;
|
||||
// Creates a file with the name entered by the user, if it does not exist
|
||||
case WifiMarauderUserInputTypeFileName:
|
||||
file = storage_file_alloc(app->storage);
|
||||
// Use application directory if not specified
|
||||
if(app->user_input_file_dir == NULL) {
|
||||
app->user_input_file_dir = strdup(MARAUDER_APP_FOLDER);
|
||||
}
|
||||
if(app->user_input_file_extension != NULL) {
|
||||
size_t file_path_len = strlen(app->user_input_file_dir) +
|
||||
strlen(app->text_input_store) +
|
||||
strlen(app->user_input_file_extension) + 3;
|
||||
file_path = (char*)malloc(file_path_len);
|
||||
snprintf(
|
||||
file_path,
|
||||
file_path_len,
|
||||
"%s/%s.%s",
|
||||
app->user_input_file_dir,
|
||||
app->text_input_store,
|
||||
app->user_input_file_extension);
|
||||
} else {
|
||||
size_t file_path_len =
|
||||
strlen(app->user_input_file_dir) + strlen(app->text_input_store) + 2;
|
||||
file_path = (char*)malloc(file_path_len);
|
||||
snprintf(
|
||||
file_path, file_path_len, "%s/%s", app->user_input_file_dir, app->text_input_store);
|
||||
}
|
||||
if(storage_file_open(file, file_path, FSAM_WRITE, FSOM_CREATE_NEW)) {
|
||||
storage_file_close(file);
|
||||
}
|
||||
// Free memory
|
||||
free(app->user_input_file_dir);
|
||||
app->user_input_file_dir = NULL;
|
||||
free(app->user_input_file_extension);
|
||||
app->user_input_file_extension = NULL;
|
||||
free(file_path);
|
||||
storage_file_free(file);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_user_input_on_enter(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
|
||||
switch(app->user_input_type) {
|
||||
// Loads the string value of the reference
|
||||
case WifiMarauderUserInputTypeString:
|
||||
wifi_text_input_set_header_text(app->text_input, "Enter value:");
|
||||
wifi_text_input_set_validator(app->text_input, NULL, app);
|
||||
if(app->user_input_string_reference != NULL) {
|
||||
strncpy(
|
||||
app->text_input_store,
|
||||
*app->user_input_string_reference,
|
||||
strlen(*app->user_input_string_reference) + 1);
|
||||
}
|
||||
break;
|
||||
// Loads the numerical value of the reference
|
||||
case WifiMarauderUserInputTypeNumber:
|
||||
wifi_text_input_set_header_text(app->text_input, "Enter a valid number:");
|
||||
wifi_text_input_set_validator(
|
||||
app->text_input, wifi_marauder_scene_user_input_validator_number_callback, app);
|
||||
if(app->user_input_number_reference != NULL) {
|
||||
char number_str[32];
|
||||
snprintf(number_str, sizeof(number_str), "%d", *app->user_input_number_reference);
|
||||
strncpy(app->text_input_store, number_str, strlen(number_str) + 1);
|
||||
}
|
||||
break;
|
||||
// File name
|
||||
case WifiMarauderUserInputTypeFileName:
|
||||
wifi_text_input_set_header_text(app->text_input, "Enter file name:");
|
||||
wifi_text_input_set_validator(
|
||||
app->text_input, wifi_marauder_scene_user_input_validator_file_callback, app);
|
||||
break;
|
||||
default:
|
||||
scene_manager_previous_scene(app->scene_manager);
|
||||
return;
|
||||
}
|
||||
|
||||
wifi_text_input_set_result_callback(
|
||||
app->text_input,
|
||||
wifi_marauder_scene_user_input_ok_callback,
|
||||
app,
|
||||
app->text_input_store,
|
||||
WIFI_MARAUDER_TEXT_INPUT_STORE_SIZE,
|
||||
false);
|
||||
|
||||
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewTextInput);
|
||||
}
|
||||
|
||||
bool wifi_marauder_scene_user_input_on_event(void* context, SceneManagerEvent event) {
|
||||
UNUSED(context);
|
||||
UNUSED(event);
|
||||
return false;
|
||||
}
|
||||
|
||||
void wifi_marauder_scene_user_input_on_exit(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
memset(app->text_input_store, 0, sizeof(app->text_input_store));
|
||||
wifi_text_input_reset(app->text_input);
|
||||
}
|
2743
applications/external/wifi_marauder_companion/script/cJSON.c
vendored
Normal file
2743
applications/external/wifi_marauder_companion/script/cJSON.c
vendored
Normal file
File diff suppressed because it is too large
Load diff
321
applications/external/wifi_marauder_companion/script/cJSON.h
vendored
Normal file
321
applications/external/wifi_marauder_companion/script/cJSON.h
vendored
Normal file
|
@ -0,0 +1,321 @@
|
|||
/*
|
||||
Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#ifndef cJSON__h
|
||||
#define cJSON__h
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#if !defined(__WINDOWS__) && \
|
||||
(defined(WIN32) || defined(WIN64) || defined(_MSC_VER) || defined(_WIN32))
|
||||
#define __WINDOWS__
|
||||
#endif
|
||||
|
||||
#ifdef __WINDOWS__
|
||||
|
||||
/* When compiling for windows, we specify a specific calling convention to avoid issues where we are being called from a project with a different default calling convention. For windows you have 3 define options:
|
||||
|
||||
CJSON_HIDE_SYMBOLS - Define this in the case where you don't want to ever dllexport symbols
|
||||
CJSON_EXPORT_SYMBOLS - Define this on library build when you want to dllexport symbols (default)
|
||||
CJSON_IMPORT_SYMBOLS - Define this if you want to dllimport symbol
|
||||
|
||||
For *nix builds that support visibility attribute, you can define similar behavior by
|
||||
|
||||
setting default visibility to hidden by adding
|
||||
-fvisibility=hidden (for gcc)
|
||||
or
|
||||
-xldscope=hidden (for sun cc)
|
||||
to CFLAGS
|
||||
|
||||
then using the CJSON_API_VISIBILITY flag to "export" the same symbols the way CJSON_EXPORT_SYMBOLS does
|
||||
|
||||
*/
|
||||
|
||||
#define CJSON_CDECL __cdecl
|
||||
#define CJSON_STDCALL __stdcall
|
||||
|
||||
/* export symbols by default, this is necessary for copy pasting the C and header file */
|
||||
#if !defined(CJSON_HIDE_SYMBOLS) && !defined(CJSON_IMPORT_SYMBOLS) && \
|
||||
!defined(CJSON_EXPORT_SYMBOLS)
|
||||
#define CJSON_EXPORT_SYMBOLS
|
||||
#endif
|
||||
|
||||
#if defined(CJSON_HIDE_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) type CJSON_STDCALL
|
||||
#elif defined(CJSON_EXPORT_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) __declspec(dllexport) type CJSON_STDCALL
|
||||
#elif defined(CJSON_IMPORT_SYMBOLS)
|
||||
#define CJSON_PUBLIC(type) __declspec(dllimport) type CJSON_STDCALL
|
||||
#endif
|
||||
#else /* !__WINDOWS__ */
|
||||
#define CJSON_CDECL
|
||||
#define CJSON_STDCALL
|
||||
|
||||
#if(defined(__GNUC__) || defined(__SUNPRO_CC) || defined(__SUNPRO_C)) && \
|
||||
defined(CJSON_API_VISIBILITY)
|
||||
#define CJSON_PUBLIC(type) __attribute__((visibility("default"))) type
|
||||
#else
|
||||
#define CJSON_PUBLIC(type) type
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* project version */
|
||||
#define CJSON_VERSION_MAJOR 1
|
||||
#define CJSON_VERSION_MINOR 7
|
||||
#define CJSON_VERSION_PATCH 15
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
/* cJSON Types: */
|
||||
#define cJSON_Invalid (0)
|
||||
#define cJSON_False (1 << 0)
|
||||
#define cJSON_True (1 << 1)
|
||||
#define cJSON_NULL (1 << 2)
|
||||
#define cJSON_Number (1 << 3)
|
||||
#define cJSON_String (1 << 4)
|
||||
#define cJSON_Array (1 << 5)
|
||||
#define cJSON_Object (1 << 6)
|
||||
#define cJSON_Raw (1 << 7) /* raw json */
|
||||
|
||||
#define cJSON_IsReference 256
|
||||
#define cJSON_StringIsConst 512
|
||||
|
||||
/* The cJSON structure: */
|
||||
typedef struct cJSON {
|
||||
/* next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem */
|
||||
struct cJSON* next;
|
||||
struct cJSON* prev;
|
||||
/* An array or object item will have a child pointer pointing to a chain of the items in the array/object. */
|
||||
struct cJSON* child;
|
||||
|
||||
/* The type of the item, as above. */
|
||||
int type;
|
||||
|
||||
/* The item's string, if type==cJSON_String and type == cJSON_Raw */
|
||||
char* valuestring;
|
||||
/* writing to valueint is DEPRECATED, use cJSON_SetNumberValue instead */
|
||||
int valueint;
|
||||
/* The item's number, if type==cJSON_Number */
|
||||
double valuedouble;
|
||||
|
||||
/* The item's name string, if this item is the child of, or is in the list of subitems of an object. */
|
||||
char* string;
|
||||
} cJSON;
|
||||
|
||||
typedef struct cJSON_Hooks {
|
||||
/* malloc/free are CDECL on Windows regardless of the default calling convention of the compiler, so ensure the hooks allow passing those functions directly. */
|
||||
void*(CJSON_CDECL* malloc_fn)(size_t sz);
|
||||
void(CJSON_CDECL* free_fn)(void* ptr);
|
||||
} cJSON_Hooks;
|
||||
|
||||
typedef int cJSON_bool;
|
||||
|
||||
/* Limits how deeply nested arrays/objects can be before cJSON rejects to parse them.
|
||||
* This is to prevent stack overflows. */
|
||||
#ifndef CJSON_NESTING_LIMIT
|
||||
#define CJSON_NESTING_LIMIT 1000
|
||||
#endif
|
||||
|
||||
/* returns the version of cJSON as a string */
|
||||
CJSON_PUBLIC(const char*) cJSON_Version(void);
|
||||
|
||||
/* Supply malloc, realloc and free functions to cJSON */
|
||||
CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks* hooks);
|
||||
|
||||
/* Memory Management: the caller is always responsible to free the results from all variants of cJSON_Parse (with cJSON_Delete) and cJSON_Print (with stdlib free, cJSON_Hooks.free_fn, or cJSON_free as appropriate). The exception is cJSON_PrintPreallocated, where the caller has full responsibility of the buffer. */
|
||||
/* Supply a block of JSON, and this returns a cJSON object you can interrogate. */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_Parse(const char* value);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_ParseWithLength(const char* value, size_t buffer_length);
|
||||
/* ParseWithOpts allows you to require (and check) that the JSON is null terminated, and to retrieve the pointer to the final byte parsed. */
|
||||
/* If you supply a ptr in return_parse_end and parsing fails, then return_parse_end will contain a pointer to the error so will match cJSON_GetErrorPtr(). */
|
||||
CJSON_PUBLIC(cJSON*)
|
||||
cJSON_ParseWithOpts(
|
||||
const char* value,
|
||||
const char** return_parse_end,
|
||||
cJSON_bool require_null_terminated);
|
||||
CJSON_PUBLIC(cJSON*)
|
||||
cJSON_ParseWithLengthOpts(
|
||||
const char* value,
|
||||
size_t buffer_length,
|
||||
const char** return_parse_end,
|
||||
cJSON_bool require_null_terminated);
|
||||
|
||||
/* Render a cJSON entity to text for transfer/storage. */
|
||||
CJSON_PUBLIC(char*) cJSON_Print(const cJSON* item);
|
||||
/* Render a cJSON entity to text for transfer/storage without any formatting. */
|
||||
CJSON_PUBLIC(char*) cJSON_PrintUnformatted(const cJSON* item);
|
||||
/* Render a cJSON entity to text using a buffered strategy. prebuffer is a guess at the final size. guessing well reduces reallocation. fmt=0 gives unformatted, =1 gives formatted */
|
||||
CJSON_PUBLIC(char*) cJSON_PrintBuffered(const cJSON* item, int prebuffer, cJSON_bool fmt);
|
||||
/* Render a cJSON entity to text using a buffer already allocated in memory with given length. Returns 1 on success and 0 on failure. */
|
||||
/* NOTE: cJSON is not always 100% accurate in estimating how much memory it will use, so to be safe allocate 5 bytes more than you actually need */
|
||||
CJSON_PUBLIC(cJSON_bool)
|
||||
cJSON_PrintPreallocated(cJSON* item, char* buffer, const int length, const cJSON_bool format);
|
||||
/* Delete a cJSON entity and all subentities. */
|
||||
CJSON_PUBLIC(void) cJSON_Delete(cJSON* item);
|
||||
|
||||
/* Returns the number of items in an array (or object). */
|
||||
CJSON_PUBLIC(int) cJSON_GetArraySize(const cJSON* array);
|
||||
/* Retrieve item number "index" from array "array". Returns NULL if unsuccessful. */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_GetArrayItem(const cJSON* array, int index);
|
||||
/* Get item "string" from object. Case insensitive. */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_GetObjectItem(const cJSON* const object, const char* const string);
|
||||
CJSON_PUBLIC(cJSON*)
|
||||
cJSON_GetObjectItemCaseSensitive(const cJSON* const object, const char* const string);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_HasObjectItem(const cJSON* object, const char* string);
|
||||
/* For analysing failed parses. This returns a pointer to the parse error. You'll probably need to look a few chars back to make sense of it. Defined when cJSON_Parse() returns 0. 0 when cJSON_Parse() succeeds. */
|
||||
CJSON_PUBLIC(const char*) cJSON_GetErrorPtr(void);
|
||||
|
||||
/* Check item type and return its value */
|
||||
CJSON_PUBLIC(char*) cJSON_GetStringValue(const cJSON* const item);
|
||||
CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON* const item);
|
||||
|
||||
/* These functions check the type of an item */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsInvalid(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsFalse(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsTrue(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsBool(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsNull(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsNumber(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsString(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsArray(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsObject(const cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_IsRaw(const cJSON* const item);
|
||||
|
||||
/* These calls create a cJSON item of the appropriate type. */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateNull(void);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateTrue(void);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateFalse(void);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateBool(cJSON_bool boolean);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateNumber(double num);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateString(const char* string);
|
||||
/* raw json */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateRaw(const char* raw);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateArray(void);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateObject(void);
|
||||
|
||||
/* Create a string where valuestring references a string so
|
||||
* it will not be freed by cJSON_Delete */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateStringReference(const char* string);
|
||||
/* Create an object/array that only references it's elements so
|
||||
* they will not be freed by cJSON_Delete */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateObjectReference(const cJSON* child);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateArrayReference(const cJSON* child);
|
||||
|
||||
/* These utilities create an Array of count items.
|
||||
* The parameter count cannot be greater than the number of elements in the number array, otherwise array access will be out of bounds.*/
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateIntArray(const int* numbers, int count);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateFloatArray(const float* numbers, int count);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateDoubleArray(const double* numbers, int count);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_CreateStringArray(const char* const* strings, int count);
|
||||
|
||||
/* Append item to the specified array/object. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToArray(cJSON* array, cJSON* item);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON* object, const char* string, cJSON* item);
|
||||
/* Use this when string is definitely const (i.e. a literal, or as good as), and will definitely survive the cJSON object.
|
||||
* WARNING: When this function was used, make sure to always check that (item->type & cJSON_StringIsConst) is zero before
|
||||
* writing to `item->string` */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObjectCS(cJSON* object, const char* string, cJSON* item);
|
||||
/* Append reference to item to the specified array/object. Use this when you want to add an existing cJSON to a new cJSON, but don't want to corrupt your existing cJSON. */
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_AddItemReferenceToArray(cJSON* array, cJSON* item);
|
||||
CJSON_PUBLIC(cJSON_bool)
|
||||
cJSON_AddItemReferenceToObject(cJSON* object, const char* string, cJSON* item);
|
||||
|
||||
/* Remove/Detach items from Arrays/Objects. */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_DetachItemViaPointer(cJSON* parent, cJSON* const item);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromArray(cJSON* array, int which);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromArray(cJSON* array, int which);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObject(cJSON* object, const char* string);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_DetachItemFromObjectCaseSensitive(cJSON* object, const char* string);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromObject(cJSON* object, const char* string);
|
||||
CJSON_PUBLIC(void) cJSON_DeleteItemFromObjectCaseSensitive(cJSON* object, const char* string);
|
||||
|
||||
/* Update array items. */
|
||||
CJSON_PUBLIC(cJSON_bool)
|
||||
cJSON_InsertItemInArray(
|
||||
cJSON* array,
|
||||
int which,
|
||||
cJSON* newitem); /* Shifts pre-existing items to the right. */
|
||||
CJSON_PUBLIC(cJSON_bool)
|
||||
cJSON_ReplaceItemViaPointer(cJSON* const parent, cJSON* const item, cJSON* replacement);
|
||||
CJSON_PUBLIC(cJSON_bool) cJSON_ReplaceItemInArray(cJSON* array, int which, cJSON* newitem);
|
||||
CJSON_PUBLIC(cJSON_bool)
|
||||
cJSON_ReplaceItemInObject(cJSON* object, const char* string, cJSON* newitem);
|
||||
CJSON_PUBLIC(cJSON_bool)
|
||||
cJSON_ReplaceItemInObjectCaseSensitive(cJSON* object, const char* string, cJSON* newitem);
|
||||
|
||||
/* Duplicate a cJSON item */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_Duplicate(const cJSON* item, cJSON_bool recurse);
|
||||
/* Duplicate will create a new, identical cJSON item to the one you pass, in new memory that will
|
||||
* need to be released. With recurse!=0, it will duplicate any children connected to the item.
|
||||
* The item->next and ->prev pointers are always zero on return from Duplicate. */
|
||||
/* Recursively compare two cJSON items for equality. If either a or b is NULL or invalid, they will be considered unequal.
|
||||
* case_sensitive determines if object keys are treated case sensitive (1) or case insensitive (0) */
|
||||
CJSON_PUBLIC(cJSON_bool)
|
||||
cJSON_Compare(const cJSON* const a, const cJSON* const b, const cJSON_bool case_sensitive);
|
||||
|
||||
/* Minify a strings, remove blank characters(such as ' ', '\t', '\r', '\n') from strings.
|
||||
* The input pointer json cannot point to a read-only address area, such as a string constant,
|
||||
* but should point to a readable and writable address area. */
|
||||
CJSON_PUBLIC(void) cJSON_Minify(char* json);
|
||||
|
||||
/* Helper functions for creating and adding items to an object at the same time.
|
||||
* They return the added item or NULL on failure. */
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddNullToObject(cJSON* const object, const char* const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddTrueToObject(cJSON* const object, const char* const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddFalseToObject(cJSON* const object, const char* const name);
|
||||
CJSON_PUBLIC(cJSON*)
|
||||
cJSON_AddBoolToObject(cJSON* const object, const char* const name, const cJSON_bool boolean);
|
||||
CJSON_PUBLIC(cJSON*)
|
||||
cJSON_AddNumberToObject(cJSON* const object, const char* const name, const double number);
|
||||
CJSON_PUBLIC(cJSON*)
|
||||
cJSON_AddStringToObject(cJSON* const object, const char* const name, const char* const string);
|
||||
CJSON_PUBLIC(cJSON*)
|
||||
cJSON_AddRawToObject(cJSON* const object, const char* const name, const char* const raw);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddObjectToObject(cJSON* const object, const char* const name);
|
||||
CJSON_PUBLIC(cJSON*) cJSON_AddArrayToObject(cJSON* const object, const char* const name);
|
||||
|
||||
/* When assigning an integer value, it needs to be propagated to valuedouble too. */
|
||||
#define cJSON_SetIntValue(object, number) \
|
||||
((object) ? (object)->valueint = (object)->valuedouble = (number) : (number))
|
||||
/* helper for the cJSON_SetNumberValue macro */
|
||||
CJSON_PUBLIC(double) cJSON_SetNumberHelper(cJSON* object, double number);
|
||||
#define cJSON_SetNumberValue(object, number) \
|
||||
((object != NULL) ? cJSON_SetNumberHelper(object, (double)number) : (number))
|
||||
/* Change the valuestring of a cJSON_String object, only takes effect when type of object is cJSON_String */
|
||||
CJSON_PUBLIC(char*) cJSON_SetValuestring(cJSON* object, const char* valuestring);
|
||||
|
||||
/* Macro for iterating over an array or object */
|
||||
#define cJSON_ArrayForEach(element, array) \
|
||||
for(element = (array != NULL) ? (array)->child : NULL; element != NULL; \
|
||||
element = element->next)
|
||||
|
||||
/* malloc/free objects using the malloc/free functions that have been set with cJSON_InitHooks */
|
||||
CJSON_PUBLIC(void*) cJSON_malloc(size_t size);
|
||||
CJSON_PUBLIC(void) cJSON_free(void* object);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
32
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu.c
vendored
Normal file
32
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu.c
vendored
Normal file
|
@ -0,0 +1,32 @@
|
|||
#include "wifi_marauder_script_stage_menu.h"
|
||||
|
||||
WifiMarauderScriptStageMenu*
|
||||
wifi_marauder_script_stage_menu_create(WifiMarauderScriptStageType stage_type) {
|
||||
WifiMarauderScriptStageMenu* script_stage_menu = malloc(sizeof(WifiMarauderScriptStageMenu));
|
||||
|
||||
switch(stage_type) {
|
||||
#define ADD_STAGE(name, id) \
|
||||
case WifiMarauderScriptStageType##id: \
|
||||
wifi_marauder_script_stage_menu_##name##_load(script_stage_menu); \
|
||||
break;
|
||||
|
||||
#include "wifi_marauder_script_stage_menu_config.h"
|
||||
#undef ADD_STAGE
|
||||
}
|
||||
return script_stage_menu;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_free(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
if(stage_menu == NULL) {
|
||||
return;
|
||||
}
|
||||
for(uint32_t i = 0; i < stage_menu->num_items; i++) {
|
||||
WifiMarauderScriptMenuItem* item = &(stage_menu->items[i]);
|
||||
for(int j = 0; j < item->num_options; j++) {
|
||||
free(item->options[j]);
|
||||
}
|
||||
free(item->name);
|
||||
}
|
||||
free(stage_menu->items);
|
||||
free(stage_menu);
|
||||
}
|
42
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu.h
vendored
Normal file
42
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu.h
vendored
Normal file
|
@ -0,0 +1,42 @@
|
|||
#pragma once
|
||||
|
||||
#include <gui/modules/variable_item_list.h>
|
||||
#include "../wifi_marauder_script.h"
|
||||
|
||||
#define ITEM_EDIT_MAX_OPTIONS (12)
|
||||
|
||||
typedef void (*VariableItemSetupCallback)(VariableItem* item);
|
||||
typedef void (*VariableItemSelectCallback)(void* context);
|
||||
|
||||
typedef enum WifiMarauderScriptMenuItemType {
|
||||
WifiMarauderScriptMenuItemTypeString,
|
||||
WifiMarauderScriptMenuItemTypeNumber,
|
||||
WifiMarauderScriptMenuItemTypeOptionsString,
|
||||
WifiMarauderScriptMenuItemTypeOptionsNumber,
|
||||
WifiMarauderScriptMenuItemTypeListString,
|
||||
WifiMarauderScriptMenuItemTypeListNumber
|
||||
} WifiMarauderScriptMenuItemType;
|
||||
|
||||
typedef struct WifiMarauderScriptMenuItem {
|
||||
char* name;
|
||||
WifiMarauderScriptMenuItemType type;
|
||||
int num_options;
|
||||
char* options[ITEM_EDIT_MAX_OPTIONS];
|
||||
VariableItemSetupCallback setup_callback;
|
||||
VariableItemChangeCallback change_callback;
|
||||
VariableItemSelectCallback select_callback;
|
||||
} WifiMarauderScriptMenuItem;
|
||||
|
||||
typedef struct WifiMarauderScriptStageMenu {
|
||||
WifiMarauderScriptMenuItem* items;
|
||||
uint32_t num_items;
|
||||
} WifiMarauderScriptStageMenu;
|
||||
|
||||
#define ADD_STAGE(name, id) \
|
||||
void wifi_marauder_script_stage_menu_##name##_load(WifiMarauderScriptStageMenu*);
|
||||
#include "wifi_marauder_script_stage_menu_config.h"
|
||||
#undef ADD_STAGE
|
||||
|
||||
WifiMarauderScriptStageMenu*
|
||||
wifi_marauder_script_stage_menu_create(WifiMarauderScriptStageType stage_type);
|
||||
void wifi_marauder_script_stage_menu_free(WifiMarauderScriptStageMenu* list);
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_beaconap_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageBeaconAp* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_beaconap_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageBeaconAp* stage_beaconap = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_beaconap->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_beaconap_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = "Timeout",
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_beaconap_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_beaconap_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_beaconlist_stage_ssids_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
|
||||
app->script_stage_edit_strings_reference = &stage_beaconlist->ssids;
|
||||
app->script_stage_edit_string_count_reference = &stage_beaconlist->ssid_count;
|
||||
}
|
||||
|
||||
void wifi_marauder_beaconlist_stage_random_ssids_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageBeaconList* stage = app->script_edit_selected_stage->stage;
|
||||
char random_ssids_str[32];
|
||||
snprintf(random_ssids_str, sizeof(random_ssids_str), "%d", stage->random_ssids);
|
||||
variable_item_set_current_value_text(item, random_ssids_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_beaconlist_stage_random_ssids_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_beaconlist->random_ssids;
|
||||
}
|
||||
|
||||
void wifi_marauder_beaconlist_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageBeaconList* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_beaconlist_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageBeaconList* stage_beaconlist = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_beaconlist->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_beaconlist_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 3;
|
||||
stage_menu->items = malloc(3 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("SSIDs"),
|
||||
.type = WifiMarauderScriptMenuItemTypeListString,
|
||||
.num_options = 1,
|
||||
.select_callback = wifi_marauder_beaconlist_stage_ssids_select_callback};
|
||||
stage_menu->items[1] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Generate random"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_beaconlist_stage_random_ssids_setup_callback,
|
||||
.select_callback = wifi_marauder_beaconlist_stage_random_ssids_select_callback};
|
||||
stage_menu->items[2] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_beaconlist_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_beaconlist_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
ADD_STAGE(scan, Scan)
|
||||
ADD_STAGE(select, Select)
|
||||
ADD_STAGE(deauth, Deauth)
|
||||
ADD_STAGE(probe, Probe)
|
||||
ADD_STAGE(sniffraw, SniffRaw)
|
||||
ADD_STAGE(sniffbeacon, SniffBeacon)
|
||||
ADD_STAGE(sniffdeauth, SniffDeauth)
|
||||
ADD_STAGE(sniffesp, SniffEsp)
|
||||
ADD_STAGE(sniffpmkid, SniffPmkid)
|
||||
ADD_STAGE(sniffpwn, SniffPwn)
|
||||
ADD_STAGE(beaconlist, BeaconList)
|
||||
ADD_STAGE(beaconap, BeaconAp)
|
||||
ADD_STAGE(exec, Exec)
|
||||
ADD_STAGE(delay, Delay)
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_deauth_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageDeauth* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_deauth_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageDeauth* stage_deauth = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_deauth->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_deauth_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_deauth_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_deauth_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_delay_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageDelay* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_delay_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageDelay* stage_delay = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_delay->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_delay_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_delay_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_delay_stage_timeout_select_callback};
|
||||
}
|
30
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_exec.c
vendored
Normal file
30
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_exec.c
vendored
Normal file
|
@ -0,0 +1,30 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_exec_stage_filter_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageExec* stage = app->script_edit_selected_stage->stage;
|
||||
if(stage->command != NULL) {
|
||||
variable_item_set_current_value_text(item, stage->command);
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_exec_stage_filter_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageExec* stage_select = app->script_edit_selected_stage->stage;
|
||||
if(stage_select->command == NULL) {
|
||||
stage_select->command = malloc(128);
|
||||
}
|
||||
app->user_input_string_reference = &stage_select->command;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_exec_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Command"),
|
||||
.type = WifiMarauderScriptMenuItemTypeString,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_exec_stage_filter_setup_callback,
|
||||
.select_callback = wifi_marauder_exec_stage_filter_select_callback};
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_probe_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageProbe* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_probe_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageProbe* stage_probe = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_probe->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_probe_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_probe_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_probe_stage_timeout_select_callback};
|
||||
}
|
93
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_scan.c
vendored
Normal file
93
applications/external/wifi_marauder_companion/script/menu/wifi_marauder_script_stage_menu_scan.c
vendored
Normal file
|
@ -0,0 +1,93 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_scan_stage_type_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
|
||||
variable_item_set_current_value_index(item, stage->type);
|
||||
}
|
||||
|
||||
void wifi_marauder_scan_stage_type_change_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
|
||||
// Get menu item
|
||||
uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->var_item_list);
|
||||
const WifiMarauderScriptMenuItem* menu_item =
|
||||
&app->script_stage_menu->items[current_stage_index];
|
||||
|
||||
// Defines the text of the selected option
|
||||
uint8_t option_index = variable_item_get_current_value_index(item);
|
||||
variable_item_set_current_value_text(item, menu_item->options[option_index]);
|
||||
|
||||
// Updates the attribute value of the current stage
|
||||
WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
|
||||
stage->type = option_index;
|
||||
}
|
||||
|
||||
void wifi_marauder_scan_stage_channel_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
|
||||
if(stage->channel >= 0 && stage->channel < 12) {
|
||||
variable_item_set_current_value_index(item, stage->channel);
|
||||
} else {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_scan_stage_channel_change_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
|
||||
// Get menu item
|
||||
uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->var_item_list);
|
||||
const WifiMarauderScriptMenuItem* menu_item =
|
||||
&app->script_stage_menu->items[current_stage_index];
|
||||
|
||||
// Defines the text of the selected option
|
||||
uint8_t option_index = variable_item_get_current_value_index(item);
|
||||
variable_item_set_current_value_text(item, menu_item->options[option_index]);
|
||||
|
||||
// Updates the attribute value of the current stage
|
||||
WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
|
||||
stage->channel = option_index;
|
||||
}
|
||||
|
||||
void wifi_marauder_scan_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageScan* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_scan_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageScan* stage_scan = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_scan->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_scan_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 3;
|
||||
stage_menu->items = malloc(3 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Type"),
|
||||
.type = WifiMarauderScriptMenuItemTypeOptionsString,
|
||||
.num_options = 2,
|
||||
.options = {"ap", "station"},
|
||||
.setup_callback = wifi_marauder_scan_stage_type_setup_callback,
|
||||
.change_callback = wifi_marauder_scan_stage_type_change_callback,
|
||||
};
|
||||
stage_menu->items[1] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Channel"),
|
||||
.type = WifiMarauderScriptMenuItemTypeOptionsNumber,
|
||||
.num_options = 12,
|
||||
.options = {"none", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"},
|
||||
.setup_callback = wifi_marauder_scan_stage_channel_setup_callback,
|
||||
.change_callback = wifi_marauder_scan_stage_channel_change_callback,
|
||||
};
|
||||
stage_menu->items[2] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_scan_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_scan_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,95 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_select_stage_type_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
|
||||
variable_item_set_current_value_index(item, stage->type);
|
||||
}
|
||||
|
||||
void wifi_marauder_select_stage_type_change_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
|
||||
// Get menu item
|
||||
uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->var_item_list);
|
||||
const WifiMarauderScriptMenuItem* menu_item =
|
||||
&app->script_stage_menu->items[current_stage_index];
|
||||
|
||||
// Defines the text of the selected option
|
||||
uint8_t option_index = variable_item_get_current_value_index(item);
|
||||
variable_item_set_current_value_text(item, menu_item->options[option_index]);
|
||||
|
||||
// Updates the attribute value of the current stage
|
||||
WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
|
||||
stage->type = option_index;
|
||||
}
|
||||
|
||||
void wifi_marauder_select_stage_filter_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
|
||||
|
||||
if(stage->filter != NULL) {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
variable_item_set_current_value_text(item, stage->filter);
|
||||
} else {
|
||||
variable_item_set_current_value_index(item, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_select_stage_filter_change_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSelect* stage = app->script_edit_selected_stage->stage;
|
||||
|
||||
// Clears the filter if you change the option. Flipper input box does not accept blank text
|
||||
if(variable_item_get_current_value_index(item) == 1) {
|
||||
stage->filter = NULL;
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
variable_item_set_values_count(item, 1);
|
||||
}
|
||||
|
||||
if(stage->filter != NULL) {
|
||||
variable_item_set_current_value_text(item, stage->filter);
|
||||
} else {
|
||||
variable_item_set_current_value_text(item, "");
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_select_stage_filter_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageSelect* stage_select = app->script_edit_selected_stage->stage;
|
||||
if(stage_select->filter == NULL) {
|
||||
stage_select->filter = malloc(128);
|
||||
}
|
||||
app->user_input_string_reference = &stage_select->filter;
|
||||
}
|
||||
|
||||
void wifi_marauder_select_stage_indexes_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageSelect* stage_select = app->script_edit_selected_stage->stage;
|
||||
app->script_stage_edit_numbers_reference = &stage_select->indexes;
|
||||
app->script_stage_edit_number_count_reference = &stage_select->index_count;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_select_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 3;
|
||||
stage_menu->items = malloc(3 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Type"),
|
||||
.type = WifiMarauderScriptMenuItemTypeOptionsString,
|
||||
.num_options = 2,
|
||||
.options = {"ap", "station"},
|
||||
.setup_callback = wifi_marauder_select_stage_type_setup_callback,
|
||||
.change_callback = wifi_marauder_select_stage_type_change_callback};
|
||||
stage_menu->items[1] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Filter"),
|
||||
.type = WifiMarauderScriptMenuItemTypeString,
|
||||
.num_options = 2,
|
||||
.setup_callback = wifi_marauder_select_stage_filter_setup_callback,
|
||||
.change_callback = wifi_marauder_select_stage_filter_change_callback,
|
||||
.select_callback = wifi_marauder_select_stage_filter_select_callback};
|
||||
stage_menu->items[2] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Indexes"),
|
||||
.type = WifiMarauderScriptMenuItemTypeListNumber,
|
||||
.num_options = 1,
|
||||
.select_callback = wifi_marauder_select_stage_indexes_select_callback};
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_sniffbeacon_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSniffBeacon* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_sniffbeacon_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageSniffBeacon* stage_sniffbeacon = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_sniffbeacon->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_sniffbeacon_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_sniffbeacon_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_sniffbeacon_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_sniffdeauth_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSniffDeauth* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_sniffdeauth_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageSniffDeauth* stage_sniffdeauth = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_sniffdeauth->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_sniffdeauth_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_sniffdeauth_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_sniffdeauth_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_sniffesp_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSniffEsp* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_sniffesp_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageSniffEsp* stage_sniffesp = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_sniffesp->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_sniffesp_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_sniffesp_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_sniffesp_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,91 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
static void wifi_marauder_sniffpmkid_stage_force_deauth_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
|
||||
variable_item_set_current_value_index(item, stage->force_deauth);
|
||||
}
|
||||
|
||||
static void wifi_marauder_sniffpmkid_stage_force_deauth_change_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
|
||||
// Get menu item
|
||||
uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->var_item_list);
|
||||
const WifiMarauderScriptMenuItem* menu_item =
|
||||
&app->script_stage_menu->items[current_stage_index];
|
||||
|
||||
// Defines the text of the selected option
|
||||
uint8_t option_index = variable_item_get_current_value_index(item);
|
||||
variable_item_set_current_value_text(item, menu_item->options[option_index]);
|
||||
|
||||
// Updates the attribute value of the current stage
|
||||
WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
|
||||
stage->force_deauth = option_index;
|
||||
}
|
||||
|
||||
static void wifi_marauder_sniffpmkid_stage_channel_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
|
||||
if(stage->channel >= 0 && stage->channel < 12) {
|
||||
variable_item_set_current_value_index(item, stage->channel);
|
||||
} else {
|
||||
variable_item_set_current_value_index(item, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void wifi_marauder_sniffpmkid_stage_channel_change_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
|
||||
// Get menu item
|
||||
uint8_t current_stage_index = variable_item_list_get_selected_item_index(app->var_item_list);
|
||||
const WifiMarauderScriptMenuItem* menu_item =
|
||||
&app->script_stage_menu->items[current_stage_index];
|
||||
|
||||
// Defines the text of the selected option
|
||||
uint8_t option_index = variable_item_get_current_value_index(item);
|
||||
variable_item_set_current_value_text(item, menu_item->options[option_index]);
|
||||
|
||||
// Updates the attribute value of the current stage
|
||||
WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
|
||||
stage->channel = option_index;
|
||||
}
|
||||
|
||||
static void wifi_marauder_sniffpmkid_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSniffPmkid* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
static void wifi_marauder_sniffpmkid_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageSniffPmkid* stage_sniffpmkid = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_sniffpmkid->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_sniffpmkid_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 3;
|
||||
stage_menu->items = malloc(3 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Force deauth"),
|
||||
.type = WifiMarauderScriptMenuItemTypeOptionsString,
|
||||
.num_options = 2,
|
||||
.options = {"no", "yes"},
|
||||
.setup_callback = wifi_marauder_sniffpmkid_stage_force_deauth_setup_callback,
|
||||
.change_callback = wifi_marauder_sniffpmkid_stage_force_deauth_change_callback};
|
||||
stage_menu->items[1] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Channel"),
|
||||
.type = WifiMarauderScriptMenuItemTypeOptionsNumber,
|
||||
.num_options = 12,
|
||||
.options = {"none", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"},
|
||||
.setup_callback = wifi_marauder_sniffpmkid_stage_channel_setup_callback,
|
||||
.change_callback = wifi_marauder_sniffpmkid_stage_channel_change_callback};
|
||||
stage_menu->items[2] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_sniffpmkid_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_sniffpmkid_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_sniffpwn_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSniffPwn* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_sniffpwn_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageSniffPwn* stage_sniffpwn = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_sniffpwn->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_sniffpwn_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_sniffpwn_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_sniffpwn_stage_timeout_select_callback};
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
#include "../../wifi_marauder_app_i.h"
|
||||
|
||||
void wifi_marauder_sniffraw_stage_timeout_setup_callback(VariableItem* item) {
|
||||
WifiMarauderApp* app = variable_item_get_context(item);
|
||||
WifiMarauderScriptStageSniffRaw* stage = app->script_edit_selected_stage->stage;
|
||||
char timeout_str[32];
|
||||
snprintf(timeout_str, sizeof(timeout_str), "%d", stage->timeout);
|
||||
variable_item_set_current_value_text(item, timeout_str);
|
||||
}
|
||||
|
||||
void wifi_marauder_sniffraw_stage_timeout_select_callback(void* context) {
|
||||
WifiMarauderApp* app = context;
|
||||
WifiMarauderScriptStageSniffRaw* stage_sniffraw = app->script_edit_selected_stage->stage;
|
||||
app->user_input_number_reference = &stage_sniffraw->timeout;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_stage_menu_sniffraw_load(WifiMarauderScriptStageMenu* stage_menu) {
|
||||
stage_menu->num_items = 1;
|
||||
stage_menu->items = malloc(1 * sizeof(WifiMarauderScriptMenuItem));
|
||||
|
||||
stage_menu->items[0] = (WifiMarauderScriptMenuItem){
|
||||
.name = strdup("Timeout"),
|
||||
.type = WifiMarauderScriptMenuItemTypeNumber,
|
||||
.num_options = 1,
|
||||
.setup_callback = wifi_marauder_sniffraw_stage_timeout_setup_callback,
|
||||
.select_callback = wifi_marauder_sniffraw_stage_timeout_select_callback};
|
||||
}
|
947
applications/external/wifi_marauder_companion/script/wifi_marauder_script.c
vendored
Normal file
947
applications/external/wifi_marauder_companion/script/wifi_marauder_script.c
vendored
Normal file
|
@ -0,0 +1,947 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
#include "wifi_marauder_script.h"
|
||||
|
||||
WifiMarauderScript* wifi_marauder_script_alloc() {
|
||||
WifiMarauderScript* script = (WifiMarauderScript*)malloc(sizeof(WifiMarauderScript));
|
||||
if(script == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
script->name = NULL;
|
||||
script->description = NULL;
|
||||
script->first_stage = NULL;
|
||||
script->last_stage = NULL;
|
||||
script->enable_led = WifiMarauderScriptBooleanUndefined;
|
||||
script->save_pcap = WifiMarauderScriptBooleanUndefined;
|
||||
script->repeat = 1;
|
||||
return script;
|
||||
}
|
||||
|
||||
WifiMarauderScript* wifi_marauder_script_create(const char* script_name) {
|
||||
WifiMarauderScript* script = wifi_marauder_script_alloc();
|
||||
script->name = strdup(script_name);
|
||||
return script;
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_load_meta(WifiMarauderScript* script, cJSON* meta_section) {
|
||||
if(meta_section != NULL) {
|
||||
// Script description
|
||||
cJSON* description = cJSON_GetObjectItem(meta_section, "description");
|
||||
if(description != NULL) {
|
||||
script->description = strdup(description->valuestring);
|
||||
}
|
||||
// Enable LED
|
||||
cJSON* enable_led_json = cJSON_GetObjectItem(meta_section, "enableLed");
|
||||
if(cJSON_IsBool(enable_led_json)) {
|
||||
script->enable_led = enable_led_json->valueint;
|
||||
}
|
||||
// Save PCAP
|
||||
cJSON* save_pcap_json = cJSON_GetObjectItem(meta_section, "savePcap");
|
||||
if(cJSON_IsBool(save_pcap_json)) {
|
||||
script->save_pcap = save_pcap_json->valueint;
|
||||
}
|
||||
// Times the script will be repeated
|
||||
cJSON* repeat = cJSON_GetObjectItem(meta_section, "repeat");
|
||||
if(repeat != NULL) {
|
||||
script->repeat = repeat->valueint;
|
||||
}
|
||||
}
|
||||
if(script->description == NULL) {
|
||||
script->description = strdup("My script");
|
||||
}
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageScan* _wifi_marauder_script_get_stage_scan(cJSON* stages) {
|
||||
cJSON* stage_scan = cJSON_GetObjectItem(stages, "scan");
|
||||
if(stage_scan == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
cJSON* type = cJSON_GetObjectItem(stage_scan, "type");
|
||||
if(type == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
WifiMarauderScriptScanType scan_type;
|
||||
if(strcmp(type->valuestring, "ap") == 0) {
|
||||
scan_type = WifiMarauderScriptScanTypeAp;
|
||||
} else if(strcmp(type->valuestring, "station") == 0) {
|
||||
scan_type = WifiMarauderScriptScanTypeStation;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
cJSON* channel = cJSON_GetObjectItem(stage_scan, "channel");
|
||||
int scan_channel = channel != NULL ? (int)cJSON_GetNumberValue(channel) : 0;
|
||||
cJSON* timeout = cJSON_GetObjectItem(stage_scan, "timeout");
|
||||
int scan_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN;
|
||||
|
||||
WifiMarauderScriptStageScan* scan_stage =
|
||||
(WifiMarauderScriptStageScan*)malloc(sizeof(WifiMarauderScriptStageScan));
|
||||
scan_stage->type = scan_type;
|
||||
scan_stage->channel = scan_channel;
|
||||
scan_stage->timeout = scan_timeout;
|
||||
|
||||
return scan_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageSelect* _wifi_marauder_script_get_stage_select(cJSON* stages) {
|
||||
cJSON* select_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "select");
|
||||
if(select_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* type_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "type");
|
||||
cJSON* filter_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "filter");
|
||||
cJSON* indexes_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "indexes");
|
||||
cJSON* allow_repeat_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "allow_repeat");
|
||||
|
||||
if(!cJSON_IsString(type_json)) {
|
||||
return NULL;
|
||||
}
|
||||
WifiMarauderScriptSelectType select_type;
|
||||
if(strcmp(type_json->valuestring, "ap") == 0) {
|
||||
select_type = WifiMarauderScriptSelectTypeAp;
|
||||
} else if(strcmp(type_json->valuestring, "station") == 0) {
|
||||
select_type = WifiMarauderScriptSelectTypeStation;
|
||||
} else if(strcmp(type_json->valuestring, "ssid") == 0) {
|
||||
select_type = WifiMarauderScriptSelectTypeSsid;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
char* filter_str = cJSON_IsString(filter_json) ? strdup(filter_json->valuestring) : NULL;
|
||||
|
||||
WifiMarauderScriptStageSelect* stage_select =
|
||||
(WifiMarauderScriptStageSelect*)malloc(sizeof(WifiMarauderScriptStageSelect));
|
||||
stage_select->type = select_type;
|
||||
stage_select->allow_repeat = cJSON_IsBool(allow_repeat_json) ? allow_repeat_json->valueint :
|
||||
true;
|
||||
stage_select->filter = filter_str;
|
||||
|
||||
if(cJSON_IsArray(indexes_json)) {
|
||||
int indexes_size = cJSON_GetArraySize(indexes_json);
|
||||
int* indexes = (int*)malloc(indexes_size * sizeof(int));
|
||||
for(int i = 0; i < indexes_size; i++) {
|
||||
cJSON* index_item = cJSON_GetArrayItem(indexes_json, i);
|
||||
if(cJSON_IsNumber(index_item)) {
|
||||
indexes[i] = index_item->valueint;
|
||||
}
|
||||
}
|
||||
stage_select->indexes = indexes;
|
||||
stage_select->index_count = indexes_size;
|
||||
} else {
|
||||
stage_select->indexes = NULL;
|
||||
stage_select->index_count = 0;
|
||||
}
|
||||
|
||||
return stage_select;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageDeauth* _wifi_marauder_script_get_stage_deauth(cJSON* stages) {
|
||||
cJSON* deauth_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "deauth");
|
||||
if(deauth_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout = cJSON_GetObjectItem(deauth_stage_json, "timeout");
|
||||
int deauth_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH;
|
||||
|
||||
WifiMarauderScriptStageDeauth* deauth_stage =
|
||||
(WifiMarauderScriptStageDeauth*)malloc(sizeof(WifiMarauderScriptStageDeauth));
|
||||
deauth_stage->timeout = deauth_timeout;
|
||||
|
||||
return deauth_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageProbe* _wifi_marauder_script_get_stage_probe(cJSON* stages) {
|
||||
cJSON* probe_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "probe");
|
||||
if(probe_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout = cJSON_GetObjectItem(probe_stage_json, "timeout");
|
||||
int probe_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_PROBE;
|
||||
|
||||
WifiMarauderScriptStageProbe* probe_stage =
|
||||
(WifiMarauderScriptStageProbe*)malloc(sizeof(WifiMarauderScriptStageProbe));
|
||||
probe_stage->timeout = probe_timeout;
|
||||
|
||||
return probe_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageSniffRaw* _wifi_marauder_script_get_stage_sniff_raw(cJSON* stages) {
|
||||
cJSON* sniffraw_stage_json = cJSON_GetObjectItem(stages, "sniffraw");
|
||||
if(sniffraw_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout_json = cJSON_GetObjectItem(sniffraw_stage_json, "timeout");
|
||||
int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
WifiMarauderScriptStageSniffRaw* sniff_raw_stage =
|
||||
(WifiMarauderScriptStageSniffRaw*)malloc(sizeof(WifiMarauderScriptStageSniffRaw));
|
||||
sniff_raw_stage->timeout = timeout;
|
||||
|
||||
return sniff_raw_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageSniffBeacon* _wifi_marauder_script_get_stage_sniff_beacon(cJSON* stages) {
|
||||
cJSON* sniffbeacon_stage_json = cJSON_GetObjectItem(stages, "sniffbeacon");
|
||||
if(sniffbeacon_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout_json = cJSON_GetObjectItem(sniffbeacon_stage_json, "timeout");
|
||||
int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
WifiMarauderScriptStageSniffBeacon* sniff_beacon_stage =
|
||||
(WifiMarauderScriptStageSniffBeacon*)malloc(sizeof(WifiMarauderScriptStageSniffBeacon));
|
||||
sniff_beacon_stage->timeout = timeout;
|
||||
|
||||
return sniff_beacon_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageSniffDeauth* _wifi_marauder_script_get_stage_sniff_deauth(cJSON* stages) {
|
||||
cJSON* sniffdeauth_stage_json = cJSON_GetObjectItem(stages, "sniffdeauth");
|
||||
if(sniffdeauth_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout_json = cJSON_GetObjectItem(sniffdeauth_stage_json, "timeout");
|
||||
int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
WifiMarauderScriptStageSniffDeauth* sniff_deauth_stage =
|
||||
(WifiMarauderScriptStageSniffDeauth*)malloc(sizeof(WifiMarauderScriptStageSniffDeauth));
|
||||
sniff_deauth_stage->timeout = timeout;
|
||||
|
||||
return sniff_deauth_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageSniffEsp* _wifi_marauder_script_get_stage_sniff_esp(cJSON* stages) {
|
||||
cJSON* sniffesp_stage_json = cJSON_GetObjectItem(stages, "sniffesp");
|
||||
if(sniffesp_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout_json = cJSON_GetObjectItem(sniffesp_stage_json, "timeout");
|
||||
int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
WifiMarauderScriptStageSniffEsp* sniff_esp_stage =
|
||||
(WifiMarauderScriptStageSniffEsp*)malloc(sizeof(WifiMarauderScriptStageSniffEsp));
|
||||
sniff_esp_stage->timeout = timeout;
|
||||
|
||||
return sniff_esp_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageSniffPmkid* _wifi_marauder_script_get_stage_sniff_pmkid(cJSON* stages) {
|
||||
cJSON* sniffpmkid_stage_json = cJSON_GetObjectItem(stages, "sniffpmkid");
|
||||
if(sniffpmkid_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* channel_json = cJSON_GetObjectItem(sniffpmkid_stage_json, "channel");
|
||||
int channel = channel_json != NULL ? (int)cJSON_GetNumberValue(channel_json) : 0;
|
||||
cJSON* timeout_json = cJSON_GetObjectItem(sniffpmkid_stage_json, "timeout");
|
||||
int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
cJSON* force_deauth_json =
|
||||
cJSON_GetObjectItemCaseSensitive(sniffpmkid_stage_json, "forceDeauth");
|
||||
bool force_deauth = cJSON_IsBool(force_deauth_json) ? force_deauth_json->valueint : true;
|
||||
|
||||
WifiMarauderScriptStageSniffPmkid* sniff_pmkid_stage =
|
||||
(WifiMarauderScriptStageSniffPmkid*)malloc(sizeof(WifiMarauderScriptStageSniffPmkid));
|
||||
sniff_pmkid_stage->channel = channel;
|
||||
sniff_pmkid_stage->timeout = timeout;
|
||||
sniff_pmkid_stage->force_deauth = force_deauth;
|
||||
|
||||
return sniff_pmkid_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageSniffPwn* _wifi_marauder_script_get_stage_sniff_pwn(cJSON* stages) {
|
||||
cJSON* sniffpwn_stage_json = cJSON_GetObjectItem(stages, "sniffpwn");
|
||||
if(sniffpwn_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout_json = cJSON_GetObjectItem(sniffpwn_stage_json, "timeout");
|
||||
int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
|
||||
|
||||
WifiMarauderScriptStageSniffPwn* sniff_pwn_stage =
|
||||
(WifiMarauderScriptStageSniffPwn*)malloc(sizeof(WifiMarauderScriptStageSniffPwn));
|
||||
sniff_pwn_stage->timeout = timeout;
|
||||
|
||||
return sniff_pwn_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageBeaconList* _wifi_marauder_script_get_stage_beacon_list(cJSON* stages) {
|
||||
cJSON* stage_beaconlist = cJSON_GetObjectItem(stages, "beaconList");
|
||||
if(stage_beaconlist == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
WifiMarauderScriptStageBeaconList* beaconlist_stage =
|
||||
(WifiMarauderScriptStageBeaconList*)malloc(sizeof(WifiMarauderScriptStageBeaconList));
|
||||
if(beaconlist_stage == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
cJSON* ssids = cJSON_GetObjectItem(stage_beaconlist, "ssids");
|
||||
if(ssids == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
// SSID count
|
||||
int ssid_count = cJSON_GetArraySize(ssids);
|
||||
if(ssid_count == 0) {
|
||||
return NULL;
|
||||
}
|
||||
beaconlist_stage->ssid_count = ssid_count;
|
||||
// SSIDs
|
||||
beaconlist_stage->ssids = (char**)malloc(sizeof(char*) * ssid_count);
|
||||
if(beaconlist_stage->ssids == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
for(int i = 0; i < ssid_count; i++) {
|
||||
cJSON* ssid = cJSON_GetArrayItem(ssids, i);
|
||||
if(ssid == NULL) {
|
||||
continue;
|
||||
}
|
||||
char* ssid_string = cJSON_GetStringValue(ssid);
|
||||
if(ssid_string == NULL) {
|
||||
continue;
|
||||
}
|
||||
beaconlist_stage->ssids[i] = (char*)malloc(sizeof(char) * (strlen(ssid_string) + 1));
|
||||
strcpy(beaconlist_stage->ssids[i], ssid_string);
|
||||
}
|
||||
// Timeout
|
||||
cJSON* timeout = cJSON_GetObjectItem(stage_beaconlist, "timeout");
|
||||
beaconlist_stage->timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
|
||||
// Random SSIDs
|
||||
cJSON* random_ssids = cJSON_GetObjectItem(stage_beaconlist, "generate");
|
||||
beaconlist_stage->random_ssids =
|
||||
random_ssids != NULL ? (int)cJSON_GetNumberValue(random_ssids) : 0;
|
||||
|
||||
return beaconlist_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageBeaconAp* _wifi_marauder_script_get_stage_beacon_ap(cJSON* stages) {
|
||||
cJSON* beaconap_stage_json = cJSON_GetObjectItem(stages, "beaconAp");
|
||||
if(beaconap_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout_json = cJSON_GetObjectItem(beaconap_stage_json, "timeout");
|
||||
int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
|
||||
WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
|
||||
|
||||
WifiMarauderScriptStageBeaconAp* beacon_ap_stage =
|
||||
(WifiMarauderScriptStageBeaconAp*)malloc(sizeof(WifiMarauderScriptStageBeaconAp));
|
||||
beacon_ap_stage->timeout = timeout;
|
||||
|
||||
return beacon_ap_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageExec* _wifi_marauder_script_get_stage_exec(cJSON* stages) {
|
||||
cJSON* exec_stage_json = cJSON_GetObjectItem(stages, "exec");
|
||||
if(exec_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* command_json = cJSON_GetObjectItemCaseSensitive(exec_stage_json, "command");
|
||||
char* command_str = cJSON_IsString(command_json) ? strdup(command_json->valuestring) : NULL;
|
||||
|
||||
WifiMarauderScriptStageExec* exec_stage =
|
||||
(WifiMarauderScriptStageExec*)malloc(sizeof(WifiMarauderScriptStageExec));
|
||||
exec_stage->command = command_str;
|
||||
|
||||
return exec_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStageDelay* _wifi_marauder_script_get_stage_delay(cJSON* stages) {
|
||||
cJSON* delay_stage_json = cJSON_GetObjectItem(stages, "delay");
|
||||
if(delay_stage_json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
cJSON* timeout_json = cJSON_GetObjectItem(delay_stage_json, "timeout");
|
||||
int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : 0;
|
||||
|
||||
WifiMarauderScriptStageDelay* delay_stage =
|
||||
(WifiMarauderScriptStageDelay*)malloc(sizeof(WifiMarauderScriptStageDelay));
|
||||
delay_stage->timeout = timeout;
|
||||
|
||||
return delay_stage;
|
||||
}
|
||||
|
||||
WifiMarauderScriptStage*
|
||||
_wifi_marauder_script_create_stage(WifiMarauderScriptStageType type, void* stage_data) {
|
||||
WifiMarauderScriptStage* stage =
|
||||
(WifiMarauderScriptStage*)malloc(sizeof(WifiMarauderScriptStage));
|
||||
stage->type = type;
|
||||
stage->stage = stage_data;
|
||||
stage->next_stage = NULL;
|
||||
return stage;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_add_stage(
|
||||
WifiMarauderScript* script,
|
||||
WifiMarauderScriptStageType stage_type,
|
||||
void* stage_data) {
|
||||
if(script == NULL || stage_data == NULL) {
|
||||
return;
|
||||
}
|
||||
WifiMarauderScriptStage* stage = _wifi_marauder_script_create_stage(stage_type, stage_data);
|
||||
if(script->last_stage != NULL) {
|
||||
script->last_stage->next_stage = stage;
|
||||
} else {
|
||||
script->first_stage = stage;
|
||||
}
|
||||
script->last_stage = stage;
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_load_stages(WifiMarauderScript* script, cJSON* stages) {
|
||||
// Scan stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script, WifiMarauderScriptStageTypeScan, _wifi_marauder_script_get_stage_scan(stages));
|
||||
// Select stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script, WifiMarauderScriptStageTypeSelect, _wifi_marauder_script_get_stage_select(stages));
|
||||
// Deauth stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script, WifiMarauderScriptStageTypeDeauth, _wifi_marauder_script_get_stage_deauth(stages));
|
||||
// Probe stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script, WifiMarauderScriptStageTypeProbe, _wifi_marauder_script_get_stage_probe(stages));
|
||||
// Sniff raw stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script,
|
||||
WifiMarauderScriptStageTypeSniffRaw,
|
||||
_wifi_marauder_script_get_stage_sniff_raw(stages));
|
||||
// Sniff beacon stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script,
|
||||
WifiMarauderScriptStageTypeSniffBeacon,
|
||||
_wifi_marauder_script_get_stage_sniff_beacon(stages));
|
||||
// Sniff deauth stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script,
|
||||
WifiMarauderScriptStageTypeSniffDeauth,
|
||||
_wifi_marauder_script_get_stage_sniff_deauth(stages));
|
||||
// Sniff esp stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script,
|
||||
WifiMarauderScriptStageTypeSniffEsp,
|
||||
_wifi_marauder_script_get_stage_sniff_esp(stages));
|
||||
// Sniff PMKID stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script,
|
||||
WifiMarauderScriptStageTypeSniffPmkid,
|
||||
_wifi_marauder_script_get_stage_sniff_pmkid(stages));
|
||||
// Sniff pwn stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script,
|
||||
WifiMarauderScriptStageTypeSniffPwn,
|
||||
_wifi_marauder_script_get_stage_sniff_pwn(stages));
|
||||
// Beacon List stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script,
|
||||
WifiMarauderScriptStageTypeBeaconList,
|
||||
_wifi_marauder_script_get_stage_beacon_list(stages));
|
||||
// Beacon Ap stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script,
|
||||
WifiMarauderScriptStageTypeBeaconAp,
|
||||
_wifi_marauder_script_get_stage_beacon_ap(stages));
|
||||
// Exec stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script, WifiMarauderScriptStageTypeExec, _wifi_marauder_script_get_stage_exec(stages));
|
||||
// Delay stage
|
||||
wifi_marauder_script_add_stage(
|
||||
script, WifiMarauderScriptStageTypeDelay, _wifi_marauder_script_get_stage_delay(stages));
|
||||
}
|
||||
|
||||
WifiMarauderScript* wifi_marauder_script_parse_raw(const char* json_raw) {
|
||||
WifiMarauderScript* script = wifi_marauder_script_alloc();
|
||||
if(script == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
cJSON* json = cJSON_Parse(json_raw);
|
||||
if(json == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
cJSON* meta = cJSON_GetObjectItem(json, "meta");
|
||||
_wifi_marauder_script_load_meta(script, meta);
|
||||
|
||||
cJSON* stages = cJSON_GetObjectItem(json, "stages");
|
||||
if(cJSON_IsArray(stages)) {
|
||||
cJSON* stage_item = NULL;
|
||||
cJSON_ArrayForEach(stage_item, stages) {
|
||||
_wifi_marauder_script_load_stages(script, stage_item);
|
||||
}
|
||||
} else {
|
||||
_wifi_marauder_script_load_stages(script, stages);
|
||||
}
|
||||
|
||||
return script;
|
||||
}
|
||||
|
||||
WifiMarauderScript* wifi_marauder_script_parse_json(Storage* storage, const char* file_path) {
|
||||
WifiMarauderScript* script = NULL;
|
||||
File* script_file = storage_file_alloc(storage);
|
||||
FuriString* script_name = furi_string_alloc();
|
||||
path_extract_filename_no_ext(file_path, script_name);
|
||||
|
||||
if(storage_file_open(script_file, file_path, FSAM_READ, FSOM_OPEN_EXISTING)) {
|
||||
uint32_t file_size = storage_file_size(script_file);
|
||||
char* json_buffer = (char*)malloc(file_size + 1);
|
||||
uint16_t bytes_read = storage_file_read(script_file, json_buffer, file_size);
|
||||
json_buffer[bytes_read] = '\0';
|
||||
|
||||
script = wifi_marauder_script_parse_raw(json_buffer);
|
||||
}
|
||||
if(script == NULL) {
|
||||
script = wifi_marauder_script_create(furi_string_get_cstr(script_name));
|
||||
}
|
||||
script->name = strdup(furi_string_get_cstr(script_name));
|
||||
|
||||
furi_string_free(script_name);
|
||||
storage_file_close(script_file);
|
||||
storage_file_free(script_file);
|
||||
return script;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_meta(WifiMarauderScript* script) {
|
||||
cJSON* meta_json = cJSON_CreateObject();
|
||||
if(script->description != NULL) {
|
||||
cJSON_AddStringToObject(meta_json, "description", script->description);
|
||||
} else {
|
||||
cJSON_AddStringToObject(meta_json, "description", "My Script");
|
||||
}
|
||||
if(script->enable_led != WifiMarauderScriptBooleanUndefined) {
|
||||
cJSON_AddBoolToObject(
|
||||
meta_json, "enableLed", (script->enable_led == WifiMarauderScriptBooleanTrue));
|
||||
}
|
||||
if(script->save_pcap != WifiMarauderScriptBooleanUndefined) {
|
||||
cJSON_AddBoolToObject(
|
||||
meta_json, "savePcap", (script->save_pcap == WifiMarauderScriptBooleanTrue));
|
||||
}
|
||||
cJSON_AddNumberToObject(meta_json, "repeat", script->repeat);
|
||||
return meta_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_scan(WifiMarauderScriptStageScan* scan_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "scan", cJSON_CreateObject());
|
||||
cJSON* scan_json = cJSON_GetObjectItem(stage_json, "scan");
|
||||
// Scan type
|
||||
cJSON_AddStringToObject(
|
||||
scan_json, "type", scan_stage->type == WifiMarauderScriptScanTypeAp ? "ap" : "station");
|
||||
// Channel
|
||||
if(scan_stage->channel > 0) {
|
||||
cJSON_AddNumberToObject(scan_json, "channel", scan_stage->channel);
|
||||
}
|
||||
// Timeout
|
||||
if(scan_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(scan_json, "timeout", scan_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_select(WifiMarauderScriptStageSelect* select_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "select", cJSON_CreateObject());
|
||||
cJSON* select_json = cJSON_GetObjectItem(stage_json, "select");
|
||||
// Select type
|
||||
cJSON_AddStringToObject(
|
||||
select_json,
|
||||
"type",
|
||||
select_stage->type == WifiMarauderScriptSelectTypeAp ? "ap" :
|
||||
select_stage->type == WifiMarauderScriptSelectTypeStation ? "station" :
|
||||
"ssid");
|
||||
if(select_stage->filter != NULL) {
|
||||
cJSON_AddStringToObject(select_json, "filter", select_stage->filter);
|
||||
}
|
||||
// Indexes
|
||||
if(select_stage->indexes != NULL && select_stage->index_count > 0) {
|
||||
cJSON* indexes_json = cJSON_CreateArray();
|
||||
for(int i = 0; i < select_stage->index_count; i++) {
|
||||
cJSON_AddItemToArray(indexes_json, cJSON_CreateNumber(select_stage->indexes[i]));
|
||||
}
|
||||
cJSON_AddItemToObject(select_json, "indexes", indexes_json);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_deauth(WifiMarauderScriptStageDeauth* deauth_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "deauth", cJSON_CreateObject());
|
||||
cJSON* deauth_json = cJSON_GetObjectItem(stage_json, "deauth");
|
||||
// Timeout
|
||||
if(deauth_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(deauth_json, "timeout", deauth_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_probe(WifiMarauderScriptStageProbe* probe_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "probe", cJSON_CreateObject());
|
||||
cJSON* probe_json = cJSON_GetObjectItem(stage_json, "probe");
|
||||
// Timeout
|
||||
if(probe_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(probe_json, "timeout", probe_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON*
|
||||
_wifi_marauder_script_create_json_sniffraw(WifiMarauderScriptStageSniffRaw* sniffraw_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "sniffRaw", cJSON_CreateObject());
|
||||
cJSON* sniffraw_json = cJSON_GetObjectItem(stage_json, "sniffRaw");
|
||||
// Timeout
|
||||
if(sniffraw_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(sniffraw_json, "timeout", sniffraw_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_sniffbeacon(
|
||||
WifiMarauderScriptStageSniffBeacon* sniffbeacon_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "sniffBeacon", cJSON_CreateObject());
|
||||
cJSON* sniffbeacon_json = cJSON_GetObjectItem(stage_json, "sniffBeacon");
|
||||
// Timeout
|
||||
if(sniffbeacon_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(sniffbeacon_json, "timeout", sniffbeacon_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_sniffdeauth(
|
||||
WifiMarauderScriptStageSniffDeauth* sniffdeauth_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "sniffDeauth", cJSON_CreateObject());
|
||||
cJSON* sniffdeauth_json = cJSON_GetObjectItem(stage_json, "sniffDeauth");
|
||||
// Timeout
|
||||
if(sniffdeauth_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(sniffdeauth_json, "timeout", sniffdeauth_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON*
|
||||
_wifi_marauder_script_create_json_sniffesp(WifiMarauderScriptStageSniffEsp* sniffesp_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "sniffEsp", cJSON_CreateObject());
|
||||
cJSON* sniffesp_json = cJSON_GetObjectItem(stage_json, "sniffEsp");
|
||||
// Timeout
|
||||
if(sniffesp_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(sniffesp_json, "timeout", sniffesp_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_sniffpmkid(
|
||||
WifiMarauderScriptStageSniffPmkid* sniffpmkid_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "sniffPmkid", cJSON_CreateObject());
|
||||
cJSON* sniffpmkid_json = cJSON_GetObjectItem(stage_json, "sniffPmkid");
|
||||
// Force deauth
|
||||
cJSON_AddBoolToObject(sniffpmkid_json, "forceDeauth", sniffpmkid_stage->force_deauth);
|
||||
// Channel
|
||||
if(sniffpmkid_stage->channel > 0) {
|
||||
cJSON_AddNumberToObject(sniffpmkid_json, "channel", sniffpmkid_stage->channel);
|
||||
}
|
||||
// Timeout
|
||||
if(sniffpmkid_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(sniffpmkid_json, "timeout", sniffpmkid_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON*
|
||||
_wifi_marauder_script_create_json_sniffpwn(WifiMarauderScriptStageSniffPwn* sniffpwn_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "sniffPwn", cJSON_CreateObject());
|
||||
cJSON* sniffpwn_json = cJSON_GetObjectItem(stage_json, "sniffPwn");
|
||||
// Timeout
|
||||
if(sniffpwn_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(sniffpwn_json, "timeout", sniffpwn_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_beaconlist(
|
||||
WifiMarauderScriptStageBeaconList* beaconlist_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "beaconList", cJSON_CreateObject());
|
||||
cJSON* beaconlist_json = cJSON_GetObjectItem(stage_json, "beaconList");
|
||||
// SSIDs
|
||||
if(beaconlist_stage->ssids != NULL) {
|
||||
cJSON* ssids_json = cJSON_CreateStringArray(
|
||||
(const char**)beaconlist_stage->ssids, beaconlist_stage->ssid_count);
|
||||
cJSON_AddItemToObject(beaconlist_json, "ssids", ssids_json);
|
||||
}
|
||||
// Random SSIDs
|
||||
if(beaconlist_stage->random_ssids > 0) {
|
||||
cJSON_AddNumberToObject(beaconlist_json, "generate", beaconlist_stage->random_ssids);
|
||||
}
|
||||
// Timeout
|
||||
if(beaconlist_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(beaconlist_json, "timeout", beaconlist_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON*
|
||||
_wifi_marauder_script_create_json_beaconap(WifiMarauderScriptStageBeaconAp* beaconap_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "beaconAp", cJSON_CreateObject());
|
||||
cJSON* beaconap_json = cJSON_GetObjectItem(stage_json, "beaconAp");
|
||||
// Timeout
|
||||
if(beaconap_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(beaconap_json, "timeout", beaconap_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_exec(WifiMarauderScriptStageExec* exec_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "exec", cJSON_CreateObject());
|
||||
cJSON* exec_json = cJSON_GetObjectItem(stage_json, "exec");
|
||||
// Command
|
||||
cJSON_AddStringToObject(
|
||||
exec_json, "command", exec_stage->command != NULL ? exec_stage->command : "");
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
cJSON* _wifi_marauder_script_create_json_delay(WifiMarauderScriptStageDelay* delay_stage) {
|
||||
cJSON* stage_json = cJSON_CreateObject();
|
||||
cJSON_AddItemToObject(stage_json, "delay", cJSON_CreateObject());
|
||||
cJSON* delay_json = cJSON_GetObjectItem(stage_json, "delay");
|
||||
// Timeout
|
||||
if(delay_stage->timeout > 0) {
|
||||
cJSON_AddNumberToObject(delay_json, "timeout", delay_stage->timeout);
|
||||
}
|
||||
return stage_json;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_save_json(
|
||||
Storage* storage,
|
||||
const char* file_path,
|
||||
WifiMarauderScript* script) {
|
||||
File* script_file = storage_file_alloc(storage);
|
||||
|
||||
if(storage_file_open(script_file, file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
|
||||
cJSON* root_json = cJSON_CreateObject();
|
||||
|
||||
// Meta info
|
||||
cJSON* meta_json = _wifi_marauder_script_create_json_meta(script);
|
||||
cJSON_AddItemToObject(root_json, "meta", meta_json);
|
||||
|
||||
// Create array for stages
|
||||
cJSON* stages_array = cJSON_CreateArray();
|
||||
cJSON_AddItemToObject(root_json, "stages", stages_array);
|
||||
|
||||
// Iterate over each stage and create the corresponding JSON object
|
||||
WifiMarauderScriptStage* stage = script->first_stage;
|
||||
while(stage != NULL) {
|
||||
cJSON* stage_json = NULL;
|
||||
|
||||
switch(stage->type) {
|
||||
case WifiMarauderScriptStageTypeScan: {
|
||||
WifiMarauderScriptStageScan* scan_stage =
|
||||
(WifiMarauderScriptStageScan*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_scan(scan_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeSelect: {
|
||||
WifiMarauderScriptStageSelect* select_stage =
|
||||
(WifiMarauderScriptStageSelect*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_select(select_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeDeauth: {
|
||||
WifiMarauderScriptStageDeauth* deauth_stage =
|
||||
(WifiMarauderScriptStageDeauth*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_deauth(deauth_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeProbe: {
|
||||
WifiMarauderScriptStageProbe* probe_stage =
|
||||
(WifiMarauderScriptStageProbe*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_probe(probe_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeSniffRaw: {
|
||||
WifiMarauderScriptStageSniffRaw* sniffraw_stage =
|
||||
(WifiMarauderScriptStageSniffRaw*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_sniffraw(sniffraw_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeSniffBeacon: {
|
||||
WifiMarauderScriptStageSniffBeacon* sniffbeacon_stage =
|
||||
(WifiMarauderScriptStageSniffBeacon*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_sniffbeacon(sniffbeacon_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeSniffDeauth: {
|
||||
WifiMarauderScriptStageSniffDeauth* sniffdeauth_stage =
|
||||
(WifiMarauderScriptStageSniffDeauth*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_sniffdeauth(sniffdeauth_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeSniffEsp: {
|
||||
WifiMarauderScriptStageSniffEsp* sniffesp_stage =
|
||||
(WifiMarauderScriptStageSniffEsp*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_sniffesp(sniffesp_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeSniffPmkid: {
|
||||
WifiMarauderScriptStageSniffPmkid* sniffpmkid_stage =
|
||||
(WifiMarauderScriptStageSniffPmkid*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_sniffpmkid(sniffpmkid_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeSniffPwn: {
|
||||
WifiMarauderScriptStageSniffPwn* sniffpwn_stage =
|
||||
(WifiMarauderScriptStageSniffPwn*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_sniffpwn(sniffpwn_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeBeaconList: {
|
||||
WifiMarauderScriptStageBeaconList* beaconlist_stage =
|
||||
(WifiMarauderScriptStageBeaconList*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_beaconlist(beaconlist_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeBeaconAp: {
|
||||
WifiMarauderScriptStageBeaconAp* beaconap_stage =
|
||||
(WifiMarauderScriptStageBeaconAp*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_beaconap(beaconap_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeExec: {
|
||||
WifiMarauderScriptStageExec* exec_stage =
|
||||
(WifiMarauderScriptStageExec*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_exec(exec_stage);
|
||||
break;
|
||||
}
|
||||
case WifiMarauderScriptStageTypeDelay: {
|
||||
WifiMarauderScriptStageDelay* delay_stage =
|
||||
(WifiMarauderScriptStageDelay*)stage->stage;
|
||||
stage_json = _wifi_marauder_script_create_json_delay(delay_stage);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add the stage JSON object to the "stages" array
|
||||
if(stage_json != NULL) {
|
||||
cJSON_AddItemToArray(stages_array, stage_json);
|
||||
}
|
||||
|
||||
stage = stage->next_stage;
|
||||
}
|
||||
|
||||
// Write JSON to file
|
||||
char* json_str = cJSON_Print(root_json);
|
||||
storage_file_write(script_file, json_str, strlen(json_str));
|
||||
|
||||
//free(json_str);
|
||||
storage_file_close(script_file);
|
||||
}
|
||||
storage_file_free(script_file);
|
||||
}
|
||||
|
||||
bool wifi_marauder_script_has_stage(
|
||||
WifiMarauderScript* script,
|
||||
WifiMarauderScriptStageType stage_type) {
|
||||
if(script == NULL) {
|
||||
return false;
|
||||
}
|
||||
WifiMarauderScriptStage* current_stage = script->first_stage;
|
||||
while(current_stage != NULL) {
|
||||
if(current_stage->type == stage_type) {
|
||||
return true;
|
||||
}
|
||||
current_stage = current_stage->next_stage;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_free(WifiMarauderScript* script) {
|
||||
if(script == NULL) {
|
||||
return;
|
||||
}
|
||||
WifiMarauderScriptStage* current_stage = script->first_stage;
|
||||
while(current_stage != NULL) {
|
||||
WifiMarauderScriptStage* next_stage = current_stage->next_stage;
|
||||
switch(current_stage->type) {
|
||||
case WifiMarauderScriptStageTypeScan:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSelect:
|
||||
if(((WifiMarauderScriptStageSelect*)current_stage->stage)->filter != NULL) {
|
||||
free(((WifiMarauderScriptStageSelect*)current_stage->stage)->filter);
|
||||
}
|
||||
if(((WifiMarauderScriptStageSelect*)current_stage->stage)->indexes != NULL) {
|
||||
free(((WifiMarauderScriptStageSelect*)current_stage->stage)->indexes);
|
||||
}
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeDeauth:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeProbe:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffRaw:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffBeacon:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffDeauth:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffEsp:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffPmkid:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffPwn:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeBeaconList:
|
||||
for(int i = 0;
|
||||
i < ((WifiMarauderScriptStageBeaconList*)current_stage->stage)->ssid_count;
|
||||
i++) {
|
||||
free(((WifiMarauderScriptStageBeaconList*)current_stage->stage)->ssids[i]);
|
||||
}
|
||||
free(((WifiMarauderScriptStageBeaconList*)current_stage->stage)->ssids);
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeBeaconAp:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeExec:
|
||||
if(((WifiMarauderScriptStageExec*)current_stage->stage)->command != NULL) {
|
||||
free(((WifiMarauderScriptStageExec*)current_stage->stage)->command);
|
||||
}
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeDelay:
|
||||
free(current_stage->stage);
|
||||
break;
|
||||
}
|
||||
free(current_stage);
|
||||
current_stage = next_stage;
|
||||
}
|
||||
free(script->name);
|
||||
free(script->description);
|
||||
free(script);
|
||||
}
|
257
applications/external/wifi_marauder_companion/script/wifi_marauder_script.h
vendored
Normal file
257
applications/external/wifi_marauder_companion/script/wifi_marauder_script.h
vendored
Normal file
|
@ -0,0 +1,257 @@
|
|||
/*
|
||||
* ----------------------------------------------------------------------------------------------------
|
||||
* STEPS TO ADD A NEW STAGE:
|
||||
*
|
||||
* wifi_marauder_script.h
|
||||
* - Complement WifiMarauderScriptStageType enum with new stage
|
||||
* - Create struct WifiMarauderScriptStage???? for the new stage
|
||||
*
|
||||
* wifi_marauder_script.c
|
||||
* - Change _wifi_marauder_script_load_stages() to load new stage
|
||||
* - Change wifi_marauder_script_save_json() to support the new stage
|
||||
* - Add case to free memory in wifi_marauder_script_free()
|
||||
*
|
||||
* wifi_marauder_script_executor.c
|
||||
* - Create function "void _wifi_marauder_script_execute_????(WifiMarauderScriptStage????* stage)"
|
||||
* - Add case in wifi_marauder_script_execute_stage()
|
||||
*
|
||||
* wifi_marauder_scene_script_edit.c
|
||||
* - Add case in wifi_marauder_scene_script_edit_on_enter()
|
||||
*
|
||||
* wifi_marauder_scene_script_stage_add.c
|
||||
* - Create stage creation function and add in wifi_marauder_scene_script_stage_add_on_enter()
|
||||
*
|
||||
* wifi_marauder_script_stage_menu_config.h
|
||||
* - Add the new stage and implement its functions in a new file
|
||||
*
|
||||
* ----------------------------------------------------------------------------------------------------
|
||||
* SCRIPT SYNTAX (In order of execution):
|
||||
* {
|
||||
* "meta": {
|
||||
* "description": "My script",
|
||||
* "repeat": times the script will repeat (default 1),
|
||||
* "enableLed": true (default) | false,
|
||||
* "savePcap": true (default) | false
|
||||
* },
|
||||
* "stages": {
|
||||
* "scan": {
|
||||
* "type": "ap" | "station",
|
||||
* "timeout": seconds,
|
||||
* "channel": 1-11
|
||||
* },
|
||||
* "select": {
|
||||
* "type": "ap" | "station" | "ssid",
|
||||
* "filter": "all" | "contains -f '{SSID fragment}' or equals '{SSID}' or ...",
|
||||
* "indexes": [0, 1, 2, 3...],
|
||||
* },
|
||||
* "deauth": {
|
||||
* "timeout": seconds
|
||||
* },
|
||||
* "probe": {
|
||||
* "timeout": seconds
|
||||
* },
|
||||
* "sniffRaw": {
|
||||
* "timeout": seconds
|
||||
* },
|
||||
* "sniffBeacon": {
|
||||
* "timeout": seconds
|
||||
* },
|
||||
* "sniffDeauth": {
|
||||
* "timeout": seconds
|
||||
* },
|
||||
* "sniffEsp": {
|
||||
* "timeout": seconds
|
||||
* },
|
||||
* "sniffPmkid": {
|
||||
* "forceDeauth": true (default) | false,
|
||||
* "channel": 1-11,
|
||||
* "timeout": seconds
|
||||
* },
|
||||
* "sniffPwn": {
|
||||
* "timeout": seconds
|
||||
* },
|
||||
* "beaconList": {
|
||||
* "ssids": [
|
||||
* "SSID 1",
|
||||
* "SSID 2",
|
||||
* "SSID 3"
|
||||
* ],
|
||||
* "generate": number of random SSIDs that will be generated,
|
||||
* "timeout": seconds
|
||||
* }
|
||||
* "beaconAp": {
|
||||
* "timeout": seconds
|
||||
* }
|
||||
* "exec": {
|
||||
* "command": Command (eg: "clearlist -a")
|
||||
* }
|
||||
* "delay": {
|
||||
* "timeout": seconds
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
*
|
||||
* Note: It is possible to inform "stages" as an array, allowing ordering and repetition of stages of the same type:
|
||||
* "stages": [
|
||||
* {
|
||||
* "beaconList": { "ssids": ["SSID 1", "SSID 2"] }
|
||||
* },
|
||||
* {
|
||||
* "beaconList": { "generate": 4 }
|
||||
* },
|
||||
* ]
|
||||
* ----------------------------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <storage/storage.h>
|
||||
#include "cJSON.h"
|
||||
|
||||
#define WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN 15
|
||||
#define WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH 30
|
||||
#define WIFI_MARAUDER_DEFAULT_TIMEOUT_PROBE 60
|
||||
#define WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF 60
|
||||
#define WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON 60
|
||||
|
||||
typedef enum {
|
||||
WifiMarauderScriptBooleanFalse = 0,
|
||||
WifiMarauderScriptBooleanTrue = 1,
|
||||
WifiMarauderScriptBooleanUndefined = 2
|
||||
} WifiMarauderScriptBoolean;
|
||||
|
||||
typedef enum {
|
||||
WifiMarauderScriptStageTypeScan,
|
||||
WifiMarauderScriptStageTypeSelect,
|
||||
WifiMarauderScriptStageTypeDeauth,
|
||||
WifiMarauderScriptStageTypeProbe,
|
||||
WifiMarauderScriptStageTypeSniffRaw,
|
||||
WifiMarauderScriptStageTypeSniffBeacon,
|
||||
WifiMarauderScriptStageTypeSniffDeauth,
|
||||
WifiMarauderScriptStageTypeSniffEsp,
|
||||
WifiMarauderScriptStageTypeSniffPmkid,
|
||||
WifiMarauderScriptStageTypeSniffPwn,
|
||||
WifiMarauderScriptStageTypeBeaconList,
|
||||
WifiMarauderScriptStageTypeBeaconAp,
|
||||
WifiMarauderScriptStageTypeExec,
|
||||
WifiMarauderScriptStageTypeDelay,
|
||||
} WifiMarauderScriptStageType;
|
||||
|
||||
typedef enum {
|
||||
WifiMarauderScriptScanTypeAp = 0,
|
||||
WifiMarauderScriptScanTypeStation = 1
|
||||
} WifiMarauderScriptScanType;
|
||||
|
||||
typedef enum {
|
||||
WifiMarauderScriptSelectTypeAp,
|
||||
WifiMarauderScriptSelectTypeStation,
|
||||
WifiMarauderScriptSelectTypeSsid
|
||||
} WifiMarauderScriptSelectType;
|
||||
|
||||
// Stages
|
||||
typedef struct WifiMarauderScriptStage {
|
||||
WifiMarauderScriptStageType type;
|
||||
void* stage;
|
||||
struct WifiMarauderScriptStage* next_stage;
|
||||
} WifiMarauderScriptStage;
|
||||
|
||||
typedef struct WifiMarauderScriptStageScan {
|
||||
WifiMarauderScriptScanType type;
|
||||
int channel;
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageScan;
|
||||
|
||||
typedef struct WifiMarauderScriptStageSelect {
|
||||
WifiMarauderScriptSelectType type;
|
||||
char* filter;
|
||||
int* indexes;
|
||||
int index_count;
|
||||
// TODO: Implement a feature to not select the same items in the next iteration of the script
|
||||
bool allow_repeat;
|
||||
} WifiMarauderScriptStageSelect;
|
||||
|
||||
typedef struct WifiMarauderScriptStageDeauth {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageDeauth;
|
||||
|
||||
typedef struct WifiMarauderScriptStageProbe {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageProbe;
|
||||
|
||||
typedef struct WifiMarauderScriptStageSniffRaw {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageSniffRaw;
|
||||
|
||||
typedef struct WifiMarauderScriptStageSniffBeacon {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageSniffBeacon;
|
||||
|
||||
typedef struct WifiMarauderScriptStageSniffDeauth {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageSniffDeauth;
|
||||
|
||||
typedef struct WifiMarauderScriptStageSniffEsp {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageSniffEsp;
|
||||
|
||||
typedef struct WifiMarauderScriptStageSniffPmkid {
|
||||
bool force_deauth;
|
||||
int channel;
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageSniffPmkid;
|
||||
|
||||
typedef struct WifiMarauderScriptStageSniffPwn {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageSniffPwn;
|
||||
|
||||
typedef struct WifiMarauderScriptStageBeaconList {
|
||||
char** ssids;
|
||||
int ssid_count;
|
||||
int random_ssids;
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageBeaconList;
|
||||
|
||||
typedef struct WifiMarauderScriptStageBeaconAp {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageBeaconAp;
|
||||
|
||||
typedef struct WifiMarauderScriptStageExec {
|
||||
char* command;
|
||||
} WifiMarauderScriptStageExec;
|
||||
|
||||
typedef struct WifiMarauderScriptStageDelay {
|
||||
int timeout;
|
||||
} WifiMarauderScriptStageDelay;
|
||||
|
||||
// Script
|
||||
typedef struct WifiMarauderScript {
|
||||
char* name;
|
||||
char* description;
|
||||
WifiMarauderScriptStage* first_stage;
|
||||
WifiMarauderScriptStage* last_stage;
|
||||
WifiMarauderScriptBoolean enable_led;
|
||||
WifiMarauderScriptBoolean save_pcap;
|
||||
int repeat;
|
||||
} WifiMarauderScript;
|
||||
|
||||
typedef struct WifiMarauderScriptStageListItem {
|
||||
char* value;
|
||||
struct WifiMarauderScriptStageListItem* next_item;
|
||||
} WifiMarauderScriptStageListItem;
|
||||
|
||||
WifiMarauderScript* wifi_marauder_script_alloc();
|
||||
WifiMarauderScript* wifi_marauder_script_create(const char* script_name);
|
||||
WifiMarauderScript* wifi_marauder_script_parse_raw(const char* script_raw);
|
||||
WifiMarauderScript* wifi_marauder_script_parse_json(Storage* storage, const char* file_path);
|
||||
void wifi_marauder_script_save_json(
|
||||
Storage* storage,
|
||||
const char* file_path,
|
||||
WifiMarauderScript* script);
|
||||
void wifi_marauder_script_add_stage(
|
||||
WifiMarauderScript* script,
|
||||
WifiMarauderScriptStageType stage_type,
|
||||
void* stage_data);
|
||||
bool wifi_marauder_script_has_stage(
|
||||
WifiMarauderScript* script,
|
||||
WifiMarauderScriptStageType stage_type);
|
||||
void wifi_marauder_script_free(WifiMarauderScript* script);
|
307
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.c
vendored
Normal file
307
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.c
vendored
Normal file
|
@ -0,0 +1,307 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
#include "wifi_marauder_script_executor.h"
|
||||
|
||||
void _wifi_marauder_script_delay(WifiMarauderScriptWorker* worker, uint32_t delay_secs) {
|
||||
for(uint32_t i = 0; i < delay_secs && worker->is_running; i++) furi_delay_ms(1000);
|
||||
}
|
||||
|
||||
void _send_stop() {
|
||||
const char stop_command[] = "stopscan\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)(stop_command), strlen(stop_command));
|
||||
}
|
||||
|
||||
void _send_line_break() {
|
||||
wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
|
||||
}
|
||||
|
||||
void _send_channel_select(int channel) {
|
||||
char command[30];
|
||||
wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
|
||||
snprintf(command, sizeof(command), "channel -s %d\n", channel);
|
||||
wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_scan(
|
||||
WifiMarauderScriptStageScan* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
char command[15];
|
||||
// Set channel
|
||||
if(stage->channel > 0) {
|
||||
_send_channel_select(stage->channel);
|
||||
}
|
||||
// Start scan
|
||||
if(stage->type == WifiMarauderScriptScanTypeAp) {
|
||||
snprintf(command, sizeof(command), "scanap\n");
|
||||
} else {
|
||||
snprintf(command, sizeof(command), "scansta\n");
|
||||
}
|
||||
wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_select(WifiMarauderScriptStageSelect* stage) {
|
||||
const char* select_type = NULL;
|
||||
switch(stage->type) {
|
||||
case WifiMarauderScriptSelectTypeAp:
|
||||
select_type = "-a";
|
||||
break;
|
||||
case WifiMarauderScriptSelectTypeStation:
|
||||
select_type = "-c";
|
||||
break;
|
||||
case WifiMarauderScriptSelectTypeSsid:
|
||||
select_type = "-s";
|
||||
break;
|
||||
default:
|
||||
return; // invalid stage
|
||||
}
|
||||
|
||||
char command[256];
|
||||
size_t command_length = 0;
|
||||
|
||||
if(stage->indexes != NULL && stage->index_count > 0) {
|
||||
command_length = snprintf(command, sizeof(command), "select %s ", select_type);
|
||||
|
||||
for(int i = 0; i < stage->index_count; i++) {
|
||||
int index = stage->indexes[i];
|
||||
command_length += snprintf(
|
||||
command + command_length, sizeof(command) - command_length, "%d, ", index);
|
||||
}
|
||||
|
||||
// Remove the trailing comma and space
|
||||
command_length -= 2;
|
||||
command[command_length] = '\n';
|
||||
command_length++;
|
||||
} else if(stage->filter == NULL || strcmp(stage->filter, "all") == 0) {
|
||||
command_length = snprintf(command, sizeof(command), "select %s all\n", select_type);
|
||||
} else {
|
||||
command_length = snprintf(
|
||||
command, sizeof(command), "select %s -f \"%s\"\n", select_type, stage->filter);
|
||||
}
|
||||
|
||||
wifi_marauder_uart_tx((uint8_t*)command, command_length);
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_deauth(
|
||||
WifiMarauderScriptStageDeauth* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char attack_command[] = "attack -t deauth\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)(attack_command), strlen(attack_command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_probe(
|
||||
WifiMarauderScriptStageProbe* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char attack_command[] = "attack -t probe\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)(attack_command), strlen(attack_command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_sniff_raw(
|
||||
WifiMarauderScriptStageSniffRaw* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char sniff_command[] = "sniffraw\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)sniff_command, strlen(sniff_command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_sniff_beacon(
|
||||
WifiMarauderScriptStageSniffBeacon* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char sniff_command[] = "sniffbeacon\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)sniff_command, strlen(sniff_command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_sniff_deauth(
|
||||
WifiMarauderScriptStageSniffDeauth* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char sniff_command[] = "sniffdeauth\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)sniff_command, strlen(sniff_command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_sniff_esp(
|
||||
WifiMarauderScriptStageSniffEsp* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char sniff_command[] = "sniffesp\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)sniff_command, strlen(sniff_command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_sniff_pmkid(
|
||||
WifiMarauderScriptStageSniffPmkid* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
char attack_command[50] = "sniffpmkid";
|
||||
int len = strlen(attack_command);
|
||||
|
||||
if(stage->channel > 0) {
|
||||
len +=
|
||||
snprintf(attack_command + len, sizeof(attack_command) - len, " -c %d", stage->channel);
|
||||
}
|
||||
|
||||
if(stage->force_deauth) {
|
||||
len += snprintf(attack_command + len, sizeof(attack_command) - len, " -d");
|
||||
}
|
||||
|
||||
len += snprintf(attack_command + len, sizeof(attack_command) - len, "\n");
|
||||
|
||||
wifi_marauder_uart_tx((uint8_t*)attack_command, len);
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_sniff_pwn(
|
||||
WifiMarauderScriptStageSniffPwn* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char sniff_command[] = "sniffpwn\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)sniff_command, strlen(sniff_command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_beacon_list(
|
||||
WifiMarauderScriptStageBeaconList* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char clearlist_command[] = "clearlist -s\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)(clearlist_command), strlen(clearlist_command));
|
||||
|
||||
char command[100];
|
||||
char* ssid;
|
||||
|
||||
for(int i = 0; i < stage->ssid_count; i++) {
|
||||
ssid = stage->ssids[i];
|
||||
snprintf(command, sizeof(command), "ssid -a -n \"%s\"", ssid);
|
||||
wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
|
||||
_send_line_break();
|
||||
}
|
||||
if(stage->random_ssids > 0) {
|
||||
char add_random_command[50];
|
||||
snprintf(
|
||||
add_random_command,
|
||||
sizeof(add_random_command),
|
||||
"ssid -a -r -g %d\n",
|
||||
stage->random_ssids);
|
||||
wifi_marauder_uart_tx((uint8_t*)add_random_command, strlen(add_random_command));
|
||||
}
|
||||
const char attack_command[] = "attack -t beacon -l\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)(attack_command), strlen(attack_command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_beacon_ap(
|
||||
WifiMarauderScriptStageBeaconAp* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
const char command[] = "attack -t beacon -a\n";
|
||||
wifi_marauder_uart_tx((uint8_t*)command, strlen(command));
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
_send_stop();
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_exec(WifiMarauderScriptStageExec* stage) {
|
||||
if(stage->command != NULL) {
|
||||
wifi_marauder_uart_tx((uint8_t*)stage->command, strlen(stage->command));
|
||||
}
|
||||
}
|
||||
|
||||
void _wifi_marauder_script_execute_delay(
|
||||
WifiMarauderScriptStageDelay* stage,
|
||||
WifiMarauderScriptWorker* worker) {
|
||||
_wifi_marauder_script_delay(worker, stage->timeout);
|
||||
}
|
||||
|
||||
void wifi_marauder_script_execute_start(void* context) {
|
||||
furi_assert(context);
|
||||
WifiMarauderScriptWorker* worker = context;
|
||||
WifiMarauderScript* script = worker->script;
|
||||
char command[100];
|
||||
|
||||
// Enables or disables the LED according to script settings
|
||||
if(script->enable_led != WifiMarauderScriptBooleanUndefined) {
|
||||
snprintf(
|
||||
command,
|
||||
sizeof(command),
|
||||
"settings -s EnableLED %s",
|
||||
script->enable_led ? "enable" : "disable");
|
||||
wifi_marauder_uart_tx((uint8_t*)command, strlen(command));
|
||||
_send_line_break();
|
||||
}
|
||||
|
||||
// Enables or disables PCAP saving according to script settings
|
||||
if(script->save_pcap != WifiMarauderScriptBooleanUndefined) {
|
||||
snprintf(
|
||||
command,
|
||||
sizeof(command),
|
||||
"settings -s SavePCAP %s",
|
||||
script->save_pcap ? "enable" : "disable");
|
||||
wifi_marauder_uart_tx((uint8_t*)command, strlen(command));
|
||||
_send_line_break();
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_script_execute_stage(WifiMarauderScriptStage* stage, void* context) {
|
||||
furi_assert(context);
|
||||
WifiMarauderScriptWorker* worker = context;
|
||||
void* stage_data = stage->stage;
|
||||
|
||||
switch(stage->type) {
|
||||
case WifiMarauderScriptStageTypeScan:
|
||||
_wifi_marauder_script_execute_scan((WifiMarauderScriptStageScan*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSelect:
|
||||
_wifi_marauder_script_execute_select((WifiMarauderScriptStageSelect*)stage_data);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeDeauth:
|
||||
_wifi_marauder_script_execute_deauth((WifiMarauderScriptStageDeauth*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeProbe:
|
||||
_wifi_marauder_script_execute_probe((WifiMarauderScriptStageProbe*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffRaw:
|
||||
_wifi_marauder_script_execute_sniff_raw(
|
||||
(WifiMarauderScriptStageSniffRaw*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffBeacon:
|
||||
_wifi_marauder_script_execute_sniff_beacon(
|
||||
(WifiMarauderScriptStageSniffBeacon*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffDeauth:
|
||||
_wifi_marauder_script_execute_sniff_deauth(
|
||||
(WifiMarauderScriptStageSniffDeauth*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffEsp:
|
||||
_wifi_marauder_script_execute_sniff_esp(
|
||||
(WifiMarauderScriptStageSniffEsp*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffPmkid:
|
||||
_wifi_marauder_script_execute_sniff_pmkid(
|
||||
(WifiMarauderScriptStageSniffPmkid*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeSniffPwn:
|
||||
_wifi_marauder_script_execute_sniff_pwn(
|
||||
(WifiMarauderScriptStageSniffPwn*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeBeaconList:
|
||||
_wifi_marauder_script_execute_beacon_list(
|
||||
(WifiMarauderScriptStageBeaconList*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeBeaconAp:
|
||||
_wifi_marauder_script_execute_beacon_ap(
|
||||
(WifiMarauderScriptStageBeaconAp*)stage_data, worker);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeExec:
|
||||
_wifi_marauder_script_execute_exec((WifiMarauderScriptStageExec*)stage_data);
|
||||
break;
|
||||
case WifiMarauderScriptStageTypeDelay:
|
||||
_wifi_marauder_script_execute_delay((WifiMarauderScriptStageDelay*)stage_data, worker);
|
||||
break;
|
||||
}
|
||||
}
|
6
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.h
vendored
Normal file
6
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.h
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include "wifi_marauder_script.h"
|
||||
|
||||
void wifi_marauder_script_execute_start(void* context);
|
||||
void wifi_marauder_script_execute_stage(WifiMarauderScriptStage* stage, void* context);
|
74
applications/external/wifi_marauder_companion/script/wifi_marauder_script_worker.c
vendored
Normal file
74
applications/external/wifi_marauder_companion/script/wifi_marauder_script_worker.c
vendored
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include "../wifi_marauder_app_i.h"
|
||||
#include "wifi_marauder_script_worker.h"
|
||||
|
||||
WifiMarauderScriptWorker* wifi_marauder_script_worker_alloc() {
|
||||
WifiMarauderScriptWorker* worker = malloc(sizeof(WifiMarauderScriptWorker));
|
||||
if(worker == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
worker->callback_start = NULL;
|
||||
worker->callback_stage = NULL;
|
||||
worker->worker_thread = NULL;
|
||||
worker->is_running = false;
|
||||
return worker;
|
||||
}
|
||||
|
||||
int32_t _wifi_marauder_script_worker_task(void* worker) {
|
||||
WifiMarauderScriptWorker* script_worker = worker;
|
||||
WifiMarauderScript* script = script_worker->script;
|
||||
if(script == NULL) {
|
||||
return WifiMarauderScriptWorkerStatusInvalidScript;
|
||||
}
|
||||
|
||||
// Setup
|
||||
script_worker->callback_start(script_worker->context);
|
||||
if(!script_worker->is_running) {
|
||||
return WifiMarauderScriptWorkerStatusForceExit;
|
||||
}
|
||||
|
||||
// Stages
|
||||
for(int i = 0; i < script->repeat; i++) {
|
||||
WifiMarauderScriptStage* current_stage = script->first_stage;
|
||||
while(current_stage != NULL && script_worker->is_running) {
|
||||
script_worker->callback_stage(current_stage, script_worker->context);
|
||||
current_stage = current_stage->next_stage;
|
||||
}
|
||||
if(!script_worker->is_running) {
|
||||
return WifiMarauderScriptWorkerStatusForceExit;
|
||||
}
|
||||
}
|
||||
|
||||
script_worker->is_running = false;
|
||||
return WifiMarauderScriptWorkerStatusSuccess;
|
||||
}
|
||||
|
||||
bool wifi_marauder_script_worker_start(
|
||||
WifiMarauderScriptWorker* instance,
|
||||
WifiMarauderScript* script) {
|
||||
if(!instance || !script) {
|
||||
return false;
|
||||
}
|
||||
instance->callback_start = wifi_marauder_script_execute_start;
|
||||
instance->callback_stage = wifi_marauder_script_execute_stage;
|
||||
instance->script = script;
|
||||
instance->context = instance;
|
||||
instance->is_running = true;
|
||||
instance->worker_thread = furi_thread_alloc_ex(
|
||||
"WifiMarauderScriptWorker", 1024, _wifi_marauder_script_worker_task, instance);
|
||||
if(!instance->worker_thread) {
|
||||
return false;
|
||||
}
|
||||
furi_thread_start(instance->worker_thread);
|
||||
return true;
|
||||
}
|
||||
|
||||
void wifi_marauder_script_worker_free(WifiMarauderScriptWorker* worker) {
|
||||
if(worker != NULL) {
|
||||
if(worker->worker_thread != NULL) {
|
||||
worker->is_running = false;
|
||||
furi_thread_join(worker->worker_thread);
|
||||
furi_thread_free(worker->worker_thread);
|
||||
}
|
||||
free(worker);
|
||||
}
|
||||
}
|
43
applications/external/wifi_marauder_companion/script/wifi_marauder_script_worker.h
vendored
Normal file
43
applications/external/wifi_marauder_companion/script/wifi_marauder_script_worker.h
vendored
Normal file
|
@ -0,0 +1,43 @@
|
|||
#pragma once
|
||||
|
||||
#include "wifi_marauder_script.h"
|
||||
|
||||
typedef enum {
|
||||
WifiMarauderScriptWorkerStatusSuccess = 0,
|
||||
WifiMarauderScriptWorkerStatusInvalidScript = 1,
|
||||
WifiMarauderScriptWorkerStatusForceExit = 2
|
||||
} WifiMarauderScriptWorkerStatus;
|
||||
|
||||
typedef struct WifiMarauderScriptWorker {
|
||||
WifiMarauderScript* script;
|
||||
FuriThread* worker_thread;
|
||||
void (*callback_start)(void*);
|
||||
void (*callback_stage)(WifiMarauderScriptStage*, void*);
|
||||
void* context;
|
||||
bool is_running;
|
||||
} WifiMarauderScriptWorker;
|
||||
|
||||
/**
|
||||
* @brief Allocates a new instance of WifiMarauderScriptWorker.
|
||||
*
|
||||
* @return A pointer to the allocated instance or NULL if allocation fails.
|
||||
*/
|
||||
WifiMarauderScriptWorker* wifi_marauder_script_worker_alloc();
|
||||
|
||||
/**
|
||||
* @brief Starts the execution of the worker and sets the callback function to be called after each stage is executed.
|
||||
*
|
||||
* @param instance A pointer to the instance of WifiMarauderScriptWorker to start.
|
||||
* @param script Script to be executed
|
||||
* @return True if the worker was successfully started, false otherwise.
|
||||
*/
|
||||
bool wifi_marauder_script_worker_start(
|
||||
WifiMarauderScriptWorker* instance,
|
||||
WifiMarauderScript* script);
|
||||
|
||||
/**
|
||||
* @brief Frees the memory used by the instance of WifiMarauderScriptWorker.
|
||||
*
|
||||
* @param script A pointer to the instance of WifiMarauderScriptWorker to free.
|
||||
*/
|
||||
void wifi_marauder_script_worker_free(WifiMarauderScriptWorker* script);
|
|
@ -81,6 +81,11 @@ WifiMarauderApp* wifi_marauder_app_alloc() {
|
|||
(!storage_file_exists(app->storage, SAVE_PCAP_SETTING_FILEPATH) ||
|
||||
!storage_file_exists(app->storage, SAVE_LOGS_SETTING_FILEPATH));
|
||||
|
||||
// Submenu
|
||||
app->submenu = submenu_alloc();
|
||||
view_dispatcher_add_view(
|
||||
app->view_dispatcher, WifiMarauderAppViewSubmenu, submenu_get_view(app->submenu));
|
||||
|
||||
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneStart);
|
||||
|
||||
return app;
|
||||
|
@ -100,6 +105,10 @@ void wifi_marauder_make_app_folder(WifiMarauderApp* app) {
|
|||
if(!storage_simply_mkdir(app->storage, MARAUDER_APP_FOLDER_LOGS)) {
|
||||
dialog_message_show_storage_error(app->dialogs, "Cannot create\npcaps folder");
|
||||
}
|
||||
|
||||
if(!storage_simply_mkdir(app->storage, MARAUDER_APP_FOLDER_SCRIPTS)) {
|
||||
dialog_message_show_storage_error(app->dialogs, "Cannot create\nscripts folder");
|
||||
}
|
||||
}
|
||||
|
||||
void wifi_marauder_load_settings(WifiMarauderApp* app) {
|
||||
|
@ -134,10 +143,14 @@ void wifi_marauder_app_free(WifiMarauderApp* app) {
|
|||
view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewConsoleOutput);
|
||||
view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewTextInput);
|
||||
view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewWidget);
|
||||
view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
|
||||
|
||||
widget_free(app->widget);
|
||||
text_box_free(app->text_box);
|
||||
furi_string_free(app->text_box_store);
|
||||
wifi_text_input_free(app->text_input);
|
||||
submenu_free(app->submenu);
|
||||
variable_item_list_free(app->var_item_list);
|
||||
storage_file_free(app->capture_file);
|
||||
storage_file_free(app->log_file);
|
||||
storage_file_free(app->save_pcap_setting_file);
|
||||
|
|
|
@ -6,20 +6,27 @@
|
|||
#include "scenes/wifi_marauder_scene.h"
|
||||
#include "wifi_marauder_custom_event.h"
|
||||
#include "wifi_marauder_uart.h"
|
||||
#include "wifi_marauder_pcap.h"
|
||||
#include "file/sequential_file.h"
|
||||
#include "script/wifi_marauder_script.h"
|
||||
#include "script/wifi_marauder_script_worker.h"
|
||||
#include "script/wifi_marauder_script_executor.h"
|
||||
#include "script/menu/wifi_marauder_script_stage_menu.h"
|
||||
|
||||
#include <gui/gui.h>
|
||||
#include <gui/view_dispatcher.h>
|
||||
#include <gui/scene_manager.h>
|
||||
#include <gui/modules/text_box.h>
|
||||
#include <gui/modules/submenu.h>
|
||||
#include <gui/modules/variable_item_list.h>
|
||||
#include <gui/modules/widget.h>
|
||||
#include "wifi_marauder_text_input.h"
|
||||
|
||||
#include <ESP32_WiFi_Marauder_icons.h>
|
||||
#include <storage/storage.h>
|
||||
#include <lib/toolbox/path.h>
|
||||
#include <dialogs/dialogs.h>
|
||||
|
||||
#define NUM_MENU_ITEMS (17)
|
||||
#define NUM_MENU_ITEMS (18)
|
||||
|
||||
#define WIFI_MARAUDER_TEXT_BOX_STORE_SIZE (4096)
|
||||
#define WIFI_MARAUDER_TEXT_INPUT_STORE_SIZE (512)
|
||||
|
@ -30,9 +37,17 @@
|
|||
#define MARAUDER_APP_FOLDER_LOGS MARAUDER_APP_FOLDER "/logs"
|
||||
#define MARAUDER_APP_FOLDER_USER_PCAPS MARAUDER_APP_FOLDER_USER "/pcaps"
|
||||
#define MARAUDER_APP_FOLDER_USER_LOGS MARAUDER_APP_FOLDER_USER "/logs"
|
||||
#define MARAUDER_APP_FOLDER_SCRIPTS MARAUDER_APP_FOLDER "/scripts"
|
||||
#define MARAUDER_APP_SCRIPT_PATH(file_name) MARAUDER_APP_FOLDER_SCRIPTS "/" file_name ".json"
|
||||
#define SAVE_PCAP_SETTING_FILEPATH MARAUDER_APP_FOLDER "/save_pcaps_here.setting"
|
||||
#define SAVE_LOGS_SETTING_FILEPATH MARAUDER_APP_FOLDER "/save_logs_here.setting"
|
||||
|
||||
typedef enum WifiMarauderUserInputType {
|
||||
WifiMarauderUserInputTypeString,
|
||||
WifiMarauderUserInputTypeNumber,
|
||||
WifiMarauderUserInputTypeFileName
|
||||
} WifiMarauderUserInputType;
|
||||
|
||||
struct WifiMarauderApp {
|
||||
Gui* gui;
|
||||
ViewDispatcher* view_dispatcher;
|
||||
|
@ -58,6 +73,7 @@ struct WifiMarauderApp {
|
|||
|
||||
VariableItemList* var_item_list;
|
||||
Widget* widget;
|
||||
Submenu* submenu;
|
||||
int open_log_file_page;
|
||||
int open_log_file_num_pages;
|
||||
|
||||
|
@ -73,6 +89,26 @@ struct WifiMarauderApp {
|
|||
bool is_writing_pcap;
|
||||
bool is_writing_log;
|
||||
|
||||
// User input
|
||||
WifiMarauderUserInputType user_input_type;
|
||||
char** user_input_string_reference;
|
||||
int* user_input_number_reference;
|
||||
char* user_input_file_dir;
|
||||
char* user_input_file_extension;
|
||||
|
||||
// Automation script
|
||||
WifiMarauderScript* script;
|
||||
WifiMarauderScriptWorker* script_worker;
|
||||
FuriString** script_list;
|
||||
int script_list_count;
|
||||
WifiMarauderScriptStage* script_edit_selected_stage;
|
||||
WifiMarauderScriptStageMenu* script_stage_menu;
|
||||
WifiMarauderScriptStageListItem* script_stage_edit_first_item;
|
||||
char*** script_stage_edit_strings_reference;
|
||||
int* script_stage_edit_string_count_reference;
|
||||
int** script_stage_edit_numbers_reference;
|
||||
int* script_stage_edit_number_count_reference;
|
||||
|
||||
// For input source and destination MAC in targeted deauth attack
|
||||
int special_case_input_step;
|
||||
char special_case_input_src_addr[20];
|
||||
|
@ -105,4 +141,5 @@ typedef enum {
|
|||
WifiMarauderAppViewConsoleOutput,
|
||||
WifiMarauderAppViewTextInput,
|
||||
WifiMarauderAppViewWidget,
|
||||
WifiMarauderAppViewSubmenu,
|
||||
} WifiMarauderAppView;
|
||||
|
|
|
@ -7,5 +7,6 @@ typedef enum {
|
|||
WifiMarauderEventSaveSourceMac,
|
||||
WifiMarauderEventSaveDestinationMac,
|
||||
WifiMarauderEventStartSettingsInit,
|
||||
WifiMarauderEventStartLogViewer
|
||||
WifiMarauderEventStartLogViewer,
|
||||
WifiMarauderEventStartScriptSelect
|
||||
} WifiMarauderCustomEvent;
|
||||
|
|
Loading…
Reference in a new issue