Compare commits

...

112 Commits

Author SHA1 Message Date
Just Call Me Koko
4fb65cd186 Merge pull request #1081 from justcallmekoko/develop
Remove verbose print statements
2026-01-25 17:46:33 -05:00
Just Call Me Koko
419dd434e5 Remove verbose print statements 2026-01-25 17:16:15 -05:00
Just Call Me Koko
44f51d2f70 Merge pull request #1077 from justcallmekoko/develop
Add prints
2026-01-25 01:18:47 -05:00
Just Call Me Koko
c4c652741e Adjust IDF versions for standard ESP32 2026-01-25 00:38:21 -05:00
Just Call Me Koko
4ec9d50562 Adjust IDF version 2026-01-24 23:02:40 -05:00
Just Call Me Koko
014cae1cb0 Fix macros 2026-01-24 11:13:19 -05:00
Just Call Me Koko
832e99cccd Only v6 NimBLE update 2026-01-24 11:06:50 -05:00
Just Call Me Koko
1648effcb2 Add prints 2026-01-23 22:31:53 -05:00
Just Call Me Koko
a1b02691d0 Merge pull request #1075 from justcallmekoko/develop
Update all standard ESP32 NimBLE
2026-01-23 16:01:50 -05:00
Just Call Me Koko
85c4802322 Update NimBLE in nightly build workflow 2026-01-23 15:46:28 -05:00
Just Call Me Koko
4ea8a44931 Update NimBLE in build workflow 2026-01-23 15:35:50 -05:00
Just Call Me Koko
f82b6c5ce3 Update all standard ESP32 NimBLE 2026-01-23 15:21:15 -05:00
Just Call Me Koko
a54a311995 Merge pull request #1073 from justcallmekoko/develop
Fix airtag sniffing crash
2026-01-22 21:09:52 -05:00
Just Call Me Koko
e689858891 Fix airtag sniffing crash 2026-01-22 18:58:08 -05:00
Just Call Me Koko
ebcfc9392e Merge pull request #1072 from justcallmekoko/develop
Bluetooth can deinit on ESP32 C5
2026-01-22 09:48:27 -05:00
Just Call Me Koko
9173785218 Bluetooth can deinit on ESP32 C5 2026-01-22 09:17:16 -05:00
Just Call Me Koko
64f6b4c582 Merge pull request #1071 from justcallmekoko/develop
Update NimBLE for ESP32-C5
2026-01-22 08:42:36 -05:00
Just Call Me Koko
6d2d1d7a0d Update NimBLE for ESP32-C5 2026-01-21 21:24:20 -05:00
Just Call Me Koko
467c58fef3 Merge pull request #1067 from justcallmekoko/develop
Add commands for SAE sniff and attack
2026-01-20 11:38:41 -05:00
Just Call Me Koko
52eea5f4f7 Add commands for SAE sniff and attack 2026-01-20 11:15:05 -05:00
Just Call Me Koko
2430db99b3 Merge pull request #1066 from justcallmekoko/develop
Output SAE attack stats
2026-01-19 22:54:30 -05:00
Just Call Me Koko
1ed63e3386 Output SAE attack stats 2026-01-19 22:49:28 -05:00
Just Call Me Koko
0196c00220 Merge pull request #1065 from justcallmekoko/develop
Add SAE sniff and SAE spam attack
2026-01-19 20:24:55 -05:00
Just Call Me Koko
6456527f5f Sniff SAE tokens while attacking 2026-01-19 19:15:18 -05:00
Just Call Me Koko
e7e8fc7d80 Add SAE commit sniff and attack 2026-01-19 16:20:27 -05:00
Just Call Me Koko
5fdf09c8fa Adjust capture of ACT 2026-01-18 14:23:18 -05:00
Just Call Me Koko
af9938f8eb Merge pull request #1059 from justcallmekoko/develop
Capture and parse SAE commit frames
2026-01-17 10:26:37 -05:00
Just Call Me Koko
14e18a12bf Capture and parse SAE commit frames 2026-01-17 10:14:51 -05:00
Just Call Me Koko
0ba3d0f60a Merge pull request #1056 from justcallmekoko/develop
Remove v7.1 from build list
2026-01-15 16:47:16 -05:00
Just Call Me Koko
d94a059b81 Remove v7.1 from build list 2026-01-15 16:12:44 -05:00
Just Call Me Koko
140668448f Merge pull request #1055 from justcallmekoko/develop
Remove continuous BT wardrive
2026-01-14 10:03:10 -05:00
Just Call Me Koko
18e582b9a9 Remove continuous BT wardrive 2026-01-14 09:47:41 -05:00
Just Call Me Koko
961bcb6cf5 Merge pull request #1052 from justcallmekoko/develop
Fix PCAPs not saving for MAC tracker
2026-01-13 15:42:46 -05:00
Just Call Me Koko
2fa969552a Remove frame check print 2026-01-13 15:23:48 -05:00
Just Call Me Koko
e4528d9dea Fix tracking not saving PCAPs 2026-01-13 14:33:31 -05:00
Just Call Me Koko
774d5f0707 Merge pull request #1050 from justcallmekoko/develop
Update Sour Apple
2026-01-13 08:13:54 -05:00
Just Call Me Koko
bab011e618 Refactor sour apple 2026-01-13 07:37:59 -05:00
Just Call Me Koko
07a684a03e Merge pull request #1045 from justcallmekoko/develop
Following MACs save PCAPs
2026-01-11 14:24:16 -05:00
Just Call Me Koko
cbb2d33f24 Following MACs save PCAPs 2026-01-11 14:01:19 -05:00
Just Call Me Koko
3bb45c1ff3 Fix not saving APs during wardrive 2026-01-11 13:01:32 -05:00
Just Call Me Koko
e3fe40ede0 Merge pull request #1043 from justcallmekoko/develop
Fix distance threshold
2026-01-11 00:39:49 -05:00
Just Call Me Koko
b09be1c093 Fix distance threshold 2026-01-10 22:32:30 -05:00
Just Call Me Koko
8e0ed07483 Merge pull request #1042 from justcallmekoko/develop
Oopsie
2026-01-09 23:02:25 -05:00
Just Call Me Koko
0ff6411407 Oopsie 2026-01-09 22:57:35 -05:00
Just Call Me Koko
249ba6eabe Merge pull request #1041 from justcallmekoko/develop
MAC track BLE and revamp wardrive UI
2026-01-09 17:41:00 -05:00
Just Call Me Koko
7a19fcb458 MAC track BLE and revamp wardrive UI 2026-01-09 17:32:56 -05:00
Just Call Me Koko
88762063ff Merge pull request #1040 from justcallmekoko/develop
Add CLI command for MAC tracking
2026-01-08 12:45:44 -05:00
Just Call Me Koko
26370241ee Add CLI command for MAC tracking 2026-01-08 12:40:54 -05:00
Just Call Me Koko
9d2a1ab3aa Merge pull request #1036 from justcallmekoko/develop
GPS now operates at 115200 baud
2026-01-07 17:51:54 -05:00
Just Call Me Koko
6a360b236c GPS now operates at 115200 baud 2026-01-07 17:44:41 -05:00
Just Call Me Koko
a20b25a39c Merge pull request #1034 from justcallmekoko/develop
Fix eviction criteria and work mini displays
2026-01-06 16:35:03 -05:00
Just Call Me Koko
cb4a6cd51e Fix eviction criteria and work mini displays 2026-01-06 13:47:06 -05:00
Just Call Me Koko
a785a3b125 Merge pull request #1033 from justcallmekoko/develop
Add MAC tracking backend
2026-01-05 20:55:24 -05:00
Just Call Me Koko
7a7c01512b Fix non-display hardware 2026-01-05 20:29:42 -05:00
Just Call Me Koko
60f446245d Add location for MAC tracking 2026-01-05 19:02:02 -05:00
Just Call Me Koko
fb73afd359 Add backend for MAC tracking 2026-01-05 00:17:49 -05:00
Just Call Me Koko
337cf18dac Add menu item for mac monitor 2026-01-04 03:03:50 -05:00
Just Call Me Koko
380875d32f Merge pull request #1029 from justcallmekoko/develop
Update version number
2026-01-03 14:50:37 -05:00
Just Call Me Koko
ae79653628 Update version number 2026-01-03 14:44:51 -05:00
Just Call Me Koko
d03c079080 Merge pull request #1028 from justcallmekoko/develop
Fix wardriving function on CLI
2026-01-03 14:29:58 -05:00
Just Call Me Koko
70154f5074 Fix wardriving function on CLI 2026-01-03 14:19:36 -05:00
Just Call Me Koko
8ef5cf3b92 Merge pull request #1015 from justcallmekoko/develop
Faster display buffer
2025-12-13 14:48:34 -05:00
Just Call Me Koko
b3eade1e06 Faster display buffer 2025-12-13 14:43:08 -05:00
Just Call Me Koko
1dd5502c1d Merge pull request #1012 from justcallmekoko/develop
Fix crash during BT wardrive
2025-12-12 18:11:10 -05:00
Just Call Me Koko
1862a5b812 Fix crash during BT wardrive 2025-12-12 18:06:07 -05:00
Just Call Me Koko
f5375eedaf Merge pull request #1006 from justcallmekoko/develop
Wardriving is asynchronous now
2025-12-08 16:45:31 -05:00
Just Call Me Koko
2910addb8a Ensure async wardrive 2025-12-08 16:32:25 -05:00
Just Call Me Koko
be3971d081 Wardriving is async 2025-12-08 15:40:24 -05:00
Just Call Me Koko
86e2fb206a Merge pull request #1005 from justcallmekoko/develop
Add wifi to flock wardrive
2025-12-08 15:10:53 -05:00
Just Call Me Koko
431fa175a0 Update WiFiScan.cpp 2025-12-08 15:04:09 -05:00
Just Call Me Koko
976687980c Add wifi to flock wardrive 2025-12-08 14:53:55 -05:00
Just Call Me Koko
1d419605f7 Merge pull request #1001 from justcallmekoko/develop
Fix menu navigation for back button
2025-12-04 18:36:50 -05:00
Just Call Me Koko
1624d98183 Fix menu navigation for back button 2025-12-04 18:12:28 -05:00
Just Call Me Koko
dfd556da30 Merge pull request #999 from justcallmekoko/develop
Update NimBLE version in actions
2025-12-02 01:09:42 -05:00
Just Call Me Koko
9681076542 Update C5 FBQN 2025-12-02 01:00:16 -05:00
Just Call Me Koko
86d35cba6a Update NimBLE version in actions 2025-12-02 00:49:20 -05:00
Just Call Me Koko
03623e2985 Merge pull request #998 from justcallmekoko/develop
Update arduino esp32
2025-12-02 00:14:12 -05:00
Just Call Me Koko
fb2b33d538 Maybe I should learn something 2025-12-02 00:09:43 -05:00
Just Call Me Koko
5e47927969 Update arduino esp32 2025-12-02 00:02:34 -05:00
Just Call Me Koko
4e7f48a036 Merge pull request #997 from justcallmekoko/develop
Add 5ghz channels for c5 packet injection
2025-12-01 18:44:52 -05:00
Just Call Me Koko
d7d2b28f9e Add 5ghz channels for c5 packet injection 2025-12-01 18:37:43 -05:00
Just Call Me Koko
722b9ad88e Merge pull request #996 from justcallmekoko/develop
Merge develop
2025-12-01 01:44:59 -05:00
Just Call Me Koko
5d188bfa62 Merge pull request #995 from justcallmekoko/NimBLE-2.0
Add Bluetooth to C5 hardware
2025-12-01 01:37:32 -05:00
Just Call Me Koko
576601fd21 Fix non-UI hardware 2025-11-30 22:38:47 -05:00
Just Call Me Koko
dc2dd414eb Clean up dead code 2025-11-30 22:03:34 -05:00
Just Call Me Koko
5439fc7ceb Fix flock sniffer 2025-11-29 04:18:35 -05:00
Just Call Me Koko
84416970e7 Remove LVGL completely 2025-11-27 03:08:04 -05:00
Just Call Me Koko
ba67c63010 Add wifi filter for flock 2025-11-26 23:59:15 -05:00
Just Call Me Koko
e4458ad1e6 Add TFT_eSPI keyboard 2025-11-26 20:22:44 -05:00
Just Call Me Koko
6c996a489f Remove unused LVGL code 2025-11-26 18:02:19 -05:00
Just Call Me Koko
d3ce284ea4 Save more flash space 2025-11-26 00:26:03 -05:00
Just Call Me Koko
eab60701d5 Clean up callback methods 2025-11-25 19:12:36 -05:00
Just Call Me Koko
30893adaa5 Bring bluetooth to ESP32-C5 2025-11-25 17:46:14 -05:00
Just Call Me Koko
2c0868e893 Start NimBLE Migration 2025-11-25 01:26:24 -05:00
Just Call Me Koko
0a5e200294 Merge pull request #990 from justcallmekoko/develop
Add Flock wardriving
2025-11-24 13:27:21 -05:00
Just Call Me Koko
0fba6966a6 Fix for non bluetooth hardware 2025-11-24 13:20:01 -05:00
Just Call Me Koko
b714f274b5 Add Flock wardriving 2025-11-24 13:07:20 -05:00
Just Call Me Koko
e5c6c6906e Merge pull request #989 from H4W9/MAC_CLI_Command
Add MAC Address CLI commands
2025-11-24 11:59:34 -05:00
H4W9
ccf7cd1493 Update CommandLine.cpp
Seriously, gotta filter em...
2025-11-24 07:49:14 -06:00
H4W9
a1ff26a9d2 Update CommandLine.cpp
Add the command actions
2025-11-24 01:44:30 -06:00
H4W9
57f867a8ec Update CommandLine.h
correction
2025-11-23 22:56:02 -06:00
H4W9
c901ade02c Update CommandLine.h
Finished what I started...
2025-11-23 19:18:23 -06:00
H4W9
aee56f879f Update CommandLine.cpp
more
2025-11-23 19:16:04 -06:00
H4W9
0535646ba8 Update CommandLine.h
Add MAC cli commands
2025-11-23 18:55:32 -06:00
Just Call Me Koko
cd3ab51080 Add flock command and icon 2025-11-23 07:41:31 -05:00
Just Call Me Koko
b6d1ce7a37 Compensate for NimBLE memory leak 2025-11-23 07:03:34 -05:00
Just Call Me Koko
9d51b91ad3 Merge pull request #986 from justcallmekoko/develop
Fix flock scan memory leak
2025-11-22 17:05:00 -05:00
Just Call Me Koko
018bddae6a Fix flock scan memory leak 2025-11-22 16:58:55 -05:00
Just Call Me Koko
b014332169 Merge pull request #985 from justcallmekoko/develop
Add Flock penguin battery scanner
2025-11-22 11:27:35 -05:00
Just Call Me Koko
5079a05458 Fix for non BT device 2025-11-22 11:10:45 -05:00
Just Call Me Koko
c002aee646 Add Flock Penguin battery scanner 2025-11-22 11:04:05 -05:00
Just Call Me Koko
5afcb9da61 Move tag name to new step 2025-11-13 09:50:44 -05:00
26 changed files with 5138 additions and 2624 deletions

View File

