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

wifi_marauder_app: Top level menu works\!

0xchocolate 3 лет назад
Родитель
Сommit
f7f349ad90

+ 1 - 0
applications/meta/application.fam

@@ -17,6 +17,7 @@ App(
     name="Basic applications for main menu",
     name="Basic applications for main menu",
     apptype=FlipperAppType.METAPACKAGE,
     apptype=FlipperAppType.METAPACKAGE,
     provides=[
     provides=[
+        "wifi_marauder",
         "gpio",
         "gpio",
         "ibutton",
         "ibutton",
         "infrared",
         "infrared",

+ 11 - 0
applications/wifi_marauder_companion/application.fam

@@ -0,0 +1,11 @@
+App(
+    appid="wifi_marauder",
+    name="WIFI_MARAUDER",
+    apptype=FlipperAppType.APP,
+    entry_point="wifi_marauder_app",
+    cdefines=["APP_WIFI_MARAUDER"],
+    requires=["gui"],
+    stack_size=1 * 1024,
+    icon="A_GPIO_14",
+    order=50,
+)

+ 30 - 0
applications/wifi_marauder_companion/scenes/wifi_marauder_scene.c

@@ -0,0 +1,30 @@
+#include "wifi_marauder_scene.h"
+
+// Generate scene on_enter handlers array
+#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_enter,
+void (*const wifi_marauder_scene_on_enter_handlers[])(void*) = {
+#include "wifi_marauder_scene_config.h"
+};
+#undef ADD_SCENE
+
+// Generate scene on_event handlers array
+#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_event,
+bool (*const wifi_marauder_scene_on_event_handlers[])(void* context, SceneManagerEvent event) = {
+#include "wifi_marauder_scene_config.h"
+};
+#undef ADD_SCENE
+
+// Generate scene on_exit handlers array
+#define ADD_SCENE(prefix, name, id) prefix##_scene_##name##_on_exit,
+void (*const wifi_marauder_scene_on_exit_handlers[])(void* context) = {
+#include "wifi_marauder_scene_config.h"
+};
+#undef ADD_SCENE
+
+// Initialize scene handlers configuration structure
+const SceneManagerHandlers wifi_marauder_scene_handlers = {
+    .on_enter_handlers = wifi_marauder_scene_on_enter_handlers,
+    .on_event_handlers = wifi_marauder_scene_on_event_handlers,
+    .on_exit_handlers = wifi_marauder_scene_on_exit_handlers,
+    .scene_num = WifiMarauderSceneNum,
+};

+ 29 - 0
applications/wifi_marauder_companion/scenes/wifi_marauder_scene.h

@@ -0,0 +1,29 @@
+#pragma once
+
+#include <gui/scene_manager.h>
+
+// Generate scene id and total number
+#define ADD_SCENE(prefix, name, id) WifiMarauderScene##id,
+typedef enum {
+#include "wifi_marauder_scene_config.h"
+    WifiMarauderSceneNum,
+} WifiMarauderScene;
+#undef ADD_SCENE
+
+extern const SceneManagerHandlers wifi_marauder_scene_handlers;
+
+// Generate scene on_enter handlers declaration
+#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_enter(void*);
+#include "wifi_marauder_scene_config.h"
+#undef ADD_SCENE
+
+// Generate scene on_event handlers declaration
+#define ADD_SCENE(prefix, name, id) \
+    bool prefix##_scene_##name##_on_event(void* context, SceneManagerEvent event);
+#include "wifi_marauder_scene_config.h"
+#undef ADD_SCENE
+
+// Generate scene on_exit handlers declaration
+#define ADD_SCENE(prefix, name, id) void prefix##_scene_##name##_on_exit(void* context);
+#include "wifi_marauder_scene_config.h"
+#undef ADD_SCENE

+ 1 - 0
applications/wifi_marauder_companion/scenes/wifi_marauder_scene_config.h

@@ -0,0 +1 @@
+ADD_SCENE(wifi_marauder, start, Start)

+ 111 - 0
applications/wifi_marauder_companion/scenes/wifi_marauder_scene_start.c

@@ -0,0 +1,111 @@
+#include "../wifi_marauder_app_i.h"
+
+enum WifiMarauderItem {
+    WifiMarauderItemScan,
+    WifiMarauderItemAttack,
+    WifiMarauderItemSniff,
+    WifiMarauderItemChannel,
+    WifiMarauderItemUpdate,
+    WifiMarauderItemReboot,
+};
+
+// TODO: check if all these channels are actually supported
+#define NUM_CHANNELS (14)
+const char* const channel_select_text[NUM_CHANNELS] = {
+    "1", "2", "3", "4", "5", "6", "7",
+    "8", "9", "10", "11", "12", "13", "14",
+};
+
+static void wifi_marauder_scene_start_var_list_enter_callback(void* context, uint32_t index) {
+    furi_assert(context);
+    WifiMarauderApp* app = context;
+
+    if(index == WifiMarauderItemScan) {
+        view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderStartEventScan);
+    } else if(index == WifiMarauderItemAttack) {
+        view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderStartEventAttack);
+    } else if(index == WifiMarauderItemSniff) {
+        view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderStartEventSniff);
+    } else if(index == WifiMarauderItemUpdate) {
+        view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderStartEventUpdate);
+    } else if(index == WifiMarauderItemReboot) {
+        view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderStartEventReboot);
+    }
+}
+
+static void wifi_marauder_scene_start_var_list_change_callback(VariableItem* item) {
+    WifiMarauderApp* app = variable_item_get_context(item);
+    uint8_t index = variable_item_get_current_value_index(item);
+
+    variable_item_set_current_value_text(item, channel_select_text[index]);
+    app->selected_wifi_channel = index + 1;
+    view_dispatcher_send_custom_event(app->view_dispatcher, WifiMarauderStartEventChannel);
+}
+
+void wifi_marauder_scene_start_on_enter(void* context) {
+    WifiMarauderApp* app = context;
+    VariableItemList* var_item_list = app->var_item_list;
+
+    VariableItem* item;
+    variable_item_list_set_enter_callback(
+        var_item_list, wifi_marauder_scene_start_var_list_enter_callback, app);
+
+    variable_item_list_add(var_item_list, "Scan", 0, NULL, NULL);
+    variable_item_list_add(var_item_list, "Attack", 0, NULL, NULL);
+    variable_item_list_add(var_item_list, "Sniff", 0, NULL, NULL);
+
+    item = variable_item_list_add(
+        var_item_list,
+        "Channel",
+        NUM_CHANNELS,
+        wifi_marauder_scene_start_var_list_change_callback,
+        app);
+    // TODO: get current channel to display here
+    // don't forget that the index is channel - 1
+    variable_item_set_current_value_index(item, 0);
+    variable_item_set_current_value_text(item, channel_select_text[0]);
+
+    variable_item_list_add(var_item_list, "Update", 0, NULL, NULL);
+    variable_item_list_add(var_item_list, "Reboot", 0, NULL, NULL);
+
+    variable_item_list_set_selected_item(
+        var_item_list, scene_manager_get_scene_state(app->scene_manager, WifiMarauderSceneStart));
+
+    view_dispatcher_switch_to_view(app->view_dispatcher, WifiMarauderAppViewVarItemList);
+}
+
+bool wifi_marauder_scene_start_on_event(void* context, SceneManagerEvent event) {
+    UNUSED(context);
+    //WifiMarauderApp* app = context;
+    bool consumed = false;
+
+    if(event.type == SceneManagerEventTypeCustom) {
+        // TODO
+        // if (event.event == WifiMarauderStartEventScan) {
+        //     scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneStart, WifiMarauderItemScan);
+        //     scene_manager_next_scene(app->scene_manager, WifiMarauderSceneScan);
+        // } else if (event.event == WifiMarauderStartEventAttack) {
+        //     scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneStart, WifiMarauderItemAttack);
+        //     scene_manager_next_scene(app->scene_manager, WifiMarauderSceneAttack);
+        // } else if (event.event == WifiMarauderStartEventSniff) {
+        //     scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneStart, WifiMarauderItemSniff);
+        //     scene_manager_next_scene(app->scene_manager, WifiMarauderSceneSniff);
+        // } else if (event.event == WifiMarauderStartEventUpdate) {
+        //     scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneStart, WifiMarauderItemUpdate);
+        //     scene_manager_next_scene(app->scene_manager, WifiMarauderSceneUpdate);
+        // } else if (event.event == WifiMarauderStartEventReboot) {
+        //     scene_manager_set_scene_state(app->scene_manager, WifiMarauderSceneStart, WifiMarauderItemReboot);
+        //     scene_manager_next_scene(app->scene_manager, WifiMarauderSceneReboot);
+        // } else if (event.event == WifiMarauderStartEventChannel) {
+        //     // TODO: Send app->selected_wifi_channel to UART
+        // }
+        consumed = true;
+    }
+
+    return consumed;
+}
+
+void wifi_marauder_scene_start_on_exit(void* context) {
+    WifiMarauderApp* app = context;
+    variable_item_list_reset(app->var_item_list);
+}

