Просмотр исходного кода

Added support for scan stage in automation script

tcpassos 2 лет назад
Родитель
Сommit
80ec4d1723

+ 1 - 35
applications/external/wifi_marauder_companion/scenes/wifi_marauder_scene_console_output.c

@@ -31,40 +31,6 @@ void wifi_marauder_console_output_handle_rx_packets_cb(uint8_t* buf, size_t len,
     }
 }
 
-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 wifi_marauder_script_callback(WifiMarauderScriptStage* stage, void *context) {
-    furi_assert(context);
-    WifiMarauderScriptWorker* worker = context;
-    void *stage_data;
-    char command[100];
-    const char stop_command[] = "stopscan\n";
-
-    switch (stage->type) {
-    case WifiMarauderScriptStageTypeBeaconList:
-        stage_data = stage->stage;
-        WifiMarauderScriptStageBeaconList *beacon_list = (WifiMarauderScriptStageBeaconList *)stage_data;
-        char *ssid;
-        for (int i = 0; i < beacon_list->ssid_count; i++) {
-            ssid = beacon_list->ssids[i];
-            snprintf(command, sizeof(command), "ssid -a -n \"%s\"", ssid);
-            wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
-            wifi_marauder_uart_tx((uint8_t*)("\n"), 1);
-        }
-        const char attack_command[] = "attack -t beacon -l\n";
-        wifi_marauder_uart_tx((uint8_t*)(attack_command), strlen(attack_command));
-        // Wait for the timeout in seconds to stop the attack
-        _wifi_marauder_script_delay(worker, beacon_list->timeout);
-        wifi_marauder_uart_tx((uint8_t*)(stop_command), strlen(stop_command));
-        break;
-    default:
-        break;
-    }
-}
-
 void wifi_marauder_scene_console_output_on_enter(void* context) {
     WifiMarauderApp* app = context;
 
@@ -109,7 +75,7 @@ void wifi_marauder_scene_console_output_on_enter(void* context) {
     // 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, wifi_marauder_script_callback, app->script_worker);
+        wifi_marauder_script_worker_start(app->script_worker, app->script, wifi_marauder_script_execute_stage, app->script_worker);
     }
 
     // Get ready to send command

+ 61 - 9
applications/external/wifi_marauder_companion/script/wifi_marauder_script.c

@@ -1,6 +1,9 @@
 #include "../wifi_marauder_app_i.h"
 #include "wifi_marauder_script.h"
 
+#define WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN 15
+#define WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON 60
+
 WifiMarauderScript *wifi_marauder_script_alloc() {
     WifiMarauderScript *script = (WifiMarauderScript *) malloc(sizeof(WifiMarauderScript));
     if (script == NULL) {
@@ -30,7 +33,35 @@ void _wifi_marauder_script_load_meta(WifiMarauderScript *script, cJSON *meta_sec
     }
 }
 
-WifiMarauderScriptStageBeaconList *_wifi_marauder_script_get_stage_beacon_list(cJSON *stages) {
+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* 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->timeout = scan_timeout;
+
+    return scan_stage;
+}
+
+
+WifiMarauderScriptStageBeaconList* _wifi_marauder_script_get_stage_beacon_list(cJSON *stages) {
     cJSON* stage_beaconlist = cJSON_GetObjectItem(stages, "beaconlist");
     if (stage_beaconlist == NULL) {
         return NULL;
@@ -68,23 +99,44 @@ WifiMarauderScriptStageBeaconList *_wifi_marauder_script_get_stage_beacon_list(c
     }
     // Timeout
     cJSON* timeout = cJSON_GetObjectItem(stage_beaconlist, "timeout");
-    beaconlist_stage->timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : 60;
+    beaconlist_stage->timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
     
     return beaconlist_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, WifiMarauderScriptStage *stage, WifiMarauderScriptStage **prev_stage) {
+    if (*prev_stage != NULL) {
+        (*prev_stage)->next_stage = stage;
+    } else {
+        script->first_stage = stage;
+    }
+    *prev_stage = stage;
+}
+
 void _wifi_marauder_script_load_stages(WifiMarauderScript *script, cJSON *stages) {
+    WifiMarauderScriptStage *prev_stage = NULL;
+
+    // Scan stage
+    WifiMarauderScriptStageScan *stage_scan = _wifi_marauder_script_get_stage_scan(stages);
+    if (stage_scan != NULL) {
+        WifiMarauderScriptStage *stage = _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeScan, stage_scan);
+        _wifi_marauder_script_add_stage(script, stage, &prev_stage);
+    }
+
     // Beacon List stage
     WifiMarauderScriptStageBeaconList *stage_beacon_list = _wifi_marauder_script_get_stage_beacon_list(stages);
     if (stage_beacon_list != NULL) {
-        WifiMarauderScriptStage *stage = (WifiMarauderScriptStage*) malloc(sizeof(WifiMarauderScriptStage));
-        stage->type = WifiMarauderScriptStageTypeBeaconList;
-        stage->stage = stage_beacon_list;
-        stage->next_stage = NULL;
-        script->first_stage = stage;
+        WifiMarauderScriptStage *stage = _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeBeaconList, stage_beacon_list);
+        _wifi_marauder_script_add_stage(script, stage, &prev_stage);
     }
-
-    // TODO: load stages
 }
 
 WifiMarauderScript *wifi_marauder_script_parse_raw(const char* json_raw) {

+ 60 - 0
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.c

@@ -0,0 +1,60 @@
+#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 _wifi_marauder_script_execute_scan(WifiMarauderScriptStageScan* stage, WifiMarauderScriptWorker* worker) {
+    char command[10];
+    if (stage->type == WifiMarauderScriptScanTypeAp) {
+        snprintf(command, sizeof(command), "scanap");
+    } else {
+        snprintf(command, sizeof(command), "scansta");
+    }
+    wifi_marauder_uart_tx((uint8_t*)(command), strlen(command));
+    _wifi_marauder_script_delay(worker, stage->timeout);
+    _send_stop();
+}
+
+void _wifi_marauder_script_execute_beacon_list(WifiMarauderScriptStageBeaconList* stage, WifiMarauderScriptWorker* worker) {
+    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();
+    }
+    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_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 WifiMarauderScriptStageTypeBeaconList:
+            _wifi_marauder_script_execute_beacon_list((WifiMarauderScriptStageBeaconList*)stage_data, worker);
+            break;
+        default:
+            break;
+    }
+}

+ 5 - 0
applications/external/wifi_marauder_companion/script/wifi_marauder_script_executor.h

@@ -0,0 +1,5 @@
+#pragma once
+
+#include "wifi_marauder_script.h"
+
+void wifi_marauder_script_execute_stage(WifiMarauderScriptStage* stage, void *context);

+ 1 - 0
applications/external/wifi_marauder_companion/wifi_marauder_app_i.h

@@ -9,6 +9,7 @@
 #include "wifi_marauder_pcap.h"
 #include "script/wifi_marauder_script.h"
 #include "script/wifi_marauder_script_worker.h"
+#include "script/wifi_marauder_script_executor.h"
 
 #include <gui/gui.h>
 #include <gui/view_dispatcher.h>