@@ -19,24 +19,23 @@ jobs:
board:
- { name: "Flipper Zero WiFi Dev Board", flag: "MARAUDER_FLIPPER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "flipper", tft: false, tft_file: "", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Flipper Zero Multi Board S3", flag: "MARAUDER_MULTIBOARD_S3", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=4M", file_name: "multiboardS3", tft: false, tft_file: "", build_dir: "esp32s3", addr: "0x0", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "OG Marauder", flag: "MARAUDER_V4", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "old_hardware", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6", flag: "MARAUDER_V6", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6.1", flag: "MARAUDER_V6_1", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6_1", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Kit", flag: "MARAUDER_KIT", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "kit", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Mini", flag: "MARAUDER_MINI", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "mini", tft: true, tft_file: "User_Setup_marauder_mini.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32 LDDB", flag: "ESP32_LDDB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "esp32_lddb", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Dev Board Pro", flag: "MARAUDER_DEV_BOARD_PRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_dev_board_pro", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "OG Marauder", flag: "MARAUDER_V4", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "old_hardware", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6", flag: "MARAUDER_V6", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6.1", flag: "MARAUDER_V6_1", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6_1", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Kit", flag: "MARAUDER_KIT", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "kit", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Mini", flag: "MARAUDER_MINI", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "mini", tft: true, tft_file: "User_Setup_marauder_mini.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32 LDDB", flag: "ESP32_LDDB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "esp32_lddb", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Dev Board Pro", flag: "MARAUDER_DEV_BOARD_PRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_dev_board_pro", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5StickCPlus", flag: "MARAUDER_M5STICKC", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus", tft: true, tft_file: "User_Setup_marauder_m5stickc.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5StickCPlus 2", flag: "MARAUDER_M5STICKCP2", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus2", tft: true, tft_file: "User_Setup_marauder_m5stickcp2.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Rev Feather", flag: "MARAUDER_REV_FEATHER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "rev_feather", tft: true, tft_file: "User_Setup_marauder_rev_feather.h", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7", flag: "MARAUDER_V7", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_v7", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7", flag: "MARAUDER_V7", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_v7", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028", flag: "MARAUDER_CYD_MICRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028", tft: true, tft_file: "User_Setup_cyd_micro.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S024 GUITION", flag: "MARAUDER_CYD_GUITION", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S024_guition", tft: true, tft_file: "User_Setup_cyd_guition.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028 2 USB", flag: "MARAUDER_CYD_2USB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028_2usb", tft: true, tft_file: "User_Setup_cyd_2usb.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 3.5inch", flag: "MARAUDER_CYD_3_5_INCH", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_3_5_inch", tft: true, tft_file: "User_Setup_cyd_3_5_inch.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7.1", flag: "MARAUDER_V7_1", fbqn: "esp32:esp32:dfrobot_firebeetle2_esp32e:FlashSize=16M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "marauder_v7_1", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "dfrobot_firebeetle2_esp32e", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5Cardputer", flag: "MARAUDER_CARDPUTER", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=8M,PSRAM=disabled", file_name: "m5cardputer", tft: true, tft_file: "User_Setup_marauder_m5cardputer.h", build_dir: "esp32s3", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32-C5-DevKitC-1", flag: "MARAUDER_C5", fbqn: "esp32:esp32:esp32c5:PartitionScheme=min_spiffs", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.0", nimble_ver: "2.3.0", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32-C5-DevKitC-1", flag: "MARAUDER_C5", fbqn: "esp32:esp32:esp32c5:FlashSize=8M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
steps:
- name: Checkout Code
@@ -212,7 +211,7 @@ jobs:
done
fi
if [[ ${{ matrix.board.idf_ver }} == "3.3.0" ]]; then
if [[ ${{ matrix.board.idf_ver }} == "3.3.4" ]]; then
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
sed -i 's/compiler.c.elf.extra_flags=/compiler.c.elf.extra_flags=-Wl,-zmuldefs /' "$i"
done
@@ -242,7 +241,6 @@ jobs:
- name: Rename and Upload ${{ matrix.board.name }} Artifact
run: |
VERSION=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/' | tr '.' '_')
VERSION_DOT=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/')
DATE=$(date +%Y%m%d)
BUILD_DIR=./esp32_marauder/build/esp32.esp32.${{ matrix.board.build_dir }}
@@ -254,7 +252,6 @@ jobs:
echo "artifact_name=$OUTPUT_BIN" >> $GITHUB_ENV
echo "artifact_path=$BUILD_DIR/$OUTPUT_BIN" >> $GITHUB_ENV
echo "version_dot=$VERSION_DOT" >> $GITHUB_ENV
- name: Upload ${{ matrix.board.name }} Artifact
uses: actions/upload-artifact@v4
with:
@@ -272,12 +269,18 @@ jobs:
- uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Get Tag Version
run: |
VERSION_DOT=$(grep '#define MARAUDER_VERSION' ./esp32_marauder/configs.h | sed -E 's/.*"v([^"]+)"/v\1/')
echo "version_dot=$VERSION_DOT" >> $GITHUB_ENV
- name: Create Release
uses: softprops/action-gh-release@v1
with:
name: "Marauder Release ${{ github.ref_name }}"
tag_name: ${{ env.version_dot }}
generate_release_notes: true
generate_release_notes: false
draft: true
files: |
esp32_marauder_v*.bin

View File

@@ -68,24 +68,23 @@ jobs:
board:
- { name: "Flipper Zero WiFi Dev Board", flag: "MARAUDER_FLIPPER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "flipper", tft: false, tft_file: "", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Flipper Zero Multi Board S3", flag: "MARAUDER_MULTIBOARD_S3", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=4M", file_name: "multiboardS3", tft: false, tft_file: "", build_dir: "esp32s3", addr: "0x0", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "OG Marauder", flag: "MARAUDER_V4", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "old_hardware", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6", flag: "MARAUDER_V6", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6.1", flag: "MARAUDER_V6_1", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6_1", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Kit", flag: "MARAUDER_KIT", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "kit", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Mini", flag: "MARAUDER_MINI", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "mini", tft: true, tft_file: "User_Setup_marauder_mini.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32 LDDB", flag: "ESP32_LDDB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "esp32_lddb", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Dev Board Pro", flag: "MARAUDER_DEV_BOARD_PRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_dev_board_pro", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "OG Marauder", flag: "MARAUDER_V4", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "old_hardware", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6", flag: "MARAUDER_V6", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v6.1", flag: "MARAUDER_V6_1", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "v6_1", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Kit", flag: "MARAUDER_KIT", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "kit", tft: true, tft_file: "User_Setup_og_marauder.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Mini", flag: "MARAUDER_MINI", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "mini", tft: true, tft_file: "User_Setup_marauder_mini.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32 LDDB", flag: "ESP32_LDDB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "esp32_lddb", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder Dev Board Pro", flag: "MARAUDER_DEV_BOARD_PRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_dev_board_pro", tft: false, tft_file: "", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5StickCPlus", flag: "MARAUDER_M5STICKC", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus", tft: true, tft_file: "User_Setup_marauder_m5stickc.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5StickCPlus 2", flag: "MARAUDER_M5STICKCP2", fbqn: "esp32:esp32:m5stick-c:PartitionScheme=min_spiffs", file_name: "m5stickc_plus2", tft: true, tft_file: "User_Setup_marauder_m5stickcp2.h", build_dir: "m5stick-c", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Rev Feather", flag: "MARAUDER_REV_FEATHER", fbqn: "esp32:esp32:esp32s2:PartitionScheme=min_spiffs,FlashSize=4M,PSRAM=enabled", file_name: "rev_feather", tft: true, tft_file: "User_Setup_marauder_rev_feather.h", build_dir: "esp32s2", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7", flag: "MARAUDER_V7", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_v7", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7", flag: "MARAUDER_V7", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "marauder_v7", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "d32", addr: "0x1000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028", flag: "MARAUDER_CYD_MICRO", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028", tft: true, tft_file: "User_Setup_cyd_micro.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S024 GUITION", flag: "MARAUDER_CYD_GUITION", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S024_guition", tft: true, tft_file: "User_Setup_cyd_guition.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 2432S028 2 USB", flag: "MARAUDER_CYD_2USB", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_2432S028_2usb", tft: true, tft_file: "User_Setup_cyd_2usb.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder CYD 3.5inch", flag: "MARAUDER_CYD_3_5_INCH", fbqn: "esp32:esp32:d32:PartitionScheme=min_spiffs", file_name: "cyd_3_5_inch", tft: true, tft_file: "User_Setup_cyd_3_5_inch.h", build_dir: "d32", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "Marauder v7.1", flag: "MARAUDER_V7_1", fbqn: "esp32:esp32:dfrobot_firebeetle2_esp32e:FlashSize=16M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "marauder_v7_1", tft: true, tft_file: "User_Setup_dual_nrf24.h", build_dir: "dfrobot_firebeetle2_esp32e", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "M5Cardputer", flag: "MARAUDER_CARDPUTER", fbqn: "esp32:esp32:esp32s3:PartitionScheme=min_spiffs,FlashSize=8M,PSRAM=disabled", file_name: "m5cardputer", tft: true, tft_file: "User_Setup_marauder_m5cardputer.h", build_dir: "esp32s3", addr: "0x1000", idf_ver: "2.0.11", nimble_ver: "1.3.8", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32-C5-DevKitC-1", flag: "MARAUDER_C5", fbqn: "esp32:esp32:esp32c5:PartitionScheme=min_spiffs", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.0", nimble_ver: "2.3.0", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
- { name: "ESP32-C5-DevKitC-1", flag: "MARAUDER_C5", fbqn: "esp32:esp32:esp32c5:FlashSize=8M,PartitionScheme=min_spiffs,PSRAM=enabled", file_name: "esp32c5devkitc1", tft: false, tft_file: "", build_dir: "esp32c5", addr: "0x2000", idf_ver: "3.3.4", nimble_ver: "master", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
steps:
- name: Checkout Code
@@ -252,7 +251,7 @@ jobs:
done
fi
if [[ ${{ matrix.board.idf_ver }} == "3.3.0" ]]; then
if [[ ${{ matrix.board.idf_ver }} == "3.3.4" ]]; then
for i in $(find /home/runner/.arduino15/packages/esp32/hardware/esp32/ -name "platform.txt"); do
sed -i 's/compiler.c.elf.extra_flags=/compiler.c.elf.extra_flags=-Wl,-zmuldefs /' "$i"
done

1
FlashFiles/flash_cmd.txt Normal file
View File

@@ -0,0 +1 @@
./esptool.exe --chip esp32 --port COM4 --baud 921600 write_flash -z 0x1000 /c/Users/culrP/Downloads/esp32_marauder.ino.bootloader.bin 0x8000 /c/Users/culrP/Downloads/esp32_marauder.ino.partitions.bin 0xE000 /c/Users/culrP/Downloads/boot_app0.bin 0x10000 /c/Users/culrP/Downloads/esp32_marauder_v1_8_9_20251030_v6_1.bin

View File

@@ -169,9 +169,9 @@
#define TFT_DC 16 // Data Command control pin
#define TFT_RST 5 // Reset pin (could connect to NodeMCU RST, see next line)
#define TOUCH_CS -1
//#define TFT_MISO 19
//#define TFT_MOSI 23
//#define TFT_SCLK 18
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
//#define TFT_BL 32
/*

View File

@@ -233,6 +233,12 @@ PROGMEM static const unsigned char menu_icons[][66] = {
0x7B, 0x3E, 0x37, 0x7B, 0xBF, 0x37, 0xFB, 0xF7, 0x37, 0xFB, 0xF7, 0x37,
0xFB, 0xF3, 0x37, 0xBB, 0x7F, 0x37, 0x37, 0x3F, 0x3B, 0x77, 0x80, 0x3B,
0xEF, 0xE1, 0x3D, 0xDF, 0xFF, 0x3E, 0x3F, 0x3F, 0x3F, 0xFF, 0xC0, 0x3F,
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F},
{0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x3F, 0x3F, 0x9F, 0x3F, 0xBF, 0xBF, 0x3F, // FLOCK: 41
0xDF, 0x71, 0x3F, 0xDF, 0x6E, 0x3F, 0xDF, 0x6E, 0x3F, 0xDF, 0x6E, 0x3F,
0xDF, 0x71, 0x3F, 0xDF, 0x7B, 0x3F, 0xDF, 0x7F, 0x3F, 0xDF, 0x7F, 0x3F,
0xDF, 0x7F, 0x3F, 0xBF, 0xBF, 0x3F, 0xBF, 0xBB, 0x3F, 0x3F, 0x9B, 0x3F,
0x7F, 0xDF, 0x3F, 0x7F, 0xDF, 0x3F, 0x7F, 0xDF, 0x3F, 0xFF, 0xE0, 0x3F,
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F}
};

View File

@@ -52,6 +52,10 @@ void Buffer::open(bool is_pcap){
}
}
String Buffer::getFileName() {
return this->fileName;
}
void Buffer::openFile(String file_name, fs::FS* fs, bool serial, bool is_pcap, bool is_gpx) {
bool save_pcap = settings_obj.loadSetting<bool>("SavePCAP");
if (!save_pcap) {

View File

@@ -25,6 +25,7 @@ class Buffer {
void append(wifi_promiscuous_pkt_t *packet, int len);
void append(String log);
void save();
String getFileName();
private:
void createFile(String name, bool is_pcap, bool is_gpx = false);
void open(bool is_pcap);

View File

@@ -240,10 +240,12 @@ void CommandLine::runCommand(String input) {
Serial.println(HELP_SNIFF_ESP_CMD);
Serial.println(HELP_SNIFF_DEAUTH_CMD);
Serial.println(HELP_SNIFF_PMKID_CMD);
Serial.println(HELP_SNIFF_SAE_CMD);
Serial.println(HELP_STOPSCAN_CMD);
#ifdef HAS_GPS
Serial.println(HELP_WARDRIVE_CMD);
#endif
Serial.println(HELP_MAC_TRACK_CMD);
// WiFi attack
Serial.println(HELP_ATTACK_CMD);
@@ -262,6 +264,10 @@ void CommandLine::runCommand(String input) {
Serial.println(HELP_SAVE_CMD);
Serial.println(HELP_LOAD_CMD);
Serial.println(HELP_JOIN_CMD);
Serial.println(HELP_MAC_CMD_A);
Serial.println(HELP_MAC_CMD_B);
Serial.println(HELP_MAC_CMD_C);
Serial.println(HELP_MAC_CMD_D);
// Bluetooth sniff/scan
#ifdef HAS_BT
@@ -304,11 +310,11 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
if(old_scan_mode == WIFI_SCAN_GPS_NMEA)
Serial.println("END OF NMEA STREAM");
Serial.println(F("END OF NMEA STREAM"));
else if(old_scan_mode == WIFI_SCAN_GPS_DATA)
Serial.println("Stopping GPS data updates");
Serial.println(F("Stopping GPS data updates"));
else
Serial.println("Stopping WiFi tran/recv");
Serial.println(F("Stopping WiFi tran/recv"));
// If we don't do this, the text and button coordinates will be off
#ifdef HAS_SCREEN
@@ -319,7 +325,8 @@ void CommandLine::runCommand(String input) {
else if (cmd_args.get(0) == GPS_DATA_CMD) {
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
Serial.println("Getting GPS Data. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Getting GPS Data. Stop with "));
Serial.println((String)STOPSCAN_CMD);
wifi_scan_obj.currentScanMode = WIFI_SCAN_GPS_DATA;
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(&menu_function_obj.gpsInfoMenu);
@@ -371,7 +378,7 @@ void CommandLine::runCommand(String input) {
Serial.println(gps_obj.getNmeaNotparsed());
}
else
Serial.println("You did not provide a valid argument");
Serial.println(F("You did not provide a valid argument"));
}
else if(nmea_arg != -1){
String nmea_type = cmd_args.get(nmea_arg + 1);
@@ -384,10 +391,11 @@ void CommandLine::runCommand(String input) {
nmea_type="beidou_bd";
}
gps_obj.setType(nmea_type);
Serial.println("GPS Output Type Set To: " + nmea_type);
Serial.print(F("GPS Output Type Set To: "));
Serial.println(nmea_type);
}
else
Serial.println("You did not provide a valid argument");
Serial.println(F("You did not provide a valid argument"));
}
else if (track_arg != -1) {
wifi_scan_obj.currentScanMode = GPS_TRACKER;
@@ -397,9 +405,9 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(GPS_TRACKER, TFT_CYAN);
}
else if(cmd_args.size()>1)
Serial.println("You did not provide a valid flag");
Serial.println(F("You did not provide a valid flag"));
else
Serial.println("You did not provide an argument");
Serial.println(F("You did not provide an argument"));
}
#endif
}
@@ -409,7 +417,7 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_SCREEN
menu_function_obj.changeMenu(&menu_function_obj.gpsInfoMenu);
#endif
Serial.println("NMEA STREAM FOLLOWS");
Serial.println(F("NMEA STREAM FOLLOWS"));
wifi_scan_obj.currentScanMode = WIFI_SCAN_GPS_NMEA;
wifi_scan_obj.StartScan(WIFI_SCAN_GPS_NMEA, TFT_CYAN);
}
@@ -440,7 +448,7 @@ void CommandLine::runCommand(String input) {
}
}
#else
Serial.println("This hardware does not support neopixel");
Serial.println(F("This hardware does not support neopixel"));
#endif
}
// ls command
@@ -449,9 +457,9 @@ void CommandLine::runCommand(String input) {
if (cmd_args.size() > 1)
sd_obj.listDir(cmd_args.get(1));
else
Serial.println("You did not provide a dir to list");
Serial.println(F("You did not provide a dir to list"));
#else
Serial.println("SD support disabled, cannot use command");
Serial.println(F("SD support disabled, cannot use command"));
return;
#endif
}
@@ -462,12 +470,14 @@ void CommandLine::runCommand(String input) {
int ch_set = this->argSearch(&cmd_args, "-s");
if (cmd_args.size() == 1) {
Serial.println("Current channel: " + (String)wifi_scan_obj.set_channel);
Serial.print(F("Current channel: "));
Serial.println(wifi_scan_obj.set_channel);
}
else if (ch_set != -1) {
wifi_scan_obj.set_channel = cmd_args.get(ch_set + 1).toInt();
wifi_scan_obj.changeChannel();
Serial.println("Set channel: " + (String)wifi_scan_obj.set_channel);
Serial.print(F("Set channel: "));
Serial.println(wifi_scan_obj.set_channel);
}
}
// Clear APs
@@ -520,19 +530,20 @@ void CommandLine::runCommand(String input) {
else if (da_sw != -1)
result = settings_obj.saveSetting<bool>(setting_name, false);
else {
Serial.println("You did not properly enable/disable this setting.");
Serial.println(F("You did not properly enable/disable this setting."));
return;
}
if (!result) {
Serial.println("Could not successfully update setting \"" + setting_name + "\"");
Serial.print(F("Could not successfully update setting \""));
Serial.println(setting_name + "\"");
return;
}
}
}
else if (cmd_args.get(0) == REBOOT_CMD) {
Serial.println("Rebooting...");
Serial.println(F("Rebooting..."));
ESP.restart();
}
@@ -543,7 +554,8 @@ void CommandLine::runCommand(String input) {
// Signal strength scan
if (cmd_args.get(0) == SIGSTREN_CMD) {
Serial.println("Starting Signal Strength Scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Signal Strength Scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -553,7 +565,8 @@ void CommandLine::runCommand(String input) {
}
// Packet count
else if (cmd_args.get(0) == PACKET_COUNT_CMD) {
Serial.println("Starting Packet Count Scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Packet Count Scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -565,27 +578,40 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
int sta_sw = this->argSearch(&cmd_args, "-s");
int flk_sw = this->argSearch(&cmd_args, "-f");
if (sta_sw == -1) {
Serial.println("Starting Wardrive. Stop with " + (String)STOPSCAN_CMD);
if (flk_sw != -1) {
Serial.print(F("Starting Flock Wardrive. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_WAR_DRIVE, TFT_GREEN);
wifi_scan_obj.StartScan(BT_SCAN_FLOCK_WARDRIVE, TFT_GREEN);
}
else {Serial.println("Starting Station Wardrive. Stop with " + (String)STOPSCAN_CMD);
else if (sta_sw != -1) {
Serial.print(F("Starting Station Wardrive. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_STATION_WAR_DRIVE, TFT_GREEN);
}
else {
Serial.print(F("Starting Wardrive. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_WAR_DRIVE, TFT_GREEN);
}
}
else
Serial.println("GPS Module not detected");
Serial.println(F("GPS Module not detected"));
#else
Serial.println("GPS not supported");
Serial.println(F("GPS not supported"));
#endif
}
// Karma
@@ -593,19 +619,22 @@ void CommandLine::runCommand(String input) {
int pr_sw = this->argSearch(&cmd_args, "-p");
if (pr_sw == -1) {
Serial.println("You did not provide a target index");
Serial.println(F("You did not provide a target index"));
return;
}
int pr_index = cmd_args.get(pr_sw + 1).toInt();
if ((pr_index < 0) || (pr_index > probe_req_ssids->size() - 1)) {
Serial.println("The provided index was not in range");
Serial.println(F("The provided index was not in range"));
return;
}
if (evil_portal_obj.setAP(probe_req_ssids->get(pr_index).essid)) {
Serial.println("Starting Karma Attack with " + probe_req_ssids->get(pr_index).essid + ". Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Karma Attack with "));
Serial.print(probe_req_ssids->get(pr_index).essid);
Serial.print(F(". Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -614,7 +643,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.setMac();
}
else {
Serial.println("Unable to set AP ESSID");
Serial.println(F("Unable to set AP ESSID"));
return;
}
@@ -627,7 +656,8 @@ void CommandLine::runCommand(String input) {
if (cmd_sw != -1) {
String et_command = cmd_args.get(cmd_sw + 1);
if (et_command == "start") {
Serial.println("Starting Evil Portal. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Evil Portal. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -636,7 +666,8 @@ void CommandLine::runCommand(String input) {
String target_html_name = cmd_args.get(html_sw + 1);
evil_portal_obj.target_html_name = target_html_name;
evil_portal_obj.using_serial_html = false;
Serial.println("Set html file as " + evil_portal_obj.target_html_name);
Serial.print(F("Set html file as "));
Serial.println(evil_portal_obj.target_html_name);
}
//else {
// evil_portal_obj.target_html_name = "index.html";
@@ -653,7 +684,8 @@ void CommandLine::runCommand(String input) {
String target_html_name = cmd_args.get(cmd_sw + 2);
evil_portal_obj.target_html_name = target_html_name;
evil_portal_obj.using_serial_html = false;
Serial.println("Set html file as " + evil_portal_obj.target_html_name);
Serial.print(F("Set html file as "));
Serial.println(evil_portal_obj.target_html_name);
}
else if (et_command == "sethtmlstr") {
evil_portal_obj.setHtmlFromSerial();
@@ -672,7 +704,8 @@ void CommandLine::runCommand(String input) {
}
}
else if (cmd_args.get(0) == SCAN_ALL_CMD) {
Serial.println("Scanning for APs and Stations. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Scanning for APs and Stations. Stop with "));
Serial.println(STOPSCAN_CMD);
wifi_scan_obj.StartScan(WIFI_SCAN_AP_STA, TFT_MAGENTA);
}
else if (cmd_args.get(0) == SCANAP_CMD) {
@@ -683,17 +716,20 @@ void CommandLine::runCommand(String input) {
#endif
if (full_sw == -1) {
Serial.println("Starting AP scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting AP scan. Stop with "));
Serial.println(STOPSCAN_CMD);
wifi_scan_obj.StartScan(WIFI_SCAN_TARGET_AP, TFT_MAGENTA);
}
else {
Serial.println("Starting Full AP scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Full AP scan. Stop with "));
Serial.println(STOPSCAN_CMD);
wifi_scan_obj.StartScan(WIFI_SCAN_TARGET_AP_FULL, TFT_MAGENTA);
}
}
// Raw sniff
else if (cmd_args.get(0) == SNIFF_RAW_CMD) {
Serial.println("Starting Raw sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Raw sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -703,9 +739,11 @@ void CommandLine::runCommand(String input) {
// Scan stations
else if (cmd_args.get(0) == SCANSTA_CMD) {
if(access_points->size() < 1)
Serial.println("The AP list is empty. Scan APs first with " + (String)SCANAP_CMD);
Serial.print(F("The AP list is empty. Scan APs first with "));
Serial.println(SCANAP_CMD);
Serial.println("Starting Station scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Station scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -714,16 +752,28 @@ void CommandLine::runCommand(String input) {
}
// Beacon sniff
else if (cmd_args.get(0) == SNIFF_BEACON_CMD) {
Serial.println("Starting Beacon sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Beacon sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_AP, TFT_MAGENTA);
}
// SAE sniff
else if (cmd_args.get(0) == SNIFF_SAE_CMD) {
Serial.print(F("Starting SAE Commit sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_SAE_COMMIT, TFT_MAGENTA);
}
// Probe sniff
else if (cmd_args.get(0) == SNIFF_PROBE_CMD) {
Serial.println("Starting Probe sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Probe sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -732,7 +782,8 @@ void CommandLine::runCommand(String input) {
}
// Deauth sniff
else if (cmd_args.get(0) == SNIFF_DEAUTH_CMD) {
Serial.println("Starting Deauth sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Deauth sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -741,7 +792,8 @@ void CommandLine::runCommand(String input) {
}
// Pwn sniff
else if (cmd_args.get(0) == SNIFF_PWN_CMD) {
Serial.println("Starting Pwnagotchi sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Pwnagotchi sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -750,7 +802,8 @@ void CommandLine::runCommand(String input) {
}
// PineScan sniff
else if (cmd_args.get(0) == SNIFF_PINESCAN_CMD) {
Serial.println("Starting Pinescan sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Pinescan sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -759,7 +812,8 @@ void CommandLine::runCommand(String input) {
}
// MultiSSID sniff
else if (cmd_args.get(0) == SNIFF_MULTISSID_CMD) {
Serial.println("Starting MultiSSID sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting MultiSSID sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -768,7 +822,8 @@ void CommandLine::runCommand(String input) {
}
// Espressif sniff
else if (cmd_args.get(0) == SNIFF_ESP_CMD) {
Serial.println("Starting Espressif device sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Espressif device sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -808,7 +863,92 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(WIFI_SCAN_ACTIVE_EAPOL, TFT_VIOLET);
}
}
// MAC Tracking
else if (cmd_args.get(0) == MAC_TRACK_CMD) {
Serial.print(F("Starting MAC Tracker. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_SCAN_DETECT_FOLLOW, TFT_MAGENTA);
}
//// MAC Address commands (Added by H4W9_4)
// Generate random MAC for AP
if (cmd_args.get(0) == MAC_CMD_A) {
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.RunGenerateRandomMac(true);
}
// Generate random MAC for STA
else if (cmd_args.get(0) == MAC_CMD_B) {
//Serial.println("Setting STA MAC: " + macToString(this->sta_mac));
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.RunGenerateRandomMac(false);
}
// Clone MAC for AP
else if (cmd_args.get(0) == MAC_CMD_C) {
int ap_sw = this->argSearch(&cmd_args, "-a"); // APs
if (ap_sw == -1) {
Serial.println(F("You did not provide a target index"));
return;
}
int ap_index = cmd_args.get(ap_sw + 1).toInt();
if ((ap_index < 0) || (ap_index > access_points->size() - 1)) {
Serial.println(F("The provided index was not in range"));
return;
}
if (ap_sw != -1) {
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
int filter_ap = cmd_args.get(ap_sw + 1).toInt();
wifi_scan_obj.RunSetMac(access_points->get(filter_ap).bssid, true);
}
}
// Clone MAC for STA
else if (cmd_args.get(0) == MAC_CMD_D) {
int cl_sw = this->argSearch(&cmd_args, "-s"); // Stations
if (cl_sw == -1) {
Serial.println(F("You did not provide a target index"));
return;
}
int sta_index = cmd_args.get(cl_sw + 1).toInt();
if ((sta_index < 0) || (sta_index > stations->size() - 1)) {
Serial.println(F("The provided index was not in range"));
return;
}
if (cl_sw != -1) {
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
int filter_sta = cmd_args.get(cl_sw + 1).toInt();
wifi_scan_obj.RunSetMac(stations->get(filter_sta).mac, false);
}
}
//// End MAC Address commands (Added by H4W9_4)
//// WiFi attack commands
// attack
if (cmd_args.get(0) == ATTACK_CMD) {
@@ -821,7 +961,7 @@ void CommandLine::runCommand(String input) {
int targ_sw = this->argSearch(&cmd_args, "-c");
if (attack_type_switch == -1) {
Serial.println("You must specify an attack type");
Serial.println(F("You must specify an attack type"));
return;
}
else {
@@ -832,7 +972,7 @@ void CommandLine::runCommand(String input) {
if (attack_type == ATTACK_TYPE_DEAUTH) {
// Default to broadcast
if ((dst_addr_sw == -1) && (targ_sw == -1)) {
Serial.println("Sending to broadcast...");
Serial.println(F("Sending to broadcast..."));
wifi_scan_obj.dst_mac = "ff:ff:ff:ff:ff:ff";
}
// Dest addr specified
@@ -842,7 +982,7 @@ void CommandLine::runCommand(String input) {
}
// Station list specified
else if (targ_sw != -1)
Serial.println("Sending to Station list");
Serial.println(F("Sending to Station list"));
// Source addr not specified
if (src_addr_sw == -1) {
@@ -979,15 +1119,25 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(WIFI_ATTACK_RICK_ROLL, TFT_YELLOW);
}
else if (attack_type == ATTACK_TYPE_FUNNY) {
Serial.println("Starting Funny SSID Beacon spam. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Funny SSID Beacon spam. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_FUNNY_BEACON, TFT_CYAN);
}
else if (attack_type == ATTACK_TYPE_SAE) {
Serial.print(F("Starting SAE Commit spam. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ATTACK_SAE_COMMIT, TFT_CYAN);
}
else {
Serial.println("Attack type not properly defined");
Serial.println(F("Attack type not properly defined"));
return;
}
}
@@ -1007,7 +1157,8 @@ void CommandLine::runCommand(String input) {
// Airtag sniff
if (bt_type == "airtag") {
Serial.println("Starting Airtag sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Airtag sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -1015,17 +1166,28 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(BT_SCAN_AIRTAG, TFT_WHITE);
}
else if (bt_type == "flipper") {
Serial.println("Starting Flipper sniff. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Flipper sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_FLIPPER, TFT_ORANGE);
}
else if (bt_type == "flock") {
Serial.print(F("Starting Flock sniff. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_FLOCK, TFT_ORANGE);
}
}
// General bluetooth sniff
else {
Serial.println("Starting Bluetooth scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Bluetooth scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -1033,7 +1195,7 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(BT_SCAN_ALL, TFT_GREEN);
}
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (cmd_args.get(0) == BT_SPOOFAT_CMD) {
@@ -1050,7 +1212,8 @@ void CommandLine::runCommand(String input) {
at.selected = false;
airtags->set(i, at);
}
Serial.println("Spoofing Airtag: " + airtags->get(target_mac).mac);
Serial.print(F("Spoofing Airtag: "));
Serial.println(airtags->get(target_mac).mac);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -1058,7 +1221,8 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(BT_SPOOF_AIRTAG, TFT_WHITE);
}
else {
Serial.println("Provided index is out of range: " + (String)target_mac);
Serial.print(F("Provided index is out of range: "));
Serial.println(target_mac);
return;
}
#endif
@@ -1071,78 +1235,84 @@ void CommandLine::runCommand(String input) {
if (bt_type == "apple") {
#ifdef HAS_BT
Serial.println("Starting Sour Apple attack. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Sour Apple attack. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SOUR_APPLE, TFT_GREEN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "windows") {
#ifdef HAS_BT
Serial.println("Starting Swiftpair Spam attack. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Swiftpair Spam attack. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SWIFTPAIR_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "samsung") {
#ifdef HAS_BT
Serial.println("Starting Samsung Spam attack. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Samsung Spam attack. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SAMSUNG_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "google") {
#ifdef HAS_BT
Serial.println("Starting Google Spam attack. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Google Spam attack. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_GOOGLE_SPAM, TFT_CYAN);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "flipper") {
#ifdef HAS_BT
Serial.println("Starting Flipper Spam attack. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Flipper Spam attack. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_FLIPPER_SPAM, TFT_ORANGE);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else if (bt_type == "all") {
#ifdef HAS_BT
Serial.println("Starting BT Spam All attack. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting BT Spam All attack. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_ATTACK_SPAM_ALL, TFT_MAGENTA);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
else {
Serial.println("You did not specify a correct spam type");
Serial.println(F("You did not specify a correct spam type"));
}
}
}
@@ -1151,45 +1321,37 @@ void CommandLine::runCommand(String input) {
#ifdef HAS_BT
#ifdef HAS_GPS
if (gps_obj.getGpsModuleStatus()) {
int cont_sw = this->argSearch(&cmd_args, "-c");
if (cont_sw == -1) {
Serial.println("Starting BT Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE, TFT_GREEN);
}
else {Serial.println("Starting Continuous BT Wardrive. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE_CONT, TFT_GREEN);
}
Serial.print(F("Starting BT Wardrive. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE, TFT_GREEN);
}
else
Serial.println("GPS Module not detected");
Serial.println(F("GPS Module not detected"));
#else
Serial.println("GPS not supported");
Serial.println(F("GPS not supported"));
#endif
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
// Bluetooth CC Skimmer scan
else if (cmd_args.get(0) == BT_SKIM_CMD) {
#ifdef HAS_BT
Serial.println("Starting Bluetooth CC Skimmer scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Bluetooth CC Skimmer scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(BT_SCAN_SKIMMERS, TFT_MAGENTA);
#else
Serial.println("Bluetooth not supported");
Serial.println(F("Bluetooth not supported"));
#endif
}
@@ -1211,13 +1373,13 @@ void CommandLine::runCommand(String input) {
if (sd_sw != -1) {
#ifdef HAS_SD
if (!sd_obj.supported) {
Serial.println("SD card is not connected. Cannot perform SD Update");
Serial.println(F("SD card is not connected. Cannot perform SD Update"));
return;
}
wifi_scan_obj.currentScanMode = OTA_UPDATE;
sd_obj.runUpdate();
#else
Serial.println("SD card support disabled. Cannot perform SD Update");
Serial.println(F("SD card support disabled. Cannot perform SD Update"));
return;
#endif
}
@@ -1227,7 +1389,8 @@ void CommandLine::runCommand(String input) {
if (wifi_scan_obj.wifi_connected) {
// Ping Scan
if (cmd_args.get(0) == PING_CMD) {
Serial.println("Starting Ping Scan. Stop with " + (String)STOPSCAN_CMD);
Serial.print(F("Starting Ping Scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -1236,12 +1399,15 @@ void CommandLine::runCommand(String input) {
}
if (cmd_args.get(0) == ARP_SCAN_CMD) {
Serial.println("Starting ARP Scan. Stop with " + (String)STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#ifndef HAS_DUAL_BAND
Serial.print(F("Starting ARP Scan. Stop with "));
Serial.println(STOPSCAN_CMD);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
#endif
wifi_scan_obj.StartScan(WIFI_ARP_SCAN, TFT_CYAN);
#endif
wifi_scan_obj.StartScan(WIFI_ARP_SCAN, TFT_CYAN);
}
// GPS POI
@@ -1289,7 +1455,7 @@ void CommandLine::runCommand(String input) {
#endif
}
#else
Serial.println("Your hardware doesn't have GPS, silly");
Serial.println(F("Your hardware doesn't have GPS, silly"));
return;
#endif
}
@@ -1319,7 +1485,7 @@ void CommandLine::runCommand(String input) {
}
}
else {
Serial.println("The IP index specified is out of range");
Serial.println(F("The IP index specified is out of range"));
return;
}
}
@@ -1343,7 +1509,8 @@ void CommandLine::runCommand(String input) {
target_mode = WIFI_SCAN_RDP;
if (target_mode != 0) {
Serial.println("Starting port scan for service " + port_name);
Serial.print(F("Starting port scan for service "));
Serial.println(port_name);
#ifdef HAS_SCREEN
display_obj.clearScreen();
menu_function_obj.drawStatusBar();
@@ -1351,12 +1518,12 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.StartScan(target_mode, TFT_CYAN);
}
else {
Serial.println("You did not specify a supported service");
Serial.println(F("You did not specify a supported service"));
return;
}
}
else {
Serial.println("You did not specify an IP index");
Serial.println(F("You did not specify an IP index"));
return;
}
}
@@ -1420,7 +1587,7 @@ void CommandLine::runCommand(String input) {
if (stations->get(access_points->get(x).stations->get(i)).selected) {
Serial.print(" [" + (String)access_points->get(x).stations->get(i) + "] ");
Serial.print(sta_mac);
Serial.println(" (selected)");
Serial.println(F(" (selected)"));
count_selected += 1;
}
else {
@@ -1438,7 +1605,7 @@ void CommandLine::runCommand(String input) {
}
}
else {
Serial.println("You did not specify which list to show");
Serial.println(F("You did not specify which list to show"));
return;
}
}
@@ -1486,11 +1653,11 @@ void CommandLine::runCommand(String input) {
#endif
}
else {
Serial.println("There are no saved WiFi credentials");
Serial.println(F("There are no saved WiFi credentials"));
}
}
else {
Serial.println("You did not provide the proper args");
Serial.println(F("You did not provide the proper args"));
return;
}
}
@@ -1541,7 +1708,8 @@ void CommandLine::runCommand(String input) {
for (int i = 0; i < ap_index.size(); i++) {
int index = ap_index.get(i).toInt();
if (!this->inRange(access_points->size(), index)) {
Serial.println("Index not in range: " + (String)index);
Serial.print(F("Index not in range: "));
Serial.println(index);
continue;
}
if (access_points->get(index).selected) {
@@ -1592,7 +1760,8 @@ void CommandLine::runCommand(String input) {
for (int i = 0; i < sta_index.size(); i++) {
int index = sta_index.get(i).toInt();
if (!this->inRange(stations->size(), index)) {
Serial.println("Index not in range: " + (String)index);
Serial.print(F("Index not in range: "));
Serial.println(index);
continue;
}
if (stations->get(index).selected) {
@@ -1640,7 +1809,8 @@ void CommandLine::runCommand(String input) {
for (int i = 0; i < ss_index.size(); i++) {
int index = ss_index.get(i).toInt();
if (!this->inRange(ssids->size(), index)) {
Serial.println("Index not in range: " + (String)index);
Serial.print(F("Index not in range: "));
Serial.println(index);
continue;
}
if (ssids->get(index).selected) {
@@ -1660,7 +1830,7 @@ void CommandLine::runCommand(String input) {
this->showCounts(count_selected, count_unselected);
}
else {
Serial.println("You did not specify which list to select from");
Serial.println(F("You did not specify which list to select from"));
return;
}
}
@@ -1719,58 +1889,22 @@ void CommandLine::runCommand(String input) {
wifi_scan_obj.addSSID(essid);
}
else {
Serial.println("You did not specify how to add SSIDs");
Serial.println(F("You did not specify how to add SSIDs"));
}
}
// Remove SSID
else if (rem_sw != -1) {
int index = cmd_args.get(rem_sw + 1).toInt();
if (!this->inRange(ssids->size(), index)) {
Serial.println("Index not in range: " + (String)index);
Serial.print(F("Index not in range: "));
Serial.println(index);
return;
}
ssids->remove(index);
}
else {
Serial.println("You did not specify whether to add or remove SSIDs");
Serial.println(F("You did not specify whether to add or remove SSIDs"));
return;
}
}
// Join WiFi
/*else if (cmd_args.get(0) == JOINWIFI_CMD) {
int n_sw = this->argSearch(&cmd_args, "-n"); // name
int a_sw = this->argSearch(&cmd_args, "-a"); // access point
int s_sw = this->argSearch(&cmd_args, "-s"); // ssid
int p_sw = this->argSearch(&cmd_args, "-p");
String essid = "";
String pwx = "";
if (s_sw != -1) {
int index = cmd_args.get(s_sw + 1).toInt();
if (!this->inRange(ssids->size(), index)) {
Serial.println("Index not in range: " + (String)index);
return;
}
essid = ssids->get(index).essid;
} else if (a_sw != -1) {
int index = cmd_args.get(a_sw + 1).toInt();
if (!this->inRange(access_points->size(), index)) {
Serial.println("Index not in range: " + (String)index);
return;
}
essid = access_points->get(index).essid;
} else if (n_sw != -1) {
essid = cmd_args.get(n_sw + 1);
} else {
Serial.println("You must specify an access point or ssid");
return;
}
if (p_sw != -1) {
pwx = cmd_args.get(p_sw + 1);
}
Serial.println("Attempting to join WiFi with ssid " + (String)essid);
wifi_scan_obj.joinWiFi(essid, pwx);
}*/
}

View File

@@ -78,6 +78,8 @@ const char PROGMEM WARDRIVE_CMD[] = "wardrive";
const char PROGMEM PING_CMD[] = "pingscan";
const char PROGMEM PORT_SCAN_CMD[] = "portscan";
const char PROGMEM ARP_SCAN_CMD[] = "arpscan";
const char PROGMEM MAC_TRACK_CMD[] = "mactrack";
const char PROGMEM SNIFF_SAE_CMD[] = "sniffsae";
// WiFi attack
const char PROGMEM ATTACK_CMD[] = "attack";
@@ -88,6 +90,7 @@ const char PROGMEM ATTACK_TYPE_FUNNY[] = "funny";
const char PROGMEM ATTACK_TYPE_RR[] = "rickroll";
const char PROGMEM ATTACK_TYPE_BM[] = "badmsg";
const char PROGMEM ATTACK_TYPE_S[] = "sleep";
const char PROGMEM ATTACK_TYPE_SAE[] = "sae";
// WiFi Aux
const char PROGMEM LIST_AP_CMD[] = "list";
@@ -97,6 +100,10 @@ const char PROGMEM SSID_CMD[] = "ssid";
const char PROGMEM SAVE_CMD[] = "save";
const char PROGMEM LOAD_CMD[] = "load";
const char PROGMEM JOIN_CMD[] = "join";
const char PROGMEM MAC_CMD_A[] = "randapmac";
const char PROGMEM MAC_CMD_B[] = "randstamac";
const char PROGMEM MAC_CMD_C[] = "cloneapmac";
const char PROGMEM MAC_CMD_D[] = "clonestamac";
// Bluetooth sniff/scan
const char PROGMEM BT_SPAM_CMD[] = "blespam";
@@ -144,13 +151,15 @@ const char PROGMEM HELP_SNIFF_ESP_CMD[] = "sniffesp";
const char PROGMEM HELP_SNIFF_DEAUTH_CMD[] = "sniffdeauth";
const char PROGMEM HELP_SNIFF_PMKID_CMD[] = "sniffpmkid [-c <channel>][-d][-l]";
const char PROGMEM HELP_STOPSCAN_CMD[] = "stopscan [-f]";
const char PROGMEM HELP_WARDRIVE_CMD[] = "wardrive [-s]";
const char PROGMEM HELP_WARDRIVE_CMD[] = "wardrive [-s/-f]";
const char PROGMEM HELP_PING_CMD[] = "pingscan";
const char PROGMEM HELP_PORT_SCAN_CMD[] = "portscan [-a -t <ip index>]/[-s <ssh/telnet/dns/http/smtp/https/rdp>]";
const char PROGMEM HELP_ARP_SCAN_CMD[] = "arpscan [-f]";
const char PROGMEM HELP_MAC_TRACK_CMD[] = "mactrack";
const char PROGMEM HELP_SNIFF_SAE_CMD[] = "sniffsae";
// WiFi attack
const char PROGMEM HELP_ATTACK_CMD[] = "attack -t <beacon [-l/-r/-a]/deauth [-c]/[-s <src mac>] [-d <dst mac>]/probe/rickroll/badmsg [-c]/sleep [-c]>";
const char PROGMEM HELP_ATTACK_CMD[] = "attack -t <sae/beacon [-l/-r/-a]/deauth [-c]/[-s <src mac>] [-d <dst mac>]/probe/rickroll/badmsg [-c]/sleep [-c]>";
// WiFi Aux
const char PROGMEM HELP_LIST_AP_CMD_A[] = "list -s";
@@ -166,16 +175,20 @@ const char PROGMEM HELP_SSID_CMD_B[] = "ssid -r <index>";
const char PROGMEM HELP_SAVE_CMD[] = "save -a/-s";
const char PROGMEM HELP_LOAD_CMD[] = "load -a/-s";
const char PROGMEM HELP_JOIN_CMD[] = "join -a <index> -p <password>/-s";
const char PROGMEM HELP_MAC_CMD_A[] = "randapmac";
const char PROGMEM HELP_MAC_CMD_B[] = "randstamac";
const char PROGMEM HELP_MAC_CMD_C[] = "cloneapmac [-a <index>]";
const char PROGMEM HELP_MAC_CMD_D[] = "clonestamac [-s <index>]";
// Bluetooth sniff/scan
const char PROGMEM HELP_BT_SNIFF_CMD[] = "sniffbt [-t] <airtag/flipper>";
const char PROGMEM HELP_BT_SNIFF_CMD[] = "sniffbt [-t] <airtag/flipper/flock>";
const char PROGMEM HELP_BT_SPAM_CMD[] = "blespam -t <apple/google/samsung/windows/flipper/all>";
const char PROGMEM HELP_BT_SPOOFAT_CMD[] = "spoofat -t <index>";
//const char PROGMEM HELP_BT_SOUR_APPLE_CMD[] = "sourapple";
//const char PROGMEM HELP_BT_SWIFTPAIR_SPAM_CMD[] = "swiftpair";
//const char PROGMEM HELP_BT_SAMSUNG_SPAM_CMD[] = "samsungblespam";
//onst char PROGMEM HELP_BT_SPAM_ALL_CMD[] = "btspamall";
const char PROGMEM HELP_BT_WARDRIVE_CMD[] = "btwardrive [-c]";
const char PROGMEM HELP_BT_WARDRIVE_CMD[] = "btwardrive";
const char PROGMEM HELP_BT_SKIM_CMD[] = "sniffskim";
const char PROGMEM HELP_FOOT[] = "==================================";

View File

@@ -475,33 +475,37 @@ void Display::processAndPrintString(TFT_eSPI& tft, const String& originalString)
String new_string = originalString;
// Check for color macros at the start of the string
if (new_string.startsWith(RED_KEY)) {
text_color = TFT_RED;
new_string.remove(0, strlen(RED_KEY)); // Remove the macro
} else if (new_string.startsWith(GREEN_KEY)) {
text_color = TFT_GREEN;
new_string.remove(0, strlen(GREEN_KEY)); // Remove the macro
} else if (new_string.startsWith(CYAN_KEY)) {
text_color = TFT_CYAN;
new_string.remove(0, strlen(CYAN_KEY)); // Remove the macro
} else if (new_string.startsWith(WHITE_KEY)) {
text_color = TFT_WHITE;
new_string.remove(0, strlen(WHITE_KEY)); // Remove the macro
} else if (new_string.startsWith(MAGENTA_KEY)) {
text_color = TFT_MAGENTA;
new_string.remove(0, strlen(MAGENTA_KEY)); // Remove the macro
if (new_string.startsWith(";")) {
if (new_string.startsWith(RED_KEY)) {
text_color = TFT_RED;
new_string.remove(0, strlen(RED_KEY)); // Remove the macro
} else if (new_string.startsWith(GREEN_KEY)) {
text_color = TFT_GREEN;
new_string.remove(0, strlen(GREEN_KEY)); // Remove the macro
} else if (new_string.startsWith(CYAN_KEY)) {
text_color = TFT_CYAN;
new_string.remove(0, strlen(CYAN_KEY)); // Remove the macro
} else if (new_string.startsWith(WHITE_KEY)) {
text_color = TFT_WHITE;
new_string.remove(0, strlen(WHITE_KEY)); // Remove the macro
} else if (new_string.startsWith(MAGENTA_KEY)) {
text_color = TFT_MAGENTA;
new_string.remove(0, strlen(MAGENTA_KEY)); // Remove the macro
}
}
String spaces = String(' ', TFT_WIDTH / CHAR_WIDTH);
// Set text color and print the string
tft.setTextColor(text_color, background_color);
tft.print(new_string);
tft.print(new_string + spaces);
}
void Display::displayBuffer(bool do_clear)
{
if (this->display_buffer->size() > 0)
{
int print_count = 1;
int print_count = 10;
while ((display_buffer->size() > 0) && (print_count > 0))
{
@@ -530,9 +534,9 @@ void Display::displayBuffer(bool do_clear)
screen_buffer->add(display_buffer->shift());
for (int i = 0; i < this->screen_buffer->size(); i++) {
tft.setCursor(xPos, (i * 12) + (SCREEN_HEIGHT / 6));
String spaces = String(' ', TFT_WIDTH / CHAR_WIDTH);
tft.print(spaces);
//tft.setCursor(xPos, (i * 12) + (SCREEN_HEIGHT / 6));
//String spaces = String(' ', TFT_WIDTH / CHAR_WIDTH);
//tft.print(spaces);
tft.setCursor(xPos, (i * 12) + (SCREEN_HEIGHT / 6));
this->processAndPrintString(tft, this->screen_buffer->get(i));
@@ -1045,9 +1049,9 @@ void Display::buildBanner(String msg, int xpos)
void Display::main(uint8_t scan_mode)
{
if ((scan_mode == LV_JOIN_WIFI) ||
/*if ((scan_mode == LV_JOIN_WIFI) ||
(scan_mode == LV_ADD_SSID))
lv_task_handler();
lv_task_handler();*/
return;
}
// End SPIFFS_functions

View File

@@ -12,8 +12,8 @@
//#include <JPEGDecoder.h>
#include <LinkedList.h>
#include <SPI.h>
#include <lvgl.h>
#include <Ticker.h>
//#include <lvgl.h>
//#include <Ticker.h>
#include "SPIFFS.h"
#include "Assets.h"

View File

@@ -61,9 +61,9 @@ void EvilPortal::setupServer() {
#ifndef HAS_PSRAM
server.on("/", HTTP_GET, [this](AsyncWebServerRequest *request) {
request->send_P(200, "text/html", index_html);
Serial.println("client connected");
Serial.println(F("client connected"));
#ifdef HAS_SCREEN
this->sendToDisplay("Client connected to server");
this->sendToDisplay(F("Client connected to server"));
#endif
});
#else
@@ -71,7 +71,7 @@ void EvilPortal::setupServer() {
request->send(200, "text/html", index_html);
Serial.println("client connected");
#ifdef HAS_SCREEN
this->sendToDisplay("Client connected to server");
this->sendToDisplay(F("Client connected to server"));
#endif
});
#endif
@@ -144,10 +144,10 @@ void EvilPortal::setHtmlFromSerial() {
bool EvilPortal::setHtml() {
if (this->using_serial_html) {
Serial.println("html previously set");
Serial.println(F("html previously set"));
return true;
}
Serial.println("Setting HTML...");
Serial.println(F("Setting HTML..."));
#ifdef HAS_SD
File html_file = sd_obj.getFile("/" + this->target_html_name);
#else
@@ -156,7 +156,7 @@ bool EvilPortal::setHtml() {
if (!html_file) {
#ifdef HAS_SCREEN
this->sendToDisplay("Could not find /" + this->target_html_name);
this->sendToDisplay("Touch to exit...");
this->sendToDisplay(F("Touch to exit..."));
#endif
Serial.println("Could not find /" + this->target_html_name + ". Use stopscan...");
return false;
@@ -164,9 +164,9 @@ bool EvilPortal::setHtml() {
else {
if (html_file.size() > MAX_HTML_SIZE) {
#ifdef HAS_SCREEN
this->sendToDisplay("The given HTML is too large.");
this->sendToDisplay(F("The given HTML is too large."));
this->sendToDisplay("The Byte limit is " + (String)MAX_HTML_SIZE);
this->sendToDisplay("Touch to exit...");
this->sendToDisplay(F("Touch to exit..."));
#endif
Serial.println("The provided HTML is too large. Byte limit is " + (String)MAX_HTML_SIZE + "\nUse stopscan...");
return false;
@@ -316,14 +316,14 @@ bool EvilPortal::setAP(String essid) {
strncpy(apName, essid.c_str(), MAX_AP_NAME_SIZE);
this->has_ap = true;
Serial.println("ap config set");
Serial.println(F("ap config set"));
return true;
}
void EvilPortal::startAP() {
const IPAddress AP_IP(172, 0, 0, 1);
Serial.print("starting ap ");
Serial.print(F("starting ap "));
Serial.println(apName);
WiFi.mode(WIFI_AP);
@@ -334,19 +334,19 @@ void EvilPortal::startAP() {
this->sendToDisplay("AP started");
#endif
Serial.print("ap ip address: ");
Serial.print(F("ap ip address: "));
Serial.println(WiFi.softAPIP());
this->setupServer();
Serial.println("Server endpoints configured");
Serial.println(F("Server endpoints configured"));
this->dnsServer.start(53, "*", WiFi.softAPIP());
Serial.println("DNS Server started");
Serial.println(F("DNS Server started"));
server.addHandler(new CaptiveRequestHandler()).setFilter(ON_AP_FILTER);
Serial.println("Captive Portal handler started");
Serial.println(F("Captive Portal handler started"));
server.begin();
Serial.println("Server started");
Serial.println(F("Server started"));
#ifdef HAS_SCREEN
this->sendToDisplay("Evil Portal READY");
#endif
@@ -375,20 +375,29 @@ void EvilPortal::sendToDisplay(String msg) {
}
void EvilPortal::main(uint8_t scan_mode) {
if ((scan_mode == WIFI_SCAN_EVIL_PORTAL) && (this->has_ap) && (this->has_html)){
this->dnsServer.processNextRequest();
if (this->name_received && this->password_received) {
this->name_received = false;
this->password_received = false;
String logValue1 =
"u: " + this->user_name;
String logValue2 = "p: " + this->password;
String full_string = logValue1 + " " + logValue2 + "\n";
Serial.print(full_string);
buffer_obj.append(full_string);
#ifdef HAS_SCREEN
this->sendToDisplay(full_string);
#endif
}
if (scan_mode != WIFI_SCAN_EVIL_PORTAL || !this->has_ap || !this->has_html) {
return;
}
this->dnsServer.processNextRequest();
if (this->name_received && this->password_received) {
this->name_received = false;
this->password_received = false;
// Adjust size depending on your max username/password length
char line[96];
// If user_name / password are still Arduino String:
snprintf(line, sizeof(line),
"u: %s p: %s\n",
this->user_name.c_str(),
this->password.c_str());
Serial.print(line);
buffer_obj.append(line);
#ifdef HAS_SCREEN
this->sendToDisplay(line);
#endif
}
}

View File

@@ -10,23 +10,22 @@ MicroNMEA nmea(nmeaBuffer, sizeof(nmeaBuffer));
HardwareSerial Serial2(GPS_SERIAL_INDEX);
static const char *PCAS_SET_115200 = "$PCAS01,5*19\r\n";
static const uint32_t PROBE_MS = 1200;
void GpsInterface::begin() {
/*#ifdef MARAUDER_MINI
pinMode(26, OUTPUT);
delay(1);
analogWrite(26, 243);
delay(1);
Serial.println("Activated GPS");
delay(100);
#endif*/
Serial2.begin(9600, SERIAL_8N1, GPS_TX, GPS_RX);
uint32_t gps_baud = this->initGpsBaudAndForce115200();
if ((gps_baud != 9600) && (gps_baud != 115200))
Serial.println("Could not detect GPS baudrate");
delay(1000);
MicroNMEA::sendSentence(Serial2, "$PSTMSETPAR,1201,0x00000042");
MicroNMEA::sendSentence(Serial2, "$PSTMSAVEPAR");
@@ -35,7 +34,6 @@ void GpsInterface::begin() {
delay(1000);
if (Serial2.available()) {
Serial.println("GPS Attached Successfully");
this->gps_enabled = true;
while (Serial2.available()) {
//Fetch the character one by one
@@ -58,6 +56,67 @@ void GpsInterface::begin() {
}
bool GpsInterface::probeBaud(uint32_t baud) {
Serial2.end();
delay(50);
Serial2.begin(baud, SERIAL_8N1, GPS_TX, GPS_RX);
uint32_t start = millis();
bool sawDollar = false;
bool parsedSentence = false;
while (millis() - start < PROBE_MS) {
while (Serial2.available()) {
char c = (char)Serial2.read();
if (c == '$') {
sawDollar = true;
}
// Feed characters directly to MicroNMEA
if (nmea.process(c)) {
parsedSentence = true;
}
// If weve seen real NMEA traffic and MicroNMEA parsed something,
// this baud is almost certainly correct
if (sawDollar && parsedSentence) {
return true;
}
}
delay(1);
}
return false;
}
void GpsInterface::setGpsTo115200From9600() {
Serial2.print(PCAS_SET_115200);
Serial2.flush();
delay(200);
}
uint32_t GpsInterface::initGpsBaudAndForce115200() {
if (probeBaud(115200)) {
return 115200;
}
if (probeBaud(9600)) {
setGpsTo115200From9600();
if (probeBaud(115200)) {
return 115200;
}
probeBaud(9600);
return 9600;
}
probeBaud(9600);
return 0;
}
//passthrough for other objects
void gps_nmea_notimp(MicroNMEA& nmea){
gps_obj.enqueue(nmea);
@@ -518,6 +577,9 @@ void GpsInterface::setGPSInfo() {
this->datetime = this->dt_string_from_gps();
this->lat_int = nmea.getLatitude();
this->lon_int = nmea.getLongitude();
this->lat = String((float)nmea.getLatitude()/1000000, 7);
this->lon = String((float)nmea.getLongitude()/1000000, 7);
long alt = 0;
@@ -543,6 +605,14 @@ String GpsInterface::getLon() {
return this->lon;
}
int32_t GpsInterface::getLatInt() {
return this->lat_int;
}
int32_t GpsInterface::getLonInt() {
return this->lon_int;
}
float GpsInterface::getAlt() {
return this->altf;
}

View File

@@ -46,6 +46,8 @@ class GpsInterface {
bool getGpsModuleStatus();
String getLat();
String getLon();
int32_t getLatInt();
int32_t getLonInt();
float getAlt();
float getAccuracy();
String getDatetime();
@@ -93,6 +95,8 @@ class GpsInterface {
String notparsed_nmea_sentence = "";
String lat = "";
String lon = "";
int32_t lat_int = 0;
int32_t lon_int = 0;
float altf = 0.0;
float accuracy = 0.0;
String datetime = "";
@@ -117,6 +121,9 @@ class GpsInterface {
void flush_queue_nmea();
String dt_string_from_gps();
void setGPSInfo();
bool probeBaud(uint32_t baud);
void setGpsTo115200From9600();
uint32_t initGpsBaudAndForce115200();
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -9,6 +9,10 @@
#include "Keyboard.h"
#endif
#ifdef HAS_TOUCH
#include "TouchKeyboard.h"
#endif
#ifdef HAS_SCREEN
#define BATTERY_ANALOG_ON 0
@@ -93,42 +97,12 @@ extern Settings settings_obj;
#define JOINED 38
#define FORCE 39
#define FUNNY_BEACON 40
PROGMEM void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p);
PROGMEM bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data);
PROGMEM static lv_disp_buf_t disp_buf;
PROGMEM static lv_color_t buf[LV_HOR_RES_MAX * 10];
PROGMEM static void ta_event_cb(lv_obj_t * ta, lv_event_t event);
PROGMEM static void join_wifi_keyboard_event_cb(lv_obj_t * keyboard, lv_event_t event);
PROGMEM static void start_ap_keyboard_event_cb(lv_obj_t * keyboard, lv_event_t event);
PROGMEM static void add_ssid_keyboard_event_cb(lv_obj_t * keyboard, lv_event_t event);
PROGMEM static void html_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void ap_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void ap_info_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void at_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void station_list_cb(lv_obj_t * btn, lv_event_t event);
PROGMEM static void setting_dropdown_cb(lv_obj_t * btn, lv_event_t event);
// lvgl stuff
PROGMEM static lv_obj_t *kb;
PROGMEM static lv_obj_t * save_as_kb;
#define FLOCK 41
struct Menu;
// Individual Nodes of a menu
/*struct MenuNode {
String name;
bool command;
uint16_t color;
uint8_t icon;
TFT_eSPI_Button* button;
bool selected;
std::function<void()> callable;
};*/
struct MenuNode {
String name;
bool command;
@@ -174,13 +148,13 @@ class MenuFunctions
Menu deviceMenu;
// Device menu stuff
Menu whichUpdateMenu;
//Menu whichUpdateMenu;
Menu failedUpdateMenu;
Menu confirmMenu;
Menu updateMenu;
Menu settingsMenu;
Menu specSettingMenu;
Menu languageMenu;
//Menu languageMenu;
Menu sdDeleteMenu;
// WiFi menu stuff
@@ -194,9 +168,9 @@ class MenuFunctions
Menu wifiAPMenu;
Menu wifiIPMenu;
Menu ssidsMenu;
#ifdef HAS_BT
Menu airtagMenu;
#endif
//#ifdef HAS_BT
// Menu airtagMenu;
//#endif
//#ifndef HAS_ILI9341
Menu wifiStationMenu;
//#endif
@@ -219,7 +193,7 @@ class MenuFunctions
Menu evilPortalMenu;
static void lv_tick_handler();
//static void lv_tick_handler();
// Menu icons
@@ -252,7 +226,9 @@ class MenuFunctions
void buttonSelected(int b, int x = -1);
void buttonNotSelected(int b, int x = -1);
//#if (!defined(HAS_ILI9341) && defined(HAS_BUTTONS))
#ifdef HAS_MINI_KB
String miniKeyboard(Menu * targetMenu, bool do_pass = false);
#endif
//#endif
#ifdef MARAUDER_CARDPUTER
@@ -284,7 +260,7 @@ class MenuFunctions
Menu infoMenu;
Menu apInfoMenu;
Ticker tick;
//Ticker tick;
uint16_t x = -1, y = -1;
boolean pressed = false;
@@ -295,13 +271,8 @@ class MenuFunctions
void joinWiFiGFX(String essid, bool start_ap = false);
void setGraphScale(float scale);
void initLVGL();
void deinitLVGL();
void selectEPHTMLGFX();
void updateStatusBar();
void addSSIDGFX();
void addAPGFX(String type = "AP");
void addStationGFX();
void buildButtons(Menu* menu, int starting_index = 0, String button_name = "");
void changeMenu(Menu* menu, bool simple_change = false);
void drawStatusBar();

View File

@@ -82,10 +82,10 @@ bool SDInterface::initSD() {
}
if (!SD.exists("/SCRIPTS")) {
Serial.println("/SCRIPTS does not exist. Creating...");
Serial.println(F("/SCRIPTS does not exist. Creating..."));
SD.mkdir("/SCRIPTS");
Serial.println("/SCRIPTS created");
Serial.println(F("/SCRIPTS created"));
}
this->sd_files = new LinkedList<String>();
@@ -96,7 +96,7 @@ bool SDInterface::initSD() {
}
#else
Serial.println("SD support disabled, skipping init");
Serial.println(F("SD support disabled, skipping init"));
return false;
#endif
}
@@ -280,7 +280,7 @@ void SDInterface::performUpdate(Stream &updateSource, size_t updateSize) {
display_obj.tft.setTextColor(TFT_RED);
display_obj.tft.println(text_table2[12]);
#endif
Serial.println("Update not finished? Something went wrong!");
Serial.println(F("Update not finished? Something went wrong!"));
#ifdef HAS_SCREEN
display_obj.tft.setTextColor(TFT_WHITE);
#endif
@@ -299,7 +299,7 @@ void SDInterface::performUpdate(Stream &updateSource, size_t updateSize) {
#ifdef HAS_SCREEN
display_obj.tft.println(text_table2[14]);
#endif
Serial.println("Not enough space to begin OTA");
Serial.println(F("Not enough space to begin OTA"));
}
}

View File

@@ -0,0 +1,402 @@
#include "TouchKeyboard.h"
#include <string.h>
#include <Arduino.h>
#ifdef HAS_TOUCH
extern Display display_obj;
// Keyboard will occupy the bottom half of the screen.
static inline int16_t kbHeight() { return TFT_HEIGHT / 2; }
static inline int16_t kbYStart() { return TFT_HEIGHT - kbHeight(); }
static inline int16_t kbWidth() { return TFT_WIDTH; }
static inline int16_t kbXStart() { return 0; }
static const int KEY_ROWS = 5;
static const char ROW0_ALPHA[] = "1234567890";
static const char ROW1_ALPHA[] = "qwertyuiop";
static const char ROW2_ALPHA[] = "asdfghjkl";
static const char ROW3_ALPHA[] = "zxcvbnm.";
static const char ROW0_SYM[] = "!@#$%^&*()";
static const char ROW1_SYM[] = "`~-_=+[]{}";
static const char ROW2_SYM[] = "\\|;:'\"";
static const char ROW3_SYM[] = ",.<>/?";
static const uint16_t TOUCH_THRESHOLD = 600;
enum KeyboardLayout {
LAYOUT_ALPHA = 0,
LAYOUT_SYMBOLS
};
static void drawTextArea(const char *title, const char *buffer) {
int16_t areaHeight = TFT_HEIGHT - kbHeight();
// Clear text area
display_obj.tft.fillRect(0, 0, TFT_WIDTH, areaHeight, TFT_BLACK);
int16_t cursorY = 2;
// Optional title
if (title && title[0] != '\0') {
display_obj.tft.setCursor(2, cursorY);
display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK);
display_obj.tft.print(title);
cursorY += 16;
}
// Draw current text
display_obj.tft.setCursor(2, cursorY);
display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK);
display_obj.tft.print(buffer ? buffer : "");
}
static void drawKeyboard(KeyboardLayout layout, bool caps) {
const int16_t kY = kbYStart();
const int16_t kH = kbHeight();
const int16_t kX = kbXStart();
const int16_t kW = kbWidth();
const int maxCols = 10;
const int rows = KEY_ROWS;
const int16_t cellW = kW / maxCols;
const int16_t cellH = kH / rows;
display_obj.tft.fillRect(kX, kY, kW, kH, TFT_DARKGREY);
display_obj.tft.setTextColor(TFT_BLACK, TFT_DARKGREY);
// Choose row strings based on layout
const char *rowStringsAlpha[4] = {
ROW0_ALPHA, ROW1_ALPHA, ROW2_ALPHA, ROW3_ALPHA
};
const char *rowStringsSym[4] = {
ROW0_SYM, ROW1_SYM, ROW2_SYM, ROW3_SYM
};
const char **rowsPtr = (layout == LAYOUT_ALPHA)
? (const char **)rowStringsAlpha
: (const char **)rowStringsSym;
// Draw normal character rows (03)
for (int r = 0; r < 4; ++r) {
const char *row = rowsPtr[r];
// For alpha layout row 3, we will also draw CAPS on the rightmost 2 columns.
// The textual row only covers the first part.
int rowLen = strlen(row);
int16_t rowY = kY + r * cellH;
// For alpha row 3, we want row chars towards the left, leaving space for CAPS.
int16_t xOffset;
if (layout == LAYOUT_ALPHA && r == 3) {
// Use columns 0..7 for characters, 8..9 for CAPS
xOffset = 0;
} else {
int maxColsRow = maxCols;
xOffset = (maxColsRow - rowLen);
if (xOffset < 0) xOffset = 0;
xOffset = (xOffset * cellW) / 2; // center row
}
for (int i = 0; i < rowLen; ++i) {
int16_t keyX = kX + xOffset + i * cellW;
int16_t keyY = rowY;
// Key border
display_obj.tft.drawRect(keyX, keyY, cellW, cellH, TFT_BLACK);
// Label
display_obj.tft.setCursor(keyX + cellW / 2 - 3, keyY + cellH / 2 - 4);
char c = row[i];
// Apply CAPS on alpha letters
if (layout == LAYOUT_ALPHA && r > 0) {
if (c >= 'a' && c <= 'z') {
if (caps) {
c = (char)(c - 'a' + 'A');
}
}
}
char s[2] = { c, '\0' };
display_obj.tft.print(s);
}
// Draw CAPS key for alpha layout on row 3 (rightmost two columns)
if (layout == LAYOUT_ALPHA && r == 3) {
int16_t capsX = kX + 8 * cellW;
int16_t capsW = 2 * cellW;
display_obj.tft.drawRect(capsX, rowY, capsW, cellH, TFT_BLACK);
display_obj.tft.setCursor(capsX + 4, rowY + cellH / 2 - 4);
// Show different label based on state
if (caps) {
display_obj.tft.print("caps");
} else {
display_obj.tft.print("CAPS");
}
}
}
// Special row (row index 4): CANCEL | SYMB/ABC | SPACE | BKSP | OK
int r = 4;
int16_t rowY = kY + r * cellH;
// Divide width into 6 segments:
// [CANCEL][SYMB][SPACE (2 segments)][BKSP][OK]
int16_t segW = kW / 6;
int16_t x0 = kX;
int16_t x1 = x0 + segW; // end CANCEL
int16_t x2 = x1 + segW; // end SYMB
int16_t x3 = x2 + 2 * segW; // end SPACE
int16_t x4 = x3 + segW; // end BKSP
int16_t x5 = x4 + segW; // end OK
// CANCEL
display_obj.tft.drawRect(x0, rowY, segW, cellH, TFT_BLACK);
display_obj.tft.setCursor(x0 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("CANCEL");
// SYMB / ABC
display_obj.tft.drawRect(x1, rowY, segW, cellH, TFT_BLACK);
display_obj.tft.setCursor(x1 + 4, rowY + cellH / 2 - 4);
if (layout == LAYOUT_ALPHA) {
display_obj.tft.print("SYMB");
} else {
display_obj.tft.print("ABC");
}
display_obj.tft.drawRect(x2, rowY, (x3 - x2), cellH, TFT_BLACK);
display_obj.tft.setCursor(x2 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("SPACE");
display_obj.tft.drawRect(x3, rowY, (x4 - x3), cellH, TFT_BLACK);
display_obj.tft.setCursor(x3 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("BKSP");
display_obj.tft.drawRect(x4, rowY, (x5 - x4), cellH, TFT_BLACK);
display_obj.tft.setCursor(x4 + 4, rowY + cellH / 2 - 4);
display_obj.tft.print("OK");
}
static bool appendChar(char *buffer, size_t bufLen, char c) {
size_t len = strlen(buffer);
if (len + 1 < bufLen) {
buffer[len] = c;
buffer[len + 1] = '\0';
return true;
}
return false;
}
static KeyboardResult handleKeyboardTouch(uint16_t tx, uint16_t ty,
char *buffer, size_t bufLen,
KeyboardLayout layout,
bool caps) {
if (!buffer || bufLen < 2) return KB_NONE;
const int16_t kY = kbYStart();
const int16_t kH = kbHeight();
const int16_t kX = kbXStart();
const int16_t kW = kbWidth();
if (ty < kY || ty >= (kY + kH)) {
// Touch is outside keyboard area
return KB_NONE;
}
const int maxCols = 10;
const int rows = KEY_ROWS;
const int16_t cellW = kW / maxCols;
const int16_t cellH = kH / rows;
int rowIndex = (ty - kY) / cellH;
// Choose row strings based on layout
const char *rowStringsAlpha[4] = {
ROW0_ALPHA, ROW1_ALPHA, ROW2_ALPHA, ROW3_ALPHA
};
const char *rowStringsSym[4] = {
ROW0_SYM, ROW1_SYM, ROW2_SYM, ROW3_SYM
};
const char **rowsPtr = (layout == LAYOUT_ALPHA)
? (const char **)rowStringsAlpha
: (const char **)rowStringsSym;
// Normal rows (0..3)
if (rowIndex >= 0 && rowIndex <= 3) {
const char *row = rowsPtr[rowIndex];
int rowLen = strlen(row);
int16_t rowY = kY + rowIndex * cellH;
// Alpha row 3: characters on columns 0..7, CAPS on columns 8..9
if (layout == LAYOUT_ALPHA && rowIndex == 3) {
int16_t capsXStart = kX + 8 * cellW;
int16_t capsXEnd = capsXStart + 2 * cellW;
// Check CAPS region
if (tx >= capsXStart && tx < capsXEnd) {
return KB_TOGGLE_CAPS;
}
// Characters only in the columns before CAPS
int16_t xOffset = 0;
if (tx < kX || tx >= (kX + 8 * cellW)) {
return KB_NONE;
}
int colIndex = (tx - (kX + xOffset)) / cellW;
if (colIndex < 0 || colIndex >= rowLen) return KB_NONE;
char c = row[colIndex];
// Apply caps mapping
if (c >= 'a' && c <= 'z' && caps) {
c = (char)(c - 'a' + 'A');
}
if (appendChar(buffer, bufLen, c)) {
return KB_CHANGED;
}
return KB_NONE;
}
// All other rows
int16_t xOffset = (maxCols - rowLen);
if (xOffset < 0) xOffset = 0;
xOffset = (xOffset * cellW) / 2;
if (tx < kX + xOffset || tx >= kX + xOffset + rowLen * cellW) {
return KB_NONE;
}
int colIndex = (tx - (kX + xOffset)) / cellW;
if (colIndex < 0 || colIndex >= rowLen) return KB_NONE;
char c = row[colIndex];
// Apply caps on alpha letters (rows 1 and 2)
if (layout == LAYOUT_ALPHA && rowIndex > 0) {
if (c >= 'a' && c <= 'z' && caps) {
c = (char)(c - 'a' + 'A');
}
}
if (appendChar(buffer, bufLen, c)) {
return KB_CHANGED;
}
return KB_NONE;
}
// Special row (rowIndex == 4): CANCEL | SYMB/ABC | SPACE | BKSP | OK
if (rowIndex == 4) {
int16_t rowY = kY + rowIndex * cellH;
int16_t segW = kW / 6;
int16_t x0 = kX;
int16_t x1 = x0 + segW; // end CANCEL
int16_t x2 = x1 + segW; // end SYMB
int16_t x3 = x2 + 2 * segW; // end SPACE
int16_t x4 = x3 + segW; // end BKSP
int16_t x5 = x4 + segW; // end OK
// CANCEL
if (tx >= x0 && tx < x1) {
return KB_CANCEL;
}
// SYMB / ABC toggle
if (tx >= x1 && tx < x2) {
return KB_TOGGLE_LAYOUT;
}
// SPACE (x2..x3)
if (tx >= x2 && tx < x3) {
if (appendChar(buffer, bufLen, ' ')) {
return KB_CHANGED;
}
return KB_NONE;
}
// BKSP (x3..x4)
if (tx >= x3 && tx < x4) {
size_t len = strlen(buffer);
if (len > 0) {
buffer[len - 1] = '\0';
return KB_CHANGED;
}
return KB_NONE;
}
// OK (x4..x5)
if (tx >= x4 && tx < x5) {
return KB_DONE;
}
}
return KB_NONE;
}
bool keyboardInput(char *buffer, size_t bufLen, const char *title) {
if (!buffer || bufLen < 2) {
return false;
}
// To force clear, uncomment this:
// buffer[0] = '\0';
KeyboardLayout layout = LAYOUT_ALPHA;
bool caps = false;
drawTextArea(title, buffer);
drawKeyboard(layout, caps);
uint32_t lastTouchTime = 0;
const uint32_t debounceMs = 120;
while (true) {
uint16_t x = 0, y = 0;
uint8_t touched = display_obj.updateTouch(&x, &y, TOUCH_THRESHOLD);
if (touched) {
uint32_t now = millis();
if (now - lastTouchTime < debounceMs) {
// "debounce"
continue;
}
lastTouchTime = now;
KeyboardResult r = handleKeyboardTouch(x, y, buffer, bufLen, layout, caps);
if (r == KB_CHANGED) {
drawTextArea(title, buffer);
} else if (r == KB_DONE) {
drawTextArea(title, buffer);
return true;
} else if (r == KB_CANCEL) {
// Optional: buffer[0] = '\0';
drawTextArea(title, buffer);
return false;
} else if (r == KB_TOGGLE_LAYOUT) {
layout = (layout == LAYOUT_ALPHA) ? LAYOUT_SYMBOLS : LAYOUT_ALPHA;
drawKeyboard(layout, caps);
} else if (r == KB_TOGGLE_CAPS) {
caps = !caps;
drawKeyboard(layout, caps);
}
}
delay(5);
yield();
}
return false;
}
#endif

View File

@@ -0,0 +1,31 @@
#pragma once
#include "configs.h"
#ifdef HAS_TOUCH
#include "Display.h"
#include <stddef.h>
#include <stdint.h>
enum KeyboardResult {
KB_NONE = 0,
KB_CHANGED,
KB_DONE,
KB_CANCEL,
KB_TOGGLE_LAYOUT,
KB_TOGGLE_CAPS
};
/**
* Blocking keyboard input.
*
* @param buffer Caller-provided char buffer to hold the text. Will be null-terminated.
* @param bufLen Total size of the buffer (including space for '\0').
* @param title Optional title displayed above the text box (can be nullptr).
*
* @return true if user pressed OK, false if user pressed CANCEL (or if buffer invalid).
*/
bool keyboardInput(char *buffer, size_t bufLen, const char *title = nullptr);
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -14,7 +14,7 @@
#include <NimBLEDevice.h> // 1.3.8, 2.3.2
#endif
#ifdef HAS_DUAL_BAND
#ifdef HAS_IDF_3
extern "C" {
#include "esp_netif.h"
#include "esp_netif_net_stack.h"
@@ -28,12 +28,19 @@
#include "esp_wifi.h"
#include "esp_wifi_types.h"
#include <esp_timer.h>
#include <lwip/etharp.h>
#include <lwip/ip_addr.h>
#ifdef HAS_DUAL_BAND
#include "esp_system.h"
#include "mbedtls/entropy.h"
#include "mbedtls/bignum.h"
#include "mbedtls/ctr_drbg.h"
#include "mbedtls/ecp.h"
#ifndef HAS_IDF_3
#include <lwip/etharp.h>
#include <lwip/ip_addr.h>
#endif
#ifdef HAS_BT
#ifdef HAS_IDF_3
#include "esp_system.h"
#include "esp_mac.h"
#endif
#if defined(HAS_BT) && !defined(HAS_NIMBLE_2)
#include "esp_bt.h"
#endif
#ifdef HAS_SCREEN
@@ -138,6 +145,13 @@
#define WIFI_HOSTSPOT 69 // Nice
#define BT_SCAN_AIRTAG_MON 70
#define WIFI_SCAN_CHAN_ACT 71
#define BT_SCAN_FLOCK 72
#define BT_SCAN_SIMPLE 73
#define BT_SCAN_SIMPLE_TWO 74
#define BT_SCAN_FLOCK_WARDRIVE 75
#define WIFI_SCAN_DETECT_FOLLOW 76
#define WIFI_SCAN_SAE_COMMIT 77
#define WIFI_ATTACK_SAE_COMMIT 78
#define WIFI_ATTACK_FUNNY_BEACON 99
@@ -209,9 +223,25 @@ extern Settings settings_obj;
esp_err_t esp_wifi_80211_tx(wifi_interface_t ifx, const void *buffer, int len, bool en_sys_seq);
#ifdef HAS_DUAL_BAND
esp_err_t esp_base_mac_addr_set(uint8_t *Mac);
#endif
#define EMPTY_ENTRY 0
#define VALID_ENTRY 1
#define TOMBSTONE_ENTRY 2
#pragma pack(push, 1)
struct MacEntry {
uint8_t mac[6];
uint32_t last_seen_ms;
uint16_t frame_count;
int32_t first_lat_e6;
int32_t first_lon_e6;
int32_t last_lat_e6;
int32_t last_lon_e6;
bool following;
int32_t dloc;
int8_t rssi;
bool bt;
};
#pragma pack(pop)
struct AirTag {
String mac; // MAC address of the AirTag
@@ -231,6 +261,11 @@ struct Flipper {
extern struct mac_addr* mac_history;
#endif
enum class MacSortMode : uint8_t {
MOST_RECENT,
MOST_FRAMES
};
class WiFiScan
{
private:
@@ -240,6 +275,8 @@ class WiFiScan
struct mac_addr mac_history[mac_history_len];
#endif
int current_act_len = 0;
uint32_t chanActTime = 0;
uint8_t ap_mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
@@ -275,6 +312,8 @@ class WiFiScan
//int num_deauth = 0; // RED
uint32_t initTime = 0;
uint32_t last_ui_update = 0;
uint32_t last_sour_apple_update = 0;
bool run_setup = true;
void initWiFi(uint8_t scan_mode);
uint8_t bluetoothScanTime = 5;
@@ -400,6 +439,15 @@ class WiFiScan
LinkedList<ConfirmedMultiSSID>* confirmed_multissid;
bool multissid_list_full_reported;
uint8_t sae_commit[32] = {
0xb0, 0x00, 0x00, 0x00, // Type/Subtype, Duration
0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, // Destination
0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // Source
0xBB, 0xBB, 0xBB, 0xBB, 0xBB, 0xBB, // BSSID (Destination)
0x00, 0x00, // Frag num
0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x13, 0x00 // Auth alg (SAE), SAE sequence, group 19
};
// barebones packet
uint8_t packet[128] = { 0x80, 0x00, 0x00, 0x00, //Frame Control, Duration
/*4*/ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, //Destination address
@@ -519,6 +567,9 @@ class WiFiScan
NimBLEAdvertisementData GetUniversalAdvertisementData(EBLEPayloadType type);
#endif
void updateTrackerUI();
void showNetworkInfo();
void setNetworkInfo();
void fullARP();
bool readARP(IPAddress targ_ip);
bool singleARP(IPAddress ip_addr);
@@ -527,19 +578,19 @@ class WiFiScan
bool isHostAlive(IPAddress ip);
bool checkHostPort(IPAddress ip, uint16_t port, uint16_t timeout = 100);
String extractManufacturer(const uint8_t* payload);
int checkMatchAP(char addr[]);
int checkMatchAP(char addr[], bool update_ap = true);
bool beaconHasWPS(const uint8_t* payload, int len);
uint8_t getSecurityType(const uint8_t* beacon, uint16_t len);
void addAnalyzerValue(int16_t value, int rssi_avg, int16_t target_array[], int array_size);
bool seen_mac(unsigned char* mac);
bool mac_cmp(struct mac_addr addr1, struct mac_addr addr2);
void save_mac(unsigned char* mac);
bool mac_cmp(uint8_t addr1[6], uint8_t addr2[6]);
void clearMacHistory();
void executeWarDrive();
void executeSourApple();
void executeSpoofAirtag();
void executeSwiftpairSpam(EBLEPayloadType type);
void startWardriverWiFi();
void saeAttackLoop(uint32_t currentTime);
//void generateRandomMac(uint8_t* mac);
//void generateRandomName(char *name, size_t length);
String processPwnagotchiBeacon(const uint8_t* frame, int length);
@@ -558,6 +609,7 @@ class WiFiScan
void tftDrawChannelScaleButtons();
void tftDrawColorKey();
void tftDrawGraphObjects();
bool sendSAECommitFrame(uint8_t* targ_addr, uint8_t* src_addr) ;
void sendProbeAttack(uint32_t currentTime);
void sendDeauthAttack(uint32_t currentTime, String dst_mac_str = "ff:ff:ff:ff:ff:ff");
void sendBadMsgAttack(uint32_t currentTime, bool all = false);
@@ -584,11 +636,11 @@ class WiFiScan
void RunDeauthScan(uint8_t scan_mode, uint16_t color);
void RunEapolScan(uint8_t scan_mode, uint16_t color);
void RunProbeScan(uint8_t scan_mode, uint16_t color);
void RunSAEScan(uint8_t scan_mode, uint16_t color);
void RunPacketMonitor(uint8_t scan_mode, uint16_t color);
void RunBluetoothScan(uint8_t scan_mode, uint16_t color);
void RunSourApple(uint8_t scan_mode, uint16_t color);
void RunSwiftpairSpam(uint8_t scan_mode, uint16_t color);
void RunLvJoinWiFi(uint8_t scan_mode, uint16_t color);
void RunEvilPortal(uint8_t scan_mode, uint16_t color);
void RunPingScan(uint8_t scan_mode, uint16_t color);
void RunPortScanAll(uint8_t scan_mode, uint16_t color);
@@ -596,6 +648,7 @@ class WiFiScan
void parseBSSID(const char* bssidStr, uint8_t* bssid);
void writeHeader(bool poi = false);
void writeFooter(bool poi = false);
void displayWardriveStats();
public:
@@ -605,6 +658,13 @@ class WiFiScan
//LinkedList<ssid>* ssids;
volatile bool bt_cb_busy = false;
volatile bool bt_pending_clear = false;
static MacEntry mac_entries[mac_history_len];
static uint8_t mac_entry_state[mac_history_len];
// Stuff for RAW stats
uint32_t mgmt_frames = 0;
uint32_t data_frames = 0;
@@ -616,10 +676,20 @@ class WiFiScan
int8_t min_rssi = 0;
int8_t max_rssi = -128;
int bt_frames = 0;
bool force_pmkid = false;
bool force_probe = false;
bool save_pcap = false;
bool ep_deauth = false;
bool ble_scanning = false;
char* flock_ssid[4] = {
"flock",
"penguin",
"pigvision",
"fs ext battery"
};
#ifdef HAS_DUAL_BAND
uint8_t channel_activity[DUAL_BAND_CHANNELS] = {};
@@ -672,7 +742,7 @@ class WiFiScan
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
#ifndef HAS_DUAL_BAND
#ifndef HAS_IDF_3
wifi_init_config_t cfg2 = { \
.event_handler = &esp_event_send_internal, \
.osi_funcs = &g_wifi_osi_funcs, \
@@ -715,6 +785,16 @@ class WiFiScan
#ifdef HAS_SCREEN
int8_t checkAnalyzerButtons(uint32_t currentTime);
#endif
bool seen_mac(unsigned char* mac, bool simple = true);
int16_t seen_mac_int(unsigned char* mac, bool simple = true);
int update_mac_entry(const uint8_t mac[6], int8_t rssi = 0, bool bt = false);
inline void insert_mac_entry(uint32_t idx, const uint8_t mac[6], uint32_t now_ms, int8_t rssi = 0, bool bt = false);
void evict_and_insert(const uint8_t mac[6], uint32_t now_ms);
uint8_t build_top10_for_ui(MacEntry* out_top10, MacSortMode mode);
void save_mac(unsigned char* mac);
#ifdef HAS_BT
void copyNimbleMac(const BLEAddress &addr, unsigned char out[6]);
#endif
bool filterActive();
bool RunGPSInfo(bool tracker = false, bool display = true, bool poi = false);
void logPoint(String lat, String lon, float alt, String datetime, bool poi = false);
@@ -740,8 +820,7 @@ class WiFiScan
bool scanning();
bool joinWiFi(String ssid, String password, bool gui = true);
bool startWiFi(String ssid, String password, bool gui = true);
String getStaMAC();
String getApMAC();
void getMAC(bool get_sta, uint8_t* mac);
String freeRAM();
void changeChannel();
void changeChannel(int chan);
@@ -775,15 +854,22 @@ class WiFiScan
void startGPX(String file_name);
//String macToString(const Station& station);
static bool initMbedtls();
static int mbedtls_entropy_source(void *data, unsigned char *output, size_t len);
static bool getSAEACT(const uint8_t *frame, size_t frame_len, uint16_t &group_out, size_t &act_len_out);
static bool sae_group_sizes(uint16_t group, size_t &scalar_len, size_t &element_len);
static bool mac_cmp(const uint8_t *a, const uint8_t *b);
static inline uint16_t le16(const uint8_t *p);
static void getMAC(char *addr, uint8_t* data, uint16_t offset);
static void getMAC(uint8_t* mac, const uint8_t* data, uint16_t offset);
static void pwnSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void beaconSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void rawSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
//static void rawSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void stationSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void apSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void apSnifferCallbackFull(void* buf, wifi_promiscuous_pkt_type_t type);
static void deauthSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void probeSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
//static void probeSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void beaconListSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void activeEapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
static void eapolSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type);
@@ -791,5 +877,6 @@ class WiFiScan
static void pineScanSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type); // Pineapple
static int extractPineScanChannel(const uint8_t* payload, int len); // Pineapple
static void multiSSIDSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type); // MultiSSID
static inline uint32_t hash_mac(const uint8_t mac[6]);
};
#endif

View File

@@ -6,6 +6,8 @@
#define POLISH_POTATO
//#define DEVELOPER
//// BOARD TARGETS
//#define MARAUDER_M5STICKC
//#define MARAUDER_M5STICKCP2
@@ -32,10 +34,12 @@
//#define MARAUDER_V8
//// END BOARD TARGETS
#define MARAUDER_VERSION "v1.8.10"
#define MARAUDER_VERSION "v1.10.0"
#define GRAPH_REFRESH 100
#define TRACK_EVICT_SEC 90 // Seconds before marking tracked MAC as tombstone
#define DUAL_BAND_CHANNELS 51
//// HARDWARE NAMES
@@ -136,6 +140,10 @@
#define USE_SD
#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_NIMBLE_2
#define HAS_IDF_3
//#define HAS_C5_SD
#define HAS_SIMPLEX_DISPLAY
#endif
#ifdef MARAUDER_V7
@@ -153,6 +161,8 @@
#define USE_SD
#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_NIMBLE_2
#define HAS_IDF_3
#endif
#ifdef MARAUDER_V7_1
@@ -171,6 +181,7 @@
#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_PSRAM
//#define HAS_NIMBLE_2
#endif
#ifdef MARAUDER_REV_FEATHER
@@ -203,6 +214,9 @@
#define USE_SD
#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_NIMBLE_2
#define HAS_IDF_3
#define HAS_C5_SD
#endif
#if defined(MARAUDER_V6) || defined(MARAUDER_V6_1)
@@ -220,6 +234,9 @@
#define USE_SD
#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_NIMBLE_2
#define HAS_IDF_3
#define HAS_C5_SD
#endif
#ifdef MARAUDER_CYD_MICRO
@@ -239,6 +256,7 @@
#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_CYD_TOUCH
//#define HAS_NIMBLE_2
#endif
#ifdef MARAUDER_CYD_2USB
@@ -259,6 +277,7 @@
#define HAS_GPS
#define HAS_CYD_TOUCH
#define HAS_CYD_PORTRAIT
//#define HAS_NIMBLE_2
#endif
#ifdef MARAUDER_CYD_3_5_INCH
@@ -280,6 +299,7 @@
//#define HAS_CYD_TOUCH
#define HAS_SEPARATE_SD
#define HAS_CYD_PORTRAIT
//#define HAS_NIMBLE_2
#endif
#ifdef MARAUDER_CYD_GUITION
@@ -299,6 +319,7 @@
#define HAS_TEMP_SENSOR
#define HAS_GPS
//#define HAS_CYD_TOUCH
//#define HAS_NIMBLE_2
#endif
#ifdef MARAUDER_KIT
@@ -315,6 +336,9 @@
#define USE_SD
#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_NIMBLE_2
#define HAS_IDF_3
#define HAS_C5_SD
#endif
#ifdef GENERIC_ESP32
@@ -328,6 +352,7 @@
//#define HAS_SD
//#define HAS_TEMP_SENSOR
//#define HAS_GPS
//#define HAS_NIMBLE_2
#endif
#ifdef MARAUDER_FLIPPER
@@ -374,6 +399,8 @@
#define USE_SD
//#define HAS_TEMP_SENSOR
//#define HAS_GPS
#define HAS_NIMBLE_2
#define HAS_IDF_3
#endif
#ifdef MARAUDER_DEV_BOARD_PRO
@@ -388,6 +415,8 @@
#define USE_SD
//#define HAS_TEMP_SENSOR
#define HAS_GPS
#define HAS_NIMBLE_2
#define HAS_IDF_3
#endif
#ifdef XIAO_ESP32_S3
@@ -407,7 +436,7 @@
//#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
//#define HAS_BATTERY
//#define HAS_BT
#define HAS_BT
//#define HAS_BUTTONS
#define HAS_NEOPIXEL_LED
//#define HAS_PWR_MGMT
@@ -419,6 +448,8 @@
#define HAS_DUAL_BAND
//#define HAS_PSRAM
//#define HAS_TEMP_SENSOR
#define HAS_NIMBLE_2
#define HAS_IDF_3
#endif
#ifdef MARAUDER_V8
@@ -426,9 +457,9 @@
//#define HAS_FLIPPER_LED
//#define FLIPPER_ZERO_HAT
#define HAS_BATTERY
//#define HAS_BT
#define HAS_BT
//#define HAS_BUTTONS
#define HAS_NEOPIXEL_LED
//#define HAS_NEOPIXEL_LED
//#define HAS_PWR_MGMT
#define HAS_SCREEN
#define HAS_FULL_SCREEN
@@ -439,6 +470,8 @@
#define HAS_DUAL_BAND
#define HAS_PSRAM
//#define HAS_TEMP_SENSOR
#define HAS_NIMBLE_2
#define HAS_IDF_3
#endif
//// END BOARD FEATURES
@@ -2536,6 +2569,36 @@
#define SD_MOSI TFT_MOSI
#define SD_SCK TFT_SCLK
#endif
#ifdef MARAUDER_V4
#define SD_MISO TFT_MISO
#define SD_MOSI TFT_MOSI
#define SD_SCK TFT_SCLK
#endif
#ifdef MARAUDER_V6
#define SD_MISO TFT_MISO
#define SD_MOSI TFT_MOSI
#define SD_SCK TFT_SCLK
#endif
#ifdef MARAUDER_V6_1
#define SD_MISO TFT_MISO
#define SD_MOSI TFT_MOSI
#define SD_SCK TFT_SCLK
#endif
#ifdef MARAUDER_KIT
#define SD_MISO TFT_MISO
#define SD_MOSI TFT_MOSI
#define SD_SCK TFT_SCLK
#endif
#ifdef MARAUDER_MINI
#define SD_MISO TFT_MISO
#define SD_MOSI TFT_MOSI
#define SD_SCK TFT_SCLK
#endif
#endif
//// END STUPID CYD STUFF

View File

@@ -154,10 +154,21 @@ void backlightOff() {
void setup()
{
#ifndef HAS_DUAL_BAND
randomSeed(esp_random());
#ifndef DEVELOPER
esp_log_level_set("*", ESP_LOG_NONE);
#endif
#ifndef HAS_IDF_3
esp_spiram_init();
#endif
Serial.begin(115200);
while(!Serial)
delay(10);
#ifdef HAS_C5_SD
Serial.println("Starting shared SPI for C5 SD configuration...");
sharedSPI.begin(SD_SCK, SD_MISO, SD_MOSI);
@@ -198,21 +209,30 @@ void setup()
delay(10);
#endif
Serial.begin(115200);
//Serial.begin(115200);
while(!Serial)
delay(10);
//while(!Serial)
// delay(10);
Serial.println("ESP-IDF version is: " + String(esp_get_idf_version()));
#ifdef HAS_PSRAM
if (psramInit()) {
Serial.println("PSRAM is correctly initialized");
Serial.println(F("PSRAM is correctly initialized"));
} else {
Serial.println("PSRAM not available");
Serial.println(F("PSRAM not available"));
}
#endif
#ifdef HAS_SIMPLEX_DISPLAY
#if defined(HAS_SD)
// Do some SD stuff
if(!sd_obj.initSD())
Serial.println(F("SD Card NOT Supported"));
#endif
#endif
#ifdef HAS_SCREEN
display_obj.RunSetup();
display_obj.tft.setTextColor(TFT_WHITE, TFT_BLACK);
@@ -243,7 +263,7 @@ void setup()
backlightOff();
Serial.println("Headless Mode enabled");
Serial.println(F("Headless Mode enabled"));
}
#endif
#endif
@@ -251,11 +271,14 @@ void setup()
settings_obj.begin();
buffer_obj = Buffer();
#if defined(HAS_SD)
// Do some SD stuff
if(!sd_obj.initSD())
Serial.println(F("SD Card NOT Supported"));
#ifndef HAS_SIMPLEX_DISPLAY
#if defined(HAS_SD)
// Do some SD stuff
if(!sd_obj.initSD())
Serial.println(F("SD Card NOT Supported"));
#endif
#endif
wifi_scan_obj.RunSetup();
@@ -298,6 +321,16 @@ void setup()
menu_function_obj.RunSetup();
#endif
/*char ssidBuf[64] = {0}; // or prefill with existing SSID
if (keyboardInput(ssidBuf, sizeof(ssidBuf), "Enter SSID")) {
// user pressed OK
Serial.println(ssidBuf);
} else {
Serial.println(F("User exited keyboard"));
}
menu_function_obj.changeMenu(menu_function_obj.current_menu);*/
wifi_scan_obj.StartScan(WIFI_SCAN_OFF);
Serial.println(F("CLI Ready"));

View File

@@ -27,135 +27,6 @@ struct ProbeReqSsid {
uint8_t requests;
};
const char apple_ouis[][9] PROGMEM = {
"00:17:F2", "00:1E:C2", "00:26:08", "F8:1E:DF", "BC:92:6B",
"28:E0:2C", "3C:07:54", "7C:D1:C3", "DC:A9:04", "F0:D1:A9",
"C0:2C:5C", "00:03:93", "00:03:94", "00:03:95", "00:03:96",
"00:03:97", "00:03:98", "00:03:99", "00:03:9A", "00:03:9B",
"00:03:9C", "00:03:9D", "00:03:9E", "00:03:9F", "00:03:A0",
"00:03:A1", "00:03:A2", "00:03:A3", "00:03:A4", "00:03:A5",
"00:03:A6", "00:03:A7", "00:03:A8", "00:03:A9", "00:03:AA",
"00:03:AB", "00:03:AC", "00:03:AD", "00:03:AE", "00:03:AF",
"00:03:B0", "00:03:B1", "00:03:B2", "00:03:B3", "00:03:B4",
"00:03:B5", "00:03:B6", "00:03:B7", "00:03:B8", "00:03:B9",
"00:03:BA", "00:03:BB", "00:03:BC", "00:03:BD", "00:03:BE",
"00:03:BF", "00:03:C0", "00:03:C1", "00:03:C2", "00:03:C3",
"00:03:C4", "00:03:C5", "00:03:C6", "00:03:C7", "00:03:C8",
"00:03:C9", "00:03:CA", "00:03:CB", "00:03:CC", "00:03:CD",
"00:03:CE", "00:03:CF", "00:03:D0", "00:03:D1", "00:03:D2",
"00:03:D3", "00:03:D4", "00:03:D5", "00:03:D6", "00:03:D7",
"00:03:D8", "00:03:D9", "00:03:DA", "00:03:DB", "00:03:DC",
"00:03:DD", "00:03:DE", "00:03:DF", "00:03:E0", "00:03:E1",
"00:03:E2", "00:03:E3", "00:03:E4", "00:03:E5", "00:03:E6",
"00:03:E7", "00:03:E8", "00:03:E9", "00:03:EA", "00:03:EB",
"00:03:EC", "00:03:ED", "00:03:EE", "00:03:EF", "00:03:F0",
"00:03:F1", "00:03:F2", "00:03:F3", "00:03:F4", "00:03:F5",
"00:03:F6", "00:03:F7", "00:03:F8", "00:03:F9", "00:03:FA",
"00:03:FB", "00:03:FC", "00:03:FD", "00:03:FE", "00:03:FF"
};
const char asus_ouis[][9] PROGMEM = {
"00:0C:6E", "00:0E:A6", "00:11:2F", "00:11:D8", "00:13:D4", "00:15:F2", "00:17:31", "00:18:F3", "00:1A:92",
"00:1B:FC", "00:1D:60", "00:1E:8C", "00:1F:C6", "00:22:15", "00:23:54", "00:24:8C", "00:26:18", "00:E0:18",
"04:42:1A", "04:92:26", "04:D4:C4", "04:D9:F5", "08:60:6E", "08:62:66", "08:BF:B8", "0C:9D:92", "10:7B:44",
"10:7C:61", "10:BF:48", "10:C3:7B", "14:DA:E9", "14:DD:A9", "18:31:BF", "1C:87:2C", "1C:B7:2C", "20:CF:30",
"24:4B:FE", "2C:4D:54", "2C:56:DC", "2C:FD:A1", "30:5A:3A", "30:85:A9", "34:97:F6", "38:2C:4A", "38:D5:47",
"3C:7C:3F", "40:16:7E", "40:B0:76", "48:5B:39", "4C:ED:FB", "50:46:5D", "50:EB:F6", "54:04:A6", "54:A0:50",
"58:11:22", "60:45:CB", "60:A4:4C", "60:CF:84", "70:4D:7B", "70:8B:CD", "74:D0:2B", "78:24:AF", "7C:10:C9",
"88:D7:F6", "90:E6:BA", "9C:5C:8E", "A0:36:BC", "A8:5E:45", "AC:22:0B", "AC:9E:17", "B0:6E:BF", "BC:AE:C5",
"BC:EE:7B", "C8:60:00", "C8:7F:54", "CC:28:AA", "D0:17:C2", "D4:5D:64", "D8:50:E6", "E0:3F:49", "E0:CB:4E",
"E8:9C:25", "F0:2F:74", "F0:79:59", "F4:6D:04", "F8:32:E4", "FC:34:97", "FC:C2:33"
};
const char belkin_ouis[][9] PROGMEM = {
"00:11:50", "00:17:3F", "00:30:BD", "08:BD:43", "14:91:82", "24:F5:A2", "30:23:03", "80:69:1A", "94:10:3E",
"94:44:52", "B4:75:0E", "C0:56:27", "C4:41:1E", "D8:EC:5E", "E8:9F:80", "EC:1A:59", "EC:22:80"
};
const char cisco_ouis[][9] PROGMEM = {
"00:1B:0D", "00:1D:45", "00:1E:7A", "00:25:9C", "00:50:56",
"40:55:39", "58:8D:09", "A4:4C:C8", "F8:0F:F9"
};
const char dlink_ouis[][9] PROGMEM = {
"00:05:5D", "00:0D:88", "00:0F:3D", "00:11:95", "00:13:46", "00:15:E9", "00:17:9A", "00:19:5B", "00:1B:11",
"00:1C:F0", "00:1E:58", "00:21:91", "00:22:B0", "00:24:01", "00:26:5A", "00:AD:24", "04:BA:D6", "08:5A:11",
"0C:0E:76", "0C:B6:D2", "10:62:EB", "10:BE:F5", "14:D6:4D", "18:0F:76", "1C:5F:2B", "1C:7E:E5", "1C:AF:F7",
"1C:BD:B9", "28:3B:82", "30:23:03", "34:08:04", "34:0A:33", "3C:1E:04", "3C:33:32", "40:86:CB", "40:9B:CD",
"54:B8:0A", "5C:D9:98", "60:63:4C", "64:29:43", "6C:19:8F", "6C:72:20", "74:44:01", "74:DA:DA", "78:32:1B",
"78:54:2E", "78:98:E8", "80:26:89", "84:C9:B2", "88:76:B9", "90:8D:78", "90:94:E4", "9C:D6:43", "A0:63:91",
"A0:AB:1B", "A4:2A:95", "A8:63:7D", "AC:F1:DF", "B4:37:D8", "B8:A3:86", "BC:0F:9A", "BC:22:28", "BC:F6:85",
"C0:A0:BB", "C4:A8:1D", "C4:E9:0A", "C8:78:7D", "C8:BE:19", "C8:D3:A3", "CC:B2:55", "D8:FE:E3", "DC:EA:E7",
"E0:1C:FC", "E4:6F:13", "E8:CC:18", "EC:22:80", "EC:AD:E0", "F0:7D:68", "F0:B4:D2", "F4:8C:EB", "F8:E9:03",
"FC:75:16"
};
const char google_ouis[][9] PROGMEM = {
"3C:5A:B4", "5C:BF:C0", "78:4F:43", "A4:77:33", "D4:97:0B", "F0:72:8C"
};
const char huawei_ouis[][9] PROGMEM = {
"00:1A:2B", "28:FF:3C", "5C:4C:A9", "8C:71:F8", "C8:D1:5E",
"E4:4C:A9", "F4:12:FA"
};
const char lg_ouis[][9] PROGMEM = {
"00:17:C0", "18:AF:8F", "38:2D:AE", "5C:87:9C", "68:27:37",
"78:5D:C8", "94:65:2D", "A4:77:33", "C4:43:8F"
};
const char linksys_ouis[][9] PROGMEM = {
"00:04:5A", "00:06:25", "00:0C:41", "00:0E:08", "00:0F:66", "00:12:17", "00:13:10", "00:14:BF", "00:16:B6",
"00:18:39", "00:18:F8", "00:1A:70", "00:1C:10", "00:1D:7E", "00:1E:E5", "00:21:29", "00:22:6B", "00:23:69",
"00:25:9C", "00:23:54", "00:24:B2", "00:31:92", "00:5F:67", "10:27:F5", "14:EB:B6", "1C:61:B4", "20:36:26",
"28:87:BA", "30:5A:3A", "2C:FD:A1", "30:23:03", "30:46:9A", "40:ED:00", "48:22:54", "50:91:E3", "54:AF:97",
"5C:A2:F4", "5C:A6:E6", "5C:E9:31", "60:A4:B7", "68:7F:F0", "6C:5A:B0", "78:8C:B5", "7C:C2:C6", "9C:53:22",
"9C:A2:F4", "A8:42:A1", "AC:15:A2", "B0:A7:B9", "B4:B0:24", "C0:06:C3", "CC:68:B6", "E8:48:B8", "F0:A7:31"
};
const char netgear_ouis[][9] PROGMEM = {
"00:09:5B", "00:0F:B5", "00:14:6C", "00:1B:2F", "00:1E:2A", "00:1F:33", "00:22:3F", "00:22:4B", "00:26:F2",
"00:8E:F2", "08:02:8E", "08:36:C9", "08:BD:43", "10:0C:6B", "10:0D:7F", "10:DA:43", "14:59:C0", "20:4E:7F",
"20:E5:2A", "28:80:88", "28:94:01", "28:C6:8E", "2C:30:33", "2C:B0:5D", "30:46:9A", "34:98:B5", "38:94:ED",
"3C:37:86", "40:5D:82", "44:A5:6E", "4C:60:DE", "50:4A:6E", "50:6A:03", "54:07:7D", "58:EF:68", "60:38:E0",
"6C:B0:CE", "6C:CD:D6", "74:44:01", "80:37:73", "84:1B:5E", "8C:3B:AD", "94:18:65", "9C:3D:CF", "9C:C9:EB",
"9C:D3:6D", "A0:04:60", "A0:21:B7", "A0:40:A0", "A4:2B:8C", "B0:39:56", "B0:7F:B9", "B0:B9:8A", "BC:A5:11",
"C0:3F:0E", "C0:FF:D4", "C4:04:15", "C4:3D:C7", "C8:9E:43", "CC:40:D0", "DC:EF:09", "E0:46:9A", "E0:46:EE",
"E0:91:F5", "E4:F4:C6", "E8:FC:AF", "F8:73:94"
};
const char oneplus_ouis[][9] PROGMEM = {
"08:EC:A9", "30:9C:23", "38:78:62", "64:A2:F9", "74:AC:B9",
"A8:14:51", "B4:86:55", "D8:CB:8A", "F4:8C:50"
};
const char samsung_ouis[][9] PROGMEM = {
"00:12:47", "00:15:99", "00:16:6B", "00:1B:FC", "10:5F:06",
"18:59:36", "20:02:AF", "24:4B:03", "38:2D:3D", "40:B8:37",
"00:1F:12", "00:1D:0F", "00:1A:9A", "00:19:E1", "00:18:FF",
"00:17:77", "00:16:72", "00:14:69", "00:13:65", "00:12:60",
"30:37:0D", "40:8C:47", "50:55:5F", "60:47:A1", "70:0A:AD",
"80:61:43", "90:48:F7", "A0:4C:CB", "B0:5E:93", "C0:3D:F5",
"D0:31:AA", "E0:4F:02", "F0:3B:94"
};
const char sony_ouis[][9] PROGMEM = {
"00:19:C5", "00:1B:59", "00:1E:DC", "10:68:3F", "54:42:49",
"A8:E3:EE", "B8:F9:34", "CC:5D:4E", "E8:89:2F"
};
const char tplink_ouis[][9] PROGMEM = {
"00:31:92", "00:5F:67", "10:27:F5", "14:EB:B6", "1C:61:B4", "20:36:26", "28:87:BA", "30:DE:4B", "34:60:F9",
"3C:52:A1", "40:ED:00", "48:22:54", "50:91:E3", "54:AF:97", "5C:62:8B", "5C:A6:E6", "5C:E9:31", "60:A4:B7",
"68:7F:F0", "6C:5A:B0", "78:8C:B5", "7C:C2:C6", "9C:53:22", "9C:A2:F4", "A8:42:A1", "AC:15:A2", "B0:A7:B9",
"B4:B0:24", "C0:06:C3", "CC:68:B6", "E8:48:B8", "F0:A7:31"
};
const char xiaomi_ouis[][9] PROGMEM = {
"04:CF:8C", "18:59:36", "38:1A:2D", "64:B4:73", "78:02:F8",
"90:4E:91", "C4:0B:CB", "D0:DB:32"
};
uint8_t getDRAMUsagePercent() {
//size_t total = heap_caps_get_total_size(MALLOC_CAP_8BIT);
//size_t free = heap_caps_get_free_size(MALLOC_CAP_8BIT);
@@ -185,6 +56,25 @@ uint8_t getDRAMUsagePercent() {
}
#endif
String hexDump(const uint8_t *buf, size_t len) {
String out;
out.reserve(len * 3); // "FF " per byte (approx)
for (size_t i = 0; i < len; i++) {
if (buf[i] < 0x10) {
out += '0';
}
out += String(buf[i], HEX);
if (i < len - 1) {
out += ' ';
}
}
out.toUpperCase();
return out;
}
String byteArrayToHexString(const std::vector<uint8_t>& byteArray) {
String result;
@@ -285,6 +175,14 @@ String macToString(uint8_t macAddr[6]) {
return String(macStr);
}
String macToString(const uint8_t macAddr[6]) {
char macStr[18]; // 17 characters for "XX:XX:XX:XX:XX:XX" + 1 null terminator
snprintf(macStr, sizeof(macStr), "%02X:%02X:%02X:%02X:%02X:%02X",
macAddr[0], macAddr[1], macAddr[2],
macAddr[3], macAddr[4], macAddr[5]);
return String(macStr);
}
void convertMacStringToUint8(const String& macStr, uint8_t macAddr[6]) {
// Ensure the input string is in the format "XX:XX:XX:XX:XX:XX"
if (macStr.length() != 17) {
@@ -299,7 +197,7 @@ void convertMacStringToUint8(const String& macStr, uint8_t macAddr[6]) {
}
// Function to check if the given MAC address matches any known OUI
const char* getManufacturer(const char *addr) {
/*const char* getManufacturer(const char *addr) {
static char oui[9]; // Temporary buffer for extracted OUI
// Extract the first three bytes (OUI) from addr
@@ -316,7 +214,7 @@ const char* getManufacturer(const char *addr) {
for (uint8_t i = 0; i < sizeof(list) / sizeof(list[0]); i++) { \
char storedOUI[9]; \
strcpy_P(storedOUI, list[i]); \
/* Convert the stored OUI to lowercase */ \
\
for (int j = 0; j < 8; j++) { \
storedOUI[j] = tolower(storedOUI[j]); \
} \
@@ -355,7 +253,7 @@ String replaceOUIWithManufacturer(const char *sta_addr) {
// Construct the new address: manufacturer + the remaining MAC address (after the first 3 bytes)
return String(manufacturer) + mac_suffix;
}
}*/
IPAddress getNextIP(IPAddress currentIP, IPAddress subnetMask) {
// Convert IPAddress to uint32_t

BIN
pictures/icons/flock_22.bmp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,9 @@
#define 301f3c12779740a0f7d41e7437ba582eplcec9cBSpGahPig_width 22
#define 301f3c12779740a0f7d41e7437ba582eplcec9cBSpGahPig_height 22
static char 301f3c12779740a0f7d41e7437ba582eplcec9cBSpGahPig_bits[] = {
0xFF, 0xFF, 0x3F, 0xFF, 0xE0, 0x3F, 0x3F, 0x9F, 0x3F, 0xBF, 0xBF, 0x3F,
0xDF, 0x71, 0x3F, 0xDF, 0x6E, 0x3F, 0xDF, 0x6E, 0x3F, 0xDF, 0x6E, 0x3F,
0xDF, 0x71, 0x3F, 0xDF, 0x7B, 0x3F, 0xDF, 0x7F, 0x3F, 0xDF, 0x7F, 0x3F,
0xDF, 0x7F, 0x3F, 0xBF, 0xBF, 0x3F, 0xBF, 0xBB, 0x3F, 0x3F, 0x9B, 0x3F,
0x7F, 0xDF, 0x3F, 0x7F, 0xDF, 0x3F, 0x7F, 0xDF, 0x3F, 0xFF, 0xE0, 0x3F,
0xFF, 0xFF, 0x3F, 0xFF, 0xFF, 0x3F, };