From 71543c97036d54a43eb384c4147da0d6b972c7e0 Mon Sep 17 00:00:00 2001 From: Just Call Me Koko Date: Wed, 8 Jul 2026 18:09:04 -0400 Subject: [PATCH 1/3] Add commands upload, foxhunt, list bluetooth --- esp32_marauder/CommandLine.cpp | 84 +++++++++++++++++++++++++++++--- esp32_marauder/CommandLine.h | 8 ++- esp32_marauder/MenuFunctions.cpp | 48 ++++++++++-------- 3 files changed, 109 insertions(+), 31 deletions(-) diff --git a/esp32_marauder/CommandLine.cpp b/esp32_marauder/CommandLine.cpp index fdf70fc..e50bf4b 100644 --- a/esp32_marauder/CommandLine.cpp +++ b/esp32_marauder/CommandLine.cpp @@ -275,6 +275,7 @@ void CommandLine::runCommand(String input) { Serial.println(HELP_LIST_AP_CMD_D); Serial.println(HELP_LIST_AP_CMD_E); Serial.println(HELP_LIST_AP_CMD_F); + Serial.println(HELP_LIST_AP_CMD_G); Serial.println(HELP_SEL_CMD_A); Serial.println(HELP_SSID_CMD_A); Serial.println(HELP_SSID_CMD_B); @@ -287,6 +288,7 @@ void CommandLine::runCommand(String input) { Serial.println(HELP_MAC_CMD_D); Serial.println(HELP_ADD_CMD_A); Serial.println(HELP_ADD_CMD_B); + Serial.println(HELP_UPLOAD_CMD); // Bluetooth sniff/scan #ifdef HAS_BT @@ -496,6 +498,49 @@ void CommandLine::runCommand(String input) { } } + else if (cmd_args.get(0) == UPLOAD_CMD) { + int dest_sw = this->argSearch(&cmd_args, "-d"); + String upload_dest_arg = cmd_args.get(dest_sw + 1); + int upload_dest = -1; + + if (upload_dest_arg == "wdg") + upload_dest = WDG_UPLOAD; + else if (upload_dest_arg == "wigle") + upload_dest = WIGLE_UPLOAD; + else if (upload_dest_arg == "both") + upload_dest = BOTH_UPLOAD; + + if (upload_dest > -1) { + String ssid = settings_obj.loadSetting("ClientSSID"); + String pw = settings_obj.loadSetting("ClientPW"); + + Serial.println("Connecting to " + ssid); + + if (!wifi_scan_obj.joinWiFi(ssid, pw, false)) { + Serial.println("Failed to connected to " + ssid); + return; + } + delay(1000); + for (int i = 0; i < sd_obj.sd_files->size(); i++) { + if (sd_obj.sd_files->get(i).startsWith("wardrive_") || sd_obj.sd_files->get(i).startsWith("wigle-")) { + if (!sd_obj.sd_files->get(i).endsWith(".wigle") && !sd_obj.sd_files->get(i).endsWith(".wdg") && !sd_obj.sd_files->get(i).endsWith(".gpx")) { + Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); + if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, upload_dest)) { + Serial.println("Upload OK"); + } else { + Serial.println("WiGLE failed"); + } + } + } + } + WiFi.disconnect(true); + delay(100); + wifi_scan_obj.StartScan(WIFI_SCAN_OFF, TFT_RED); + + Serial.println("Upload complete"); + } + } + else if (cmd_args.get(0) == SETTINGS_CMD) { int ss_sw = this->argSearch(&cmd_args, "-s"); // Set setting int re_sw = this->argSearch(&cmd_args, "-r"); // Reset setting @@ -538,14 +583,30 @@ void CommandLine::runCommand(String input) { // Signal strength scan if (cmd_args.get(0) == SIGSTREN_CMD) { - this->startScanFromCLI(WIFI_SCAN_SIG_STREN, TFT_MAGENTA, "Signal Strength Scan"); - /*Serial.println(STOPSCAN_CMD); - #ifdef HAS_SCREEN - display_obj.clearScreen(); - menu_function_obj.drawStatusBar(); - #endif - wifi_scan_obj.StartScan(WIFI_SCAN_SIG_STREN, TFT_MAGENTA);*/ - wifi_scan_obj.renderPacketRate(); + int bt_sw = this->argSearch(&cmd_args, "-b"); + int wf_sw = this->argSearch(&cmd_args, "-w"); + if (wf_sw > -1) { + int targ_index = cmd_args.get(wf_sw + 1).toInt(); + if (targ_index < access_points->size()) { + for (int i = 0; i < access_points->size(); i++) { + AccessPoint access_point = access_points->get(i); + access_point.selected = (i == targ_index); + access_points->set(i, access_point); + } + this->startScanFromCLI(WIFI_SCAN_SIG_STREN, TFT_GREEN, "Fox Hunt"); + } + } + else if (bt_sw > -1) { + int targ_index = cmd_args.get(bt_sw + 1).toInt(); + if (targ_index < ble_devices->size()) { + for (int i = 0; i < ble_devices->size(); i++) { + BleDevice ble_device = ble_devices->get(i); + ble_device.selected = (i == targ_index); + ble_devices->set(i, ble_device); + } + this->startScanFromCLI(BT_SCAN_FOX_HUNT, TFT_CYAN, "Bluetooth Fox Hunt"); + } + } } // Packet count else if (cmd_args.get(0) == PACKET_COUNT_CMD) { @@ -1262,6 +1323,7 @@ void CommandLine::runCommand(String input) { int at_sw = this->argSearch(&cmd_args, "-t"); int ip_sw = this->argSearch(&cmd_args, "-i"); int pr_sw = this->argSearch(&cmd_args, "-p"); + int bt_sw = this->argSearch(&cmd_args, "-b"); // List APs if (ap_sw != -1) { @@ -1276,6 +1338,12 @@ void CommandLine::runCommand(String input) { } this->showCounts(count_selected); } + else if (bt_sw != -1) { + for (int i = 0; i < ble_devices->size(); i++) { + BleDevice ble_device = ble_devices->get(i); + Serial.println("[" + (String)i + "][RSSI:" + (String)ble_device.rssi + "] " + ble_device.name); + } + } // List IPs else if (ip_sw != -1) { for (int i = 0; i < ipList->size(); i++) { diff --git a/esp32_marauder/CommandLine.h b/esp32_marauder/CommandLine.h index eaa0340..5c3fa73 100644 --- a/esp32_marauder/CommandLine.h +++ b/esp32_marauder/CommandLine.h @@ -35,6 +35,7 @@ extern Settings settings_obj; extern LedInterface led_obj; #endif extern LinkedList* access_points; +extern LinkedList* ble_devices; extern LinkedList* airtags; extern LinkedList* ssids; extern LinkedList* stations; @@ -64,7 +65,7 @@ const char PROGMEM GPS_TRACKER_CMD[] = "gpstracker"; const char PROGMEM EVIL_PORTAL_CMD[] = "evilportal"; const char PROGMEM KARMA_CMD[] = "karma"; const char PROGMEM PACKET_COUNT_CMD[] = "packetcount"; -const char PROGMEM SIGSTREN_CMD[] = "sigmon"; +const char PROGMEM SIGSTREN_CMD[] = "foxhunt"; const char PROGMEM SCAN_ALL_CMD[] = "scanall"; //const char PROGMEM SCANSTA_CMD[] = "scansta"; const char PROGMEM SNIFF_RAW_CMD[] = "sniffraw"; @@ -109,6 +110,7 @@ const char PROGMEM MAC_CMD_B[] = "randstamac"; const char PROGMEM MAC_CMD_C[] = "cloneapmac"; const char PROGMEM MAC_CMD_D[] = "clonestamac"; const char PROGMEM ADD_CMD[] = "add"; +const char PROGMEM UPLOAD_CMD[] = "upload"; // Bluetooth sniff/scan const char PROGMEM BT_SPAM_CMD[] = "blespam"; @@ -140,7 +142,7 @@ const char PROGMEM HELP_NMEA_CMD[] = "nmea"; const char PROGMEM HELP_EVIL_PORTAL_CMD[] = "evilportal [-c start [-w html.html]/sethtml ]"; const char PROGMEM HELP_KARMA_CMD[] = "karma -p "; const char PROGMEM HELP_PACKET_COUNT_CMD[] = "packetcount"; -const char PROGMEM HELP_SIGSTREN_CMD[] = "sigmon"; +const char PROGMEM HELP_SIGSTREN_CMD[] = "foxhunt -b/-w"; const char PROGMEM HELP_SCAN_ALL_CMD[] = "scanall"; //const char PROGMEM HELP_SCANSTA_CMD[] = "scansta"; const char PROGMEM HELP_SNIFF_RAW_CMD[] = "sniffraw"; @@ -169,6 +171,7 @@ const char PROGMEM HELP_LIST_AP_CMD_C[] = "list -c"; const char PROGMEM HELP_LIST_AP_CMD_D[] = "list -t"; const char PROGMEM HELP_LIST_AP_CMD_E[] = "list -i"; const char PROGMEM HELP_LIST_AP_CMD_F[] = "list -p"; +const char PROGMEM HELP_LIST_AP_CMD_G[] = "list -b"; const char PROGMEM HELP_INFO_CMD[] = "info [-a ]"; const char PROGMEM HELP_SEL_CMD_A[] = "select -a/-s/-c /-f \"equals or contains \""; const char PROGMEM HELP_SSID_CMD_A[] = "ssid -a [-g /-n ]"; @@ -182,6 +185,7 @@ const char PROGMEM HELP_MAC_CMD_C[] = "cloneapmac [-a ]"; const char PROGMEM HELP_MAC_CMD_D[] = "clonestamac [-s ]"; const char PROGMEM HELP_ADD_CMD_A[] = "add -a -b [-ch ] [-e ]"; const char PROGMEM HELP_ADD_CMD_B[] = "add -c -b -ap "; +const char PROGMEM HELP_UPLOAD_CMD[] = "upload -d "; // Bluetooth sniff/scan const char PROGMEM HELP_BT_SNIFF_CMD[] = "sniffbt [-t] "; diff --git a/esp32_marauder/MenuFunctions.cpp b/esp32_marauder/MenuFunctions.cpp index 5251255..66171b1 100644 --- a/esp32_marauder/MenuFunctions.cpp +++ b/esp32_marauder/MenuFunctions.cpp @@ -2635,13 +2635,15 @@ void MenuFunctions::RunSetup() delay(1000); for (int i = 0; i < sd_obj.sd_files->size(); i++) { if (sd_obj.sd_files->get(i).startsWith("wardrive_") || sd_obj.sd_files->get(i).startsWith("wigle-")) { - Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); - if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, WIGLE_UPLOAD)) { - display_obj.clearScreen(); - display_obj.showCenterText("WiGLE OK", TFT_HEIGHT / 2); - } else { - display_obj.clearScreen(); - display_obj.showCenterText("WiGLE failed", TFT_HEIGHT / 2); + if (!sd_obj.sd_files->get(i).endsWith(".wigle") && !sd_obj.sd_files->get(i).endsWith(".wdg") && !sd_obj.sd_files->get(i).endsWith(".gpx")) { + Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); + if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, WIGLE_UPLOAD)) { + display_obj.clearScreen(); + display_obj.showCenterText("WiGLE OK", TFT_HEIGHT / 2); + } else { + display_obj.clearScreen(); + display_obj.showCenterText("WiGLE failed", TFT_HEIGHT / 2); + } } } } @@ -2684,13 +2686,15 @@ void MenuFunctions::RunSetup() delay(1000); for (int i = 0; i < sd_obj.sd_files->size(); i++) { if (sd_obj.sd_files->get(i).startsWith("wardrive_") || sd_obj.sd_files->get(i).startsWith("wigle-")) { - Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); - if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, WDG_UPLOAD)) { - display_obj.clearScreen(); - display_obj.showCenterText("WDG OK", TFT_HEIGHT / 2); - } else { - display_obj.clearScreen(); - display_obj.showCenterText("WDG failed", TFT_HEIGHT / 2); + if (!sd_obj.sd_files->get(i).endsWith(".wigle") && !sd_obj.sd_files->get(i).endsWith(".wdg") && !sd_obj.sd_files->get(i).endsWith(".gpx")) { + Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); + if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, WDG_UPLOAD)) { + display_obj.clearScreen(); + display_obj.showCenterText("WDG OK", TFT_HEIGHT / 2); + } else { + display_obj.clearScreen(); + display_obj.showCenterText("WDG failed", TFT_HEIGHT / 2); + } } } } @@ -2733,13 +2737,15 @@ void MenuFunctions::RunSetup() delay(1000); for (int i = 0; i < sd_obj.sd_files->size(); i++) { if (sd_obj.sd_files->get(i).startsWith("wardrive_") || sd_obj.sd_files->get(i).startsWith("wigle-")) { - Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); - if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, BOTH_UPLOAD)) { - display_obj.clearScreen(); - display_obj.showCenterText("Upload OK", TFT_HEIGHT / 2); - } else { - display_obj.clearScreen(); - display_obj.showCenterText("Upload failed", TFT_HEIGHT / 2); + if (!sd_obj.sd_files->get(i).endsWith(".wigle") && !sd_obj.sd_files->get(i).endsWith(".wdg") && !sd_obj.sd_files->get(i).endsWith(".gpx")) { + Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); + if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, BOTH_UPLOAD)) { + display_obj.clearScreen(); + display_obj.showCenterText("Upload OK", TFT_HEIGHT / 2); + } else { + display_obj.clearScreen(); + display_obj.showCenterText("Upload failed", TFT_HEIGHT / 2); + } } } } From 7da914a0e16da78f055e68bbf58cb3de809bf736 Mon Sep 17 00:00:00 2001 From: Just Call Me Koko Date: Wed, 8 Jul 2026 18:35:06 -0400 Subject: [PATCH 2/3] Update banner name for fox hunt --- esp32_marauder/WiFiScan.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/esp32_marauder/WiFiScan.cpp b/esp32_marauder/WiFiScan.cpp index e02c168..4f40625 100644 --- a/esp32_marauder/WiFiScan.cpp +++ b/esp32_marauder/WiFiScan.cpp @@ -5314,7 +5314,7 @@ void WiFiScan::RunRawScan(uint8_t scan_mode, uint16_t color) { } else { display_obj.tft.setTextColor(TFT_BLACK, color); - display_obj.tft.drawCentreString("Signal Monitor", TFT_WIDTH / 2, 16, 2); + display_obj.tft.drawCentreString("Fox Hunt", TFT_WIDTH / 2, 16, 2); } #endif display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK); From 2ba9b568f3ac6ecaaf2f960061e6c76528507592 Mon Sep 17 00:00:00 2001 From: Just Call Me Koko Date: Wed, 8 Jul 2026 18:56:55 -0400 Subject: [PATCH 3/3] Direct upload not supported message --- esp32_marauder/CommandLine.cpp | 68 ++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 32 deletions(-) diff --git a/esp32_marauder/CommandLine.cpp b/esp32_marauder/CommandLine.cpp index e50bf4b..47097e1 100644 --- a/esp32_marauder/CommandLine.cpp +++ b/esp32_marauder/CommandLine.cpp @@ -499,46 +499,50 @@ void CommandLine::runCommand(String input) { } else if (cmd_args.get(0) == UPLOAD_CMD) { - int dest_sw = this->argSearch(&cmd_args, "-d"); - String upload_dest_arg = cmd_args.get(dest_sw + 1); - int upload_dest = -1; + #ifdef HAS_DIRECT_UPLOAD + int dest_sw = this->argSearch(&cmd_args, "-d"); + String upload_dest_arg = cmd_args.get(dest_sw + 1); + int upload_dest = -1; - if (upload_dest_arg == "wdg") - upload_dest = WDG_UPLOAD; - else if (upload_dest_arg == "wigle") - upload_dest = WIGLE_UPLOAD; - else if (upload_dest_arg == "both") - upload_dest = BOTH_UPLOAD; + if (upload_dest_arg == "wdg") + upload_dest = WDG_UPLOAD; + else if (upload_dest_arg == "wigle") + upload_dest = WIGLE_UPLOAD; + else if (upload_dest_arg == "both") + upload_dest = BOTH_UPLOAD; - if (upload_dest > -1) { - String ssid = settings_obj.loadSetting("ClientSSID"); - String pw = settings_obj.loadSetting("ClientPW"); + if (upload_dest > -1) { + String ssid = settings_obj.loadSetting("ClientSSID"); + String pw = settings_obj.loadSetting("ClientPW"); - Serial.println("Connecting to " + ssid); + Serial.println("Connecting to " + ssid); - if (!wifi_scan_obj.joinWiFi(ssid, pw, false)) { - Serial.println("Failed to connected to " + ssid); - return; - } - delay(1000); - for (int i = 0; i < sd_obj.sd_files->size(); i++) { - if (sd_obj.sd_files->get(i).startsWith("wardrive_") || sd_obj.sd_files->get(i).startsWith("wigle-")) { - if (!sd_obj.sd_files->get(i).endsWith(".wigle") && !sd_obj.sd_files->get(i).endsWith(".wdg") && !sd_obj.sd_files->get(i).endsWith(".gpx")) { - Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); - if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, upload_dest)) { - Serial.println("Upload OK"); - } else { - Serial.println("WiGLE failed"); + if (!wifi_scan_obj.joinWiFi(ssid, pw, false)) { + Serial.println("Failed to connected to " + ssid); + return; + } + delay(1000); + for (int i = 0; i < sd_obj.sd_files->size(); i++) { + if (sd_obj.sd_files->get(i).startsWith("wardrive_") || sd_obj.sd_files->get(i).startsWith("wigle-")) { + if (!sd_obj.sd_files->get(i).endsWith(".wigle") && !sd_obj.sd_files->get(i).endsWith(".wdg") && !sd_obj.sd_files->get(i).endsWith(".gpx")) { + Serial.println("Uploading " + sd_obj.sd_files->get(i) + "..."); + if (wifi_scan_obj.uploadFile("/" + sd_obj.sd_files->get(i), true, upload_dest)) { + Serial.println("Upload OK"); + } else { + Serial.println("WiGLE failed"); + } } } } - } - WiFi.disconnect(true); - delay(100); - wifi_scan_obj.StartScan(WIFI_SCAN_OFF, TFT_RED); + WiFi.disconnect(true); + delay(100); + wifi_scan_obj.StartScan(WIFI_SCAN_OFF, TFT_RED); - Serial.println("Upload complete"); - } + Serial.println("Upload complete"); + } + #else + Serial.println("Direct upload not supported"); + #endif } else if (cmd_args.get(0) == SETTINGS_CMD) {