Skip to content

Commit 1a85807

Browse files
authored
Merge pull request #11 from tcpassos/feature_wifi_marauder_app
SCRIPTS!!
2 parents 9dc7e04 + a7902aa commit 1a85807

File tree

46 files changed

+6918
-119
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+6918
-119
lines changed

applications/external/wifi_marauder_companion/application.fam

+1
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ App(
88
stack_size=4 * 1024,
99
order=90,
1010
fap_icon="wifi_10px.png",
11+
fap_icon_assets="icons",
1112
fap_category="GPIO",
1213
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include "sequential_file.h"
2+
3+
char* sequential_file_resolve_path(Storage* storage, const char* dir, const char* prefix, const char* extension) {
4+
if (storage == NULL || dir == NULL || prefix == NULL || extension == NULL) {
5+
return NULL;
6+
}
7+
8+
char file_path[256];
9+
int file_index = 0;
10+
11+
do {
12+
if (snprintf(file_path, sizeof(file_path), "%s/%s_%d.%s", dir, prefix, file_index, extension) < 0) {
13+
return NULL;
14+
}
15+
file_index++;
16+
} while(storage_file_exists(storage, file_path));
17+
18+
return strdup(file_path);
19+
}
20+
21+
bool sequential_file_open(Storage* storage, File* file, const char* dir, const char* prefix, const char* extension) {
22+
if (storage == NULL || file == NULL || dir == NULL || prefix == NULL || extension == NULL) {
23+
return false;
24+
}
25+
26+
char* file_path = sequential_file_resolve_path(storage, dir, prefix, extension);
27+
if (file_path == NULL) {
28+
return false;
29+
}
30+
31+
bool success = storage_file_open(file, file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS);
32+
free(file_path);
33+
34+
return success;
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#pragma once
2+
3+
#include <storage/storage.h>
4+
5+
char* sequential_file_resolve_path(Storage* storage, const char* dir, const char* prefix, const char* extension);
6+
bool sequential_file_open(Storage* storage, File* file, const char* dir, const char* prefix, const char* extension);
Loading

applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h

+9
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,12 @@ ADD_SCENE(wifi_marauder, console_output, ConsoleOutput)
33
ADD_SCENE(wifi_marauder, text_input, TextInput)
44
ADD_SCENE(wifi_marauder, settings_init, SettingsInit)
55
ADD_SCENE(wifi_marauder, log_viewer, LogViewer)
6+
ADD_SCENE(wifi_marauder, user_input, UserInput)
7+
ADD_SCENE(wifi_marauder, script_select, ScriptSelect)
8+
ADD_SCENE(wifi_marauder, script_options, ScriptOptions)
9+
ADD_SCENE(wifi_marauder, script_edit, ScriptEdit)
10+
ADD_SCENE(wifi_marauder, script_settings, ScriptSettings)
11+
ADD_SCENE(wifi_marauder, script_confirm_delete, ScriptConfirmDelete)
12+
ADD_SCENE(wifi_marauder, script_stage_edit, ScriptStageEdit)
13+
ADD_SCENE(wifi_marauder, script_stage_add, ScriptStageAdd)
14+
ADD_SCENE(wifi_marauder, script_stage_edit_list, ScriptStageEditList)

applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c

+80-25
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,30 @@
11
#include "../wifi_marauder_app_i.h"
22

3+
char* _wifi_marauder_get_prefix_from_cmd(const char* command) {
4+
int end = strcspn(command, " ");
5+
char* prefix = (char*) malloc(sizeof(char) * (end + 1));
6+
strncpy(prefix, command, end);
7+
prefix[end] = '\0';
8+
return prefix;
9+
}
10+
11+
bool _wifi_marauder_is_save_pcaps_enabled(WifiMarauderApp* app) {
12+
if (!app->ok_to_save_pcaps) {
13+
return false;
14+
}
15+
// If it is a script that contains a sniff function
16+
if (app->script != NULL) {
17+
return wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffRaw) ||
18+
wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffBeacon) ||
19+
wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffDeauth) ||
20+
wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffEsp) ||
21+
wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffPmkid) ||
22+
wifi_marauder_script_has_stage(app->script, WifiMarauderScriptStageTypeSniffPwn);
23+
}
24+
// If it is a sniff function
25+
return app->is_command && app->selected_tx_string && strncmp("sniff", app->selected_tx_string, strlen("sniff")) == 0;
26+
}
27+
328
void wifi_marauder_console_output_handle_rx_data_cb(uint8_t* buf, size_t len, void* context) {
429
furi_assert(context);
530
WifiMarauderApp* app = context;
@@ -34,63 +59,89 @@ void wifi_marauder_console_output_handle_rx_packets_cb(uint8_t* buf, size_t len,
3459
void wifi_marauder_scene_console_output_on_enter(void* context) {
3560
WifiMarauderApp* app = context;
3661

62+
// Reset text box and set font
3763
TextBox* text_box = app->text_box;
38-
text_box_reset(app->text_box);
64+
text_box_reset(text_box);
3965
text_box_set_font(text_box, TextBoxFontText);
66+
67+
// Set focus on start or end
4068
if(app->focus_console_start) {
4169
text_box_set_focus(text_box, TextBoxFocusStart);
4270
} else {
4371
text_box_set_focus(text_box, TextBoxFocusEnd);
4472
}
73+
74+
// Set command-related messages
4575
if(app->is_command) {
4676
furi_string_reset(app->text_box_store);
4777
app->text_box_store_strlen = 0;
78+
// Help message
4879
if(0 == strncmp("help", app->selected_tx_string, strlen("help"))) {
4980
const char* help_msg = "Marauder companion " WIFI_MARAUDER_APP_VERSION "\n";
5081
furi_string_cat_str(app->text_box_store, help_msg);
5182
app->text_box_store_strlen += strlen(help_msg);
5283
}
53-
84+
// Stopscan message
5485
if(app->show_stopscan_tip) {
5586
const char* help_msg = "Press BACK to send stopscan\n";
5687
furi_string_cat_str(app->text_box_store, help_msg);
5788
app->text_box_store_strlen += strlen(help_msg);
5889
}
5990
}
6091

61-
// Set starting text - for "View Log from end", this will just be what was already in the text box store
92+
// Set starting text
6293
text_box_set_text(app->text_box, furi_string_get_cstr(app->text_box_store));
6394

95+
// Set scene state and switch view
6496
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneConsoleOutput, 0);
6597
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewConsoleOutput);
6698

67-
// Register callback to receive data
68-
wifi_marauder_uart_set_handle_rx_data_cb(
69-
app->uart,
70-
wifi_marauder_console_output_handle_rx_data_cb); // setup callback for general log rx thread
71-
wifi_marauder_uart_set_handle_rx_data_cb(
72-
app->lp_uart,
73-
wifi_marauder_console_output_handle_rx_packets_cb); // setup callback for packets rx thread
74-
99+
// Register callbacks to receive data
100+
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
101+
wifi_marauder_uart_set_handle_rx_data_cb(app->lp_uart, wifi_marauder_console_output_handle_rx_packets_cb); // setup callback for packets rx thread
102+
75103
// Get ready to send command
76-
if(app->is_command && app->selected_tx_string) {
104+
if((app->is_command && app->selected_tx_string) || app->script) {
105+
const char* prefix = strlen(app->selected_tx_string) > 0 ?
106+
_wifi_marauder_get_prefix_from_cmd(app->selected_tx_string) : // Function name
107+
app->script->name; // Script name
108+
77109
// Create files *before* sending command
78110
// (it takes time to iterate through the directory)
79111
if(app->ok_to_save_logs) {
80-
app->is_writing_log = true;
81-
wifi_marauder_create_log_file(app);
112+
strcpy(app->log_file_path, sequential_file_resolve_path(app->storage, MARAUDER_APP_FOLDER_LOGS, prefix, "log"));
113+
if (app->log_file_path != NULL) {
114+
if (storage_file_open(app->log_file, app->log_file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
115+
app->is_writing_log = true;
116+
} else {
117+
dialog_message_show_storage_error(app->dialogs, "Cannot open log file");
118+
}
119+
} else {
120+
dialog_message_show_storage_error(app->dialogs, "Cannot resolve log path");
121+
}
82122
}
83123

84-
// If it is a sniff function, open the pcap file for recording
85-
if(app->ok_to_save_pcaps && strncmp("sniff", app->selected_tx_string, strlen("sniff")) == 0) {
86-
app->is_writing_pcap = true;
87-
wifi_marauder_create_pcap_file(app);
124+
// If it is a sniff function or script, open the pcap file for recording
125+
if (_wifi_marauder_is_save_pcaps_enabled(app)) {
126+
if (sequential_file_open(app->storage, app->capture_file, MARAUDER_APP_FOLDER_PCAPS, prefix, "pcap")) {
127+
app->is_writing_pcap = true;
128+
} else {
129+
dialog_message_show_storage_error(app->dialogs, "Cannot open pcap file");
130+
}
88131
}
89132

90133
// Send command with newline '\n'
91-
wifi_marauder_uart_tx(
92-
(uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
93-
wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
134+
if (app->selected_tx_string) {
135+
wifi_marauder_uart_tx(
136+
(uint8_t*)(app->selected_tx_string), strlen(app->selected_tx_string));
137+
wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
138+
}
139+
140+
// Run the script if the file with the script has been opened
141+
if(app->script != NULL) {
142+
app->script_worker = wifi_marauder_script_worker_alloc();
143+
wifi_marauder_script_worker_start(app->script_worker, app->script);
144+
}
94145
}
95146
}
96147

@@ -112,15 +163,19 @@ bool wifi_marauder_scene_console_output_on_event(void* context, SceneManagerEven
112163
void wifi_marauder_scene_console_output_on_exit(void* context) {
113164
WifiMarauderApp* app = context;
114165

115-
// Unregister rx callback
116-
wifi_marauder_uart_set_handle_rx_data_cb(app->uart, NULL);
117-
wifi_marauder_uart_set_handle_rx_data_cb(app->lp_uart, NULL);
118-
119166
// Automatically stop the scan when exiting view
120167
if(app->is_command) {
121168
wifi_marauder_uart_tx((uint8_t*)("stopscan\n"), strlen("stopscan\n"));
169+
furi_delay_ms(50);
122170
}
123171

172+
// Unregister rx callback
173+
wifi_marauder_uart_set_handle_rx_data_cb(app->uart, NULL);
174+
wifi_marauder_uart_set_handle_rx_data_cb(app->lp_uart, NULL);
175+
176+
wifi_marauder_script_worker_free(app->script_worker);
177+
app->script_worker = NULL;
178+
124179
app->is_writing_pcap = false;
125180
if(app->capture_file && storage_file_is_open(app->capture_file)) {
126181
storage_file_close(app->capture_file);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#include "../wifi_marauder_app_i.h"
2+
3+
void wifi_marauder_scene_script_confirm_delete_widget_callback(
4+
GuiButtonType result,
5+
InputType type,
6+
void* context) {
7+
WifiMarauderApp* app = context;
8+
if(type == InputTypeShort) {
9+
view_dispatcher_send_custom_event(app->view_dispatcher, result);
10+
}
11+
}
12+
13+
void wifi_marauder_scene_script_confirm_delete_on_enter(void* context) {
14+
WifiMarauderApp* app = context;
15+
16+
widget_add_button_element(app->widget, GuiButtonTypeLeft, "No", wifi_marauder_scene_script_confirm_delete_widget_callback, app);
17+
widget_add_button_element(app->widget, GuiButtonTypeRight, "Yes", wifi_marauder_scene_script_confirm_delete_widget_callback, app);
18+
19+
widget_add_string_element(app->widget, 0, 0, AlignLeft, AlignTop, FontPrimary, "Are you sure?");
20+
widget_add_text_box_element(
21+
app->widget,
22+
0, 12, 128, 38,
23+
AlignCenter, AlignCenter,
24+
"The script will be\npermanently deleted",
25+
false);
26+
27+
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewWidget);
28+
}
29+
30+
bool wifi_marauder_scene_script_confirm_delete_on_event(void* context, SceneManagerEvent event) {
31+
WifiMarauderApp* app = context;
32+
bool consumed = false;
33+
34+
if(event.type == SceneManagerEventTypeCustom) {
35+
// get which button press: "Yes" or "No"
36+
if(event.event == GuiButtonTypeRight) {
37+
// Yes
38+
if (app->script != NULL) {
39+
char script_path[256];
40+
snprintf(script_path, sizeof(script_path), "%s/%s.json", MARAUDER_APP_FOLDER_SCRIPTS, app->script->name);
41+
storage_simply_remove(app->storage, script_path);
42+
wifi_marauder_script_free(app->script);
43+
app->script = NULL;
44+
45+
DialogMessage* message = dialog_message_alloc();
46+
dialog_message_set_text(message, "Deleted!", 88, 32, AlignCenter, AlignCenter);
47+
dialog_message_set_icon(message, &I_DolphinCommon_56x48, 5, 6);
48+
dialog_message_set_buttons(message, NULL, "Ok", NULL);
49+
dialog_message_show(app->dialogs, message);
50+
dialog_message_free(message);
51+
}
52+
}
53+
scene_manager_previous_scene(app->scene_manager);
54+
consumed = true;
55+
}
56+
57+
return consumed;
58+
}
59+
60+
void wifi_marauder_scene_script_confirm_delete_on_exit(void* context) {
61+
WifiMarauderApp* app = context;
62+
widget_reset(app->widget);
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#include "../wifi_marauder_app_i.h"
2+
3+
static void wifi_marauder_scene_script_edit_callback(void* context, uint32_t index) {
4+
WifiMarauderApp* app = context;
5+
WifiMarauderScriptStage* current_stage = app->script->first_stage;
6+
uint32_t stage_index = 0;
7+
8+
while (current_stage != NULL && stage_index < index) {
9+
current_stage = current_stage->next_stage;
10+
stage_index++;
11+
}
12+
app->script_edit_selected_stage = current_stage;
13+
14+
if (app->script_edit_selected_stage != NULL) {
15+
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit, index);
16+
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptStageEdit);
17+
}
18+
}
19+
20+
static void wifi_marauder_scene_script_edit_add_callback(void* context, uint32_t index) {
21+
WifiMarauderApp* app = context;
22+
scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit, index);
23+
scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScriptStageAdd);
24+
}
25+
26+
void wifi_marauder_scene_script_edit_on_enter(void* context) {
27+
WifiMarauderApp* app = context;
28+
Submenu* submenu = app->submenu;
29+
WifiMarauderScript* script = app->script;
30+
submenu_set_header(submenu, script->name);
31+
32+
WifiMarauderScriptStage* current_stage = script->first_stage;
33+
int stage_index = 0;
34+
while (current_stage != NULL) {
35+
switch (current_stage->type) {
36+
case WifiMarauderScriptStageTypeScan:
37+
submenu_add_item(submenu, "Scan", stage_index, wifi_marauder_scene_script_edit_callback, app);
38+
break;
39+
case WifiMarauderScriptStageTypeSelect:
40+
submenu_add_item(submenu, "Select", stage_index, wifi_marauder_scene_script_edit_callback, app);
41+
break;
42+
case WifiMarauderScriptStageTypeDeauth:
43+
submenu_add_item(submenu, "Deauth", stage_index, wifi_marauder_scene_script_edit_callback, app);
44+
break;
45+
case WifiMarauderScriptStageTypeProbe:
46+
submenu_add_item(submenu, "Probe", stage_index, wifi_marauder_scene_script_edit_callback, app);
47+
break;
48+
case WifiMarauderScriptStageTypeSniffRaw:
49+
submenu_add_item(submenu, "Sniff raw", stage_index, wifi_marauder_scene_script_edit_callback, app);
50+
break;
51+
case WifiMarauderScriptStageTypeSniffBeacon:
52+
submenu_add_item(submenu, "Sniff beacon", stage_index, wifi_marauder_scene_script_edit_callback, app);
53+
break;
54+
case WifiMarauderScriptStageTypeSniffDeauth:
55+
submenu_add_item(submenu, "Sniff deauth", stage_index, wifi_marauder_scene_script_edit_callback, app);
56+
break;
57+
case WifiMarauderScriptStageTypeSniffEsp:
58+
submenu_add_item(submenu, "Sniff esp", stage_index, wifi_marauder_scene_script_edit_callback, app);
59+
break;
60+
case WifiMarauderScriptStageTypeSniffPmkid:
61+
submenu_add_item(submenu, "Sniff PMKID", stage_index, wifi_marauder_scene_script_edit_callback, app);
62+
break;
63+
case WifiMarauderScriptStageTypeSniffPwn:
64+
submenu_add_item(submenu, "Sniff pwn", stage_index, wifi_marauder_scene_script_edit_callback, app);
65+
break;
66+
case WifiMarauderScriptStageTypeBeaconList:
67+
submenu_add_item(submenu, "Beacon list", stage_index, wifi_marauder_scene_script_edit_callback, app);
68+
break;
69+
case WifiMarauderScriptStageTypeBeaconAp:
70+
submenu_add_item(submenu, "Beacon AP", stage_index, wifi_marauder_scene_script_edit_callback, app);
71+
break;
72+
case WifiMarauderScriptStageTypeExec:
73+
submenu_add_item(submenu, "Custom command", stage_index, wifi_marauder_scene_script_edit_callback, app);
74+
break;
75+
case WifiMarauderScriptStageTypeDelay:
76+
submenu_add_item(submenu, "Delay", stage_index, wifi_marauder_scene_script_edit_callback, app);
77+
break;
78+
}
79+
current_stage = current_stage->next_stage;
80+
stage_index++;
81+
}
82+
83+
submenu_add_item(submenu, "[+] ADD STAGE", stage_index++, wifi_marauder_scene_script_edit_add_callback, app);
84+
submenu_set_selected_item(submenu, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneScriptEdit));
85+
view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewSubmenu);
86+
}
87+
88+
bool wifi_marauder_scene_script_edit_on_event(void* context, SceneManagerEvent event) {
89+
UNUSED(context);
90+
UNUSED(event);
91+
return false;
92+
}
93+
94+
void wifi_marauder_scene_script_edit_on_exit(void* context) {
95+
WifiMarauderApp* app = context;
96+
submenu_reset(app->submenu);
97+
}

0 commit comments

Comments
 (0)