+ 90 - 0
applications/wifi_marauder_companion/wifi_marauder_app.c

@@ -0,0 +1,90 @@
+#include "wifi_marauder_app_i.h"
+
+#include <furi.h>
+#include <furi_hal.h>
+
+static bool wifi_marauder_app_custom_event_callback(void* context, uint32_t event) {
+    furi_assert(context);
+    WifiMarauderApp* app = context;
+    return scene_manager_handle_custom_event(app->scene_manager, event);
+}
+
+static bool wifi_marauder_app_back_event_callback(void* context) {
+    furi_assert(context);
+    WifiMarauderApp* app = context;
+    return scene_manager_handle_back_event(app->scene_manager);
+}
+
+static void wifi_marauder_app_tick_event_callback(void* context) {
+    furi_assert(context);
+    WifiMarauderApp* app = context;
+    scene_manager_handle_tick_event(app->scene_manager);
+}
+
+WifiMarauderApp* wifi_marauder_app_alloc() {
+    WifiMarauderApp* app = malloc(sizeof(WifiMarauderApp));
+
+    app->selected_wifi_channel = 1;
+
+    app->gui = furi_record_open("gui");
+
+    app->view_dispatcher = view_dispatcher_alloc();
+    app->scene_manager = scene_manager_alloc(&wifi_marauder_scene_handlers, app);
+    view_dispatcher_enable_queue(app->view_dispatcher);
+    view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
+
+    view_dispatcher_set_custom_event_callback(
+        app->view_dispatcher, wifi_marauder_app_custom_event_callback);
+    view_dispatcher_set_navigation_event_callback(
+        app->view_dispatcher, wifi_marauder_app_back_event_callback);
+    view_dispatcher_set_tick_event_callback(
+        app->view_dispatcher, wifi_marauder_app_tick_event_callback, 100);
+
+    view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
+
+    app->var_item_list = variable_item_list_alloc();
+    view_dispatcher_add_view(
+        app->view_dispatcher,
+        WifiMarauderAppViewVarItemList,
+        variable_item_list_get_view(app->var_item_list));
+
+    // TODO add other views
+
+    scene_manager_next_scene(app->scene_manager, WifiMarauderSceneStart);
+
+    return app;
+}
+
+void wifi_marauder_app_free(WifiMarauderApp* app) {
+    furi_assert(app);
+
+    // Views
+    view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewVarItemList);
+    // TODO add back
+    // view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewScan);
+    // view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewAttack);
+    // view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewSniff);
+    // view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewChannel);
+    // view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewUpdate);
+    // view_dispatcher_remove_view(app->view_dispatcher, WifiMarauderAppViewReboot);
+
+    // View dispatcher
+    view_dispatcher_free(app->view_dispatcher);
+    scene_manager_free(app->scene_manager);
+
+    // Close records
+    furi_record_close("gui");
+
+    free(app);
+}
+
+int32_t wifi_marauder_app(void* p) {
+    UNUSED(p);
+    WifiMarauderApp* wifi_marauder_app = wifi_marauder_app_alloc();
+
+    view_dispatcher_run(wifi_marauder_app->view_dispatcher);
+
+    wifi_marauder_app_free(wifi_marauder_app);
+
+    return 0;
+}

