mirror of
https://github.com/justcallmekoko/ESP32Marauder.git
synced 2026-01-26 03:05:00 -08:00
Compare commits
62 Commits
NimBLE-2.0
...
nightly_01
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0196c00220 | ||
|
|
6456527f5f | ||
|
|
e7e8fc7d80 | ||
|
|
5fdf09c8fa | ||
|
|
af9938f8eb | ||
|
|
14e18a12bf | ||
|
|
0ba3d0f60a | ||
|
|
d94a059b81 | ||
|
|
140668448f | ||
|
|
18e582b9a9 | ||
|
|
961bcb6cf5 | ||
|
|
2fa969552a | ||
|
|
e4528d9dea | ||
|
|
774d5f0707 | ||
|
|
bab011e618 | ||
|
|
07a684a03e | ||
|
|
cbb2d33f24 | ||
|
|
3bb45c1ff3 | ||
|
|
e3fe40ede0 | ||
|
|
b09be1c093 | ||
|
|
8e0ed07483 | ||
|
|
0ff6411407 | ||
|
|
249ba6eabe | ||
|
|
7a19fcb458 | ||
|
|
88762063ff | ||
|
|
26370241ee | ||
|
|
9d2a1ab3aa | ||
|
|
6a360b236c | ||
|
|
a20b25a39c | ||
|
|
cb4a6cd51e | ||
|
|
a785a3b125 | ||
|
|
7a7c01512b | ||
|
|
60f446245d | ||
|
|
fb73afd359 | ||
|
|
337cf18dac | ||
|
|
380875d32f | ||
|
|
ae79653628 | ||
|
|
d03c079080 | ||
|
|
70154f5074 | ||
|
|
8ef5cf3b92 | ||
|
|
b3eade1e06 | ||
|
|
1dd5502c1d | ||
|
|
1862a5b812 | ||
|
|
f5375eedaf | ||
|
|
2910addb8a | ||
|
|
be3971d081 | ||
|
|
86e2fb206a | ||
|
|
431fa175a0 | ||
|
|
976687980c | ||
|
|
1d419605f7 | ||
|
|
1624d98183 | ||
|
|
dfd556da30 | ||
|
|
9681076542 | ||
|
|
86d35cba6a | ||
|
|
03623e2985 | ||
|
|
fb2b33d538 | ||
|
|
5e47927969 | ||
|
|
4e7f48a036 | ||
|
|
d7d2b28f9e | ||
|
|
722b9ad88e | ||
|
|
5d188bfa62 | ||
|
|
0a5e200294 |
5
.github/workflows/build_parallel.yml
vendored
5
.github/workflows/build_parallel.yml
vendored
@@ -34,9 +34,8 @@ jobs:
|
||||
- { 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: "2.3.6", 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
|
||||
|
||||
4
.github/workflows/nightly_build.yml
vendored
4
.github/workflows/nightly_build.yml
vendored
@@ -85,7 +85,7 @@ jobs:
|
||||
- { 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: "2.3.6", esp_async: "bigbrodude6119/ESPAsyncWebServer", esp_async_ver: "master" }
|
||||
|
||||
steps:
|
||||
- name: Checkout Code
|
||||
@@ -252,7 +252,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
1
FlashFiles/flash_cmd.txt
Normal 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
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -244,6 +244,7 @@ void CommandLine::runCommand(String input) {
|
||||
#ifdef HAS_GPS
|
||||
Serial.println(HELP_WARDRIVE_CMD);
|
||||
#endif
|
||||
Serial.println(HELP_MAC_TRACK_CMD);
|
||||
|
||||
// WiFi attack
|
||||
Serial.println(HELP_ATTACK_CMD);
|
||||
@@ -571,7 +572,7 @@ void CommandLine::runCommand(String input) {
|
||||
int sta_sw = this->argSearch(&cmd_args, "-s");
|
||||
int flk_sw = this->argSearch(&cmd_args, "-f");
|
||||
|
||||
if (flk_sw == -1) {
|
||||
if (flk_sw != -1) {
|
||||
Serial.println("Starting Flock Wardrive. Stop with " + (String)STOPSCAN_CMD);
|
||||
#ifdef HAS_SCREEN
|
||||
display_obj.clearScreen();
|
||||
@@ -822,6 +823,15 @@ 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.println("Starting MAC Tracker. Stop with " + (String)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)
|
||||
@@ -1248,23 +1258,13 @@ 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.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(F("GPS Module not detected"));
|
||||
|
||||
@@ -78,6 +78,7 @@ 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";
|
||||
|
||||
// WiFi attack
|
||||
const char PROGMEM ATTACK_CMD[] = "attack";
|
||||
@@ -152,6 +153,7 @@ 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";
|
||||
|
||||
// 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]>";
|
||||
@@ -183,7 +185,7 @@ const char PROGMEM HELP_BT_SPOOFAT_CMD[] = "spoofat -t <index>";
|
||||
//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[] = "==================================";
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
#include <LinkedList.h>
|
||||
#include <SPI.h>
|
||||
//#include <lvgl.h>
|
||||
#include <Ticker.h>
|
||||
//#include <Ticker.h>
|
||||
#include "SPIFFS.h"
|
||||
#include "Assets.h"
|
||||
|
||||
|
||||
@@ -10,6 +10,10 @@ 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
|
||||
@@ -27,6 +31,17 @@ void GpsInterface::begin() {
|
||||
|
||||
Serial2.begin(9600, SERIAL_8N1, GPS_TX, GPS_RX);
|
||||
|
||||
uint32_t gps_baud = this->initGpsBaudAndForce115200();
|
||||
|
||||
if (gps_baud == 9600)
|
||||
Serial.println("GPS running at 9600");
|
||||
else if (gps_baud == 115200)
|
||||
Serial.println("GPS running at 115200");
|
||||
else
|
||||
Serial.println("Could not detect GPS baudrate");
|
||||
|
||||
delay(1000);
|
||||
|
||||
MicroNMEA::sendSentence(Serial2, "$PSTMSETPAR,1201,0x00000042");
|
||||
MicroNMEA::sendSentence(Serial2, "$PSTMSAVEPAR");
|
||||
|
||||
@@ -58,6 +73,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 we’ve 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 +594,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 +622,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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -203,6 +203,8 @@ void MenuFunctions::main(uint32_t currentTime)
|
||||
{
|
||||
// Stop the current scan
|
||||
if ((wifi_scan_obj.currentScanMode == WIFI_SCAN_PROBE) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_SAE_COMMIT) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_DETECT_FOLLOW) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_STATION_WAR_DRIVE) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_STATION) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_AP) ||
|
||||
@@ -237,6 +239,7 @@ void MenuFunctions::main(uint32_t currentTime)
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_BAD_MSG) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SLEEP) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SLEEP_TARGETED) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SAE_COMMIT) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_MIMIC) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_FUNNY_BEACON) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_RICK_ROLL) ||
|
||||
@@ -300,6 +303,8 @@ void MenuFunctions::main(uint32_t currentTime)
|
||||
{
|
||||
// Stop the current scan
|
||||
if ((wifi_scan_obj.currentScanMode == WIFI_SCAN_PROBE) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_SAE_COMMIT) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_DETECT_FOLLOW) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_STATION_WAR_DRIVE) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_RAW_CAPTURE) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_SCAN_STATION) ||
|
||||
@@ -336,6 +341,7 @@ void MenuFunctions::main(uint32_t currentTime)
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_BAD_MSG) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SLEEP) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SLEEP_TARGETED) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_SAE_COMMIT) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_MIMIC) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_FUNNY_BEACON) ||
|
||||
(wifi_scan_obj.currentScanMode == WIFI_ATTACK_RICK_ROLL) ||
|
||||
@@ -401,6 +407,7 @@ void MenuFunctions::main(uint32_t currentTime)
|
||||
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_BAD_MSG) &&
|
||||
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_SLEEP) &&
|
||||
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_SLEEP_TARGETED) &&
|
||||
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_SAE_COMMIT) &&
|
||||
(wifi_scan_obj.currentScanMode != WIFI_ATTACK_MIMIC) &&
|
||||
(wifi_scan_obj.currentScanMode != WIFI_SCAN_PACKET_RATE) &&
|
||||
(wifi_scan_obj.currentScanMode != WIFI_SCAN_RAW_CAPTURE) &&
|
||||
@@ -1669,6 +1676,16 @@ void MenuFunctions::RunSetup()
|
||||
this->drawStatusBar();
|
||||
wifi_scan_obj.StartScan(WIFI_SCAN_SIG_STREN, TFT_CYAN);
|
||||
});
|
||||
this->addNodes(&wifiSnifferMenu, "MAC Monitor", TFTMAGENTA, NULL, SCANNERS, [this]() {
|
||||
display_obj.clearScreen();
|
||||
this->drawStatusBar();
|
||||
wifi_scan_obj.StartScan(WIFI_SCAN_DETECT_FOLLOW, TFT_MAGENTA);
|
||||
});
|
||||
this->addNodes(&wifiSnifferMenu, "SAE Commit", TFTLIME, NULL, EAPOL, [this]() {
|
||||
display_obj.clearScreen();
|
||||
this->drawStatusBar();
|
||||
wifi_scan_obj.StartScan(WIFI_SCAN_SAE_COMMIT, TFT_GREEN);
|
||||
});
|
||||
|
||||
// Build Wardriving menu
|
||||
#ifdef HAS_GPS
|
||||
@@ -1835,6 +1852,11 @@ void MenuFunctions::RunSetup()
|
||||
this->drawStatusBar();
|
||||
wifi_scan_obj.StartScan(WIFI_ATTACK_SLEEP_TARGETED, TFT_MAGENTA);
|
||||
});
|
||||
this->addNodes(&wifiAttackMenu, "SAE Commit Flood", TFTLIME, NULL, EAPOL, [this]() {
|
||||
display_obj.clearScreen();
|
||||
this->drawStatusBar();
|
||||
wifi_scan_obj.StartScan(WIFI_ATTACK_SAE_COMMIT, TFT_GREEN);
|
||||
});
|
||||
|
||||
evilPortalMenu.parentMenu = &wifiAttackMenu;
|
||||
this->addNodes(&evilPortalMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
|
||||
@@ -2039,6 +2061,8 @@ void MenuFunctions::RunSetup()
|
||||
});
|
||||
|
||||
this->addNodes(&wifiGeneralMenu, "View AP Info", TFTCYAN, NULL, KEYBOARD_ICO, [this](){
|
||||
wifiAPMenu.parentMenu = &wifiGeneralMenu;
|
||||
|
||||
// Add the back button
|
||||
wifiAPMenu.list->clear();
|
||||
this->addNodes(&wifiAPMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
|
||||
@@ -2074,6 +2098,8 @@ void MenuFunctions::RunSetup()
|
||||
|
||||
// Select Stations on Mini v2
|
||||
this->addNodes(&wifiGeneralMenu, "Select Stations", TFTCYAN, NULL, KEYBOARD_ICO, [this](){
|
||||
wifiAPMenu.parentMenu = &wifiGeneralMenu;
|
||||
|
||||
wifiAPMenu.list->clear();
|
||||
this->addNodes(&wifiAPMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
|
||||
this->changeMenu(wifiAPMenu.parentMenu, true);
|
||||
@@ -2140,6 +2166,9 @@ void MenuFunctions::RunSetup()
|
||||
});
|
||||
|
||||
this->addNodes(&wifiGeneralMenu, "Join WiFi", TFTWHITE, NULL, KEYBOARD_ICO, [this](){
|
||||
|
||||
wifiAPMenu.parentMenu = &wifiGeneralMenu;
|
||||
|
||||
// Add the back button
|
||||
wifiAPMenu.list->clear();
|
||||
this->addNodes(&wifiAPMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
|
||||
@@ -2186,6 +2215,8 @@ void MenuFunctions::RunSetup()
|
||||
this->changeMenu(&wifiGeneralMenu, true);
|
||||
}
|
||||
else {
|
||||
wifiAPMenu.parentMenu = &wifiGeneralMenu;
|
||||
|
||||
// Add the back button
|
||||
wifiAPMenu.list->clear();
|
||||
this->addNodes(&wifiAPMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
|
||||
@@ -2303,6 +2334,8 @@ void MenuFunctions::RunSetup()
|
||||
// Clone AP MAC to ESP32 for button folks
|
||||
//#ifndef HAS_ILI9341
|
||||
this->addNodes(&setMacMenu, "Clone AP MAC", TFTRED, NULL, CLEAR_ICO, [this](){
|
||||
wifiAPMenu.parentMenu = &wifiGeneralMenu;
|
||||
|
||||
// Add the back button
|
||||
wifiAPMenu.list->clear();
|
||||
this->addNodes(&wifiAPMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
|
||||
@@ -2321,6 +2354,8 @@ void MenuFunctions::RunSetup()
|
||||
});
|
||||
|
||||
this->addNodes(&setMacMenu, "Clone STA MAC", TFTMAGENTA, NULL, CLEAR_ICO, [this](){
|
||||
wifiAPMenu.parentMenu = &wifiGeneralMenu;
|
||||
|
||||
// Add the back button
|
||||
wifiAPMenu.list->clear();
|
||||
this->addNodes(&wifiAPMenu, text09, TFTLIGHTGREY, NULL, 0, [this]() {
|
||||
@@ -2405,11 +2440,6 @@ void MenuFunctions::RunSetup()
|
||||
this->drawStatusBar();
|
||||
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE, TFT_GREEN);
|
||||
});
|
||||
this->addNodes(&bluetoothSnifferMenu, "BT Wardrive Continuous", TFTRED, NULL, REBOOT, [this]() {
|
||||
display_obj.clearScreen();
|
||||
this->drawStatusBar();
|
||||
wifi_scan_obj.StartScan(BT_SCAN_WAR_DRIVE_CONT, TFT_GREEN);
|
||||
});
|
||||
}
|
||||
#endif
|
||||
this->addNodes(&bluetoothSnifferMenu, text_table1[35], TFTMAGENTA, NULL, CC_SKIMMERS, [this]() {
|
||||
@@ -2474,6 +2504,8 @@ void MenuFunctions::RunSetup()
|
||||
#ifdef HAS_BT
|
||||
// Select Airtag on Mini
|
||||
this->addNodes(&bluetoothAttackMenu, "Spoof Airtag", TFTWHITE, NULL, ATTACKS, [this](){
|
||||
wifiAPMenu.parentMenu = &bluetoothAttackMenu;
|
||||
|
||||
// Clear nodes and add back button
|
||||
wifiAPMenu.list->clear();
|
||||
this->addNodes(&wifiAPMenu, text09, TFT_LIGHTGREY, NULL, 0, [this]() {
|
||||
|
||||
@@ -193,7 +193,7 @@ class MenuFunctions
|
||||
|
||||
Menu evilPortalMenu;
|
||||
|
||||
static void lv_tick_handler();
|
||||
//static void lv_tick_handler();
|
||||
|
||||
// Menu icons
|
||||
|
||||
@@ -260,7 +260,7 @@ class MenuFunctions
|
||||
Menu infoMenu;
|
||||
Menu apInfoMenu;
|
||||
|
||||
Ticker tick;
|
||||
//Ticker tick;
|
||||
|
||||
uint16_t x = -1, y = -1;
|
||||
boolean pressed = false;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -28,12 +28,17 @@
|
||||
#include "esp_wifi.h"
|
||||
#include "esp_wifi_types.h"
|
||||
#include <esp_timer.h>
|
||||
#include "mbedtls/entropy.h"
|
||||
#include "mbedtls/bignum.h"
|
||||
#include "mbedtls/ctr_drbg.h"
|
||||
#include "mbedtls/ecp.h"
|
||||
#ifndef HAS_DUAL_BAND
|
||||
#include <lwip/etharp.h>
|
||||
#include <lwip/ip_addr.h>
|
||||
#endif
|
||||
#ifdef HAS_DUAL_BAND
|
||||
#include "esp_system.h"
|
||||
#include "esp_mac.h"
|
||||
#endif
|
||||
#if defined(HAS_BT) && !defined(HAS_DUAL_BAND)
|
||||
#include "esp_bt.h"
|
||||
@@ -144,6 +149,9 @@
|
||||
#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
|
||||
|
||||
@@ -215,9 +223,29 @@ 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
|
||||
//#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
|
||||
@@ -237,6 +265,11 @@ struct Flipper {
|
||||
extern struct mac_addr* mac_history;
|
||||
#endif
|
||||
|
||||
enum class MacSortMode : uint8_t {
|
||||
MOST_RECENT,
|
||||
MOST_FRAMES
|
||||
};
|
||||
|
||||
class WiFiScan
|
||||
{
|
||||
private:
|
||||
@@ -246,6 +279,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};
|
||||
@@ -281,6 +316,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;
|
||||
@@ -406,6 +443,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
|
||||
@@ -525,6 +571,7 @@ class WiFiScan
|
||||
NimBLEAdvertisementData GetUniversalAdvertisementData(EBLEPayloadType type);
|
||||
#endif
|
||||
|
||||
void updateTrackerUI();
|
||||
void showNetworkInfo();
|
||||
void setNetworkInfo();
|
||||
void fullARP();
|
||||
@@ -535,17 +582,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 mac_cmp(struct mac_addr addr1, struct mac_addr addr2);
|
||||
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();
|
||||
//void generateRandomMac(uint8_t* mac);
|
||||
//void generateRandomName(char *name, size_t length);
|
||||
String processPwnagotchiBeacon(const uint8_t* frame, int length);
|
||||
@@ -564,6 +613,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);
|
||||
@@ -590,6 +640,7 @@ 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);
|
||||
@@ -601,6 +652,7 @@ class WiFiScan
|
||||
void parseBSSID(const char* bssidStr, uint8_t* bssid);
|
||||
void writeHeader(bool poi = false);
|
||||
void writeFooter(bool poi = false);
|
||||
void displayWardriveStats();
|
||||
|
||||
|
||||
public:
|
||||
@@ -610,6 +662,9 @@ class WiFiScan
|
||||
|
||||
//LinkedList<ssid>* ssids;
|
||||
|
||||
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;
|
||||
@@ -730,7 +785,12 @@ class WiFiScan
|
||||
#ifdef HAS_SCREEN
|
||||
int8_t checkAnalyzerButtons(uint32_t currentTime);
|
||||
#endif
|
||||
bool seen_mac(unsigned char* mac);
|
||||
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]);
|
||||
@@ -760,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);
|
||||
@@ -795,7 +854,14 @@ 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);
|
||||
@@ -811,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
|
||||
|
||||
@@ -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.9.0"
|
||||
#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
|
||||
|
||||
@@ -154,6 +154,12 @@ void backlightOff() {
|
||||
|
||||
void setup()
|
||||
{
|
||||
randomSeed(esp_random());
|
||||
|
||||
#ifndef DEVELOPER
|
||||
esp_log_level_set("*", ESP_LOG_NONE);
|
||||
#endif
|
||||
|
||||
#ifndef HAS_DUAL_BAND
|
||||
esp_spiram_init();
|
||||
#endif
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
|
||||
#include "configs.h"
|
||||
|
||||
//#include "esp_heap_caps.h"
|
||||
#include "esp_heap_caps.h"
|
||||
|
||||
struct mac_addr {
|
||||
unsigned char bytes[6];
|
||||
@@ -27,128 +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"
|
||||
};
|
||||
|
||||
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);
|
||||
@@ -164,7 +42,7 @@ uint8_t getDRAMUsagePercent() {
|
||||
|
||||
#ifdef HAS_PSRAM
|
||||
uint8_t getPSRAMUsagePercent() {
|
||||
/*//size_t total = heap_caps_get_total_size(MALLOC_CAP_SPIRAM);
|
||||
//size_t total = heap_caps_get_total_size(MALLOC_CAP_SPIRAM);
|
||||
//size_t free = heap_caps_get_free_size(MALLOC_CAP_SPIRAM);
|
||||
|
||||
size_t total = ESP.getPsramSize();
|
||||
@@ -174,11 +52,29 @@ uint8_t getDRAMUsagePercent() {
|
||||
|
||||
size_t used = total - free;
|
||||
uint8_t percent = (used * 100) / total;
|
||||
return percent;*/
|
||||
return getDRAMUsagePercent();
|
||||
return percent;
|
||||
}
|
||||
#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;
|
||||
|
||||
@@ -279,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) {
|
||||
|
||||
Reference in New Issue
Block a user