+ 11 - 0
applications/wifi_marauder_companion/wifi_marauder_app.h

@@ -0,0 +1,11 @@
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct WifiMarauderApp WifiMarauderApp;
+
+#ifdef __cplusplus
+}
+#endif

+ 52 - 0
applications/wifi_marauder_companion/wifi_marauder_app_i.h

@@ -0,0 +1,52 @@
+#pragma once
+
+#include "wifi_marauder_app.h"
+#include "scenes/wifi_marauder_scene.h"
+#include "wifi_marauder_custom_event.h"
+
+#include <gui/gui.h>
+#include <gui/view_dispatcher.h>
+#include <gui/scene_manager.h>
+#include <gui/modules/submenu.h>
+#include <gui/modules/variable_item_list.h>
+
+struct WifiMarauderApp {
+    Gui* gui;
+    ViewDispatcher* view_dispatcher;
+    SceneManager* scene_manager;
+
+    VariableItemList* var_item_list;
+
+    int selected_wifi_channel;
+};
+
+// Supported commands:
+// https://github.com/justcallmekoko/ESP32Marauder/wiki/cli
+//   Scan
+//    -> If list is empty, then start a new scanap. (Tap any button to stop.)
+//    -> If there's a list, provide option to rescan and dump list of targets to select.
+//    -> Press BACK to go back to top-level.
+//   Attack
+//    -> Beacon
+//    -> Deauth
+//    -> Probe
+//    -> Rickroll
+//   Sniff
+//    -> Beacon
+//    -> Deauth
+//    -> ESP
+//    -> PMKID
+//    -> Pwnagotchi
+//   Channel
+//   Update
+//   Reboot
+
+typedef enum {
+    WifiMarauderAppViewVarItemList,
+    WifiMarauderAppViewScan,
+    WifiMarauderAppViewAttack,
+    WifiMarauderAppViewSniff,
+    WifiMarauderAppViewChannel,
+    WifiMarauderAppViewUpdate,
+    WifiMarauderAppViewReboot,
+} WifiMarauderAppView;

+ 10 - 0
applications/wifi_marauder_companion/wifi_marauder_custom_event.h

@@ -0,0 +1,10 @@
+#pragma once
+
+typedef enum {
+    WifiMarauderStartEventScan = 0,
+    WifiMarauderStartEventAttack,
+    WifiMarauderStartEventSniff,
+    WifiMarauderStartEventUpdate,
+    WifiMarauderStartEventReboot,
+    WifiMarauderStartEventChannel,
+} WifiMarauderCustomEvent;

+ 12 - 0
applications/wifi_marauder_companion/wifi_marauder_uart.c

@@ -0,0 +1,12 @@
+#include "wifi_marauder_uart.h"
+
+const FuriHalUartId UART_CH = FuriHalUartIdUSART1;
+const int BAUDRATE = 115200;
+
+void wifi_marauder_uart_tx(uint8_t *data, size_t len) {
+    furi_hal_uart_tx(UART_CH, data, len);
+}
+
+void wifi_marauder_uart_init() {
+    furi_hal_uart_init(UART_CH, BAUDRATE);
+}

+ 6 - 0
applications/wifi_marauder_companion/wifi_marauder_uart.h

@@ -0,0 +1,6 @@
+#pragma once
+
+#include "furi_hal.h"
+
+void wifi_marauder_uart_tx(uint8_t *data, size_t len);
+void wifi_marauder_uart_init();