From fba18d7c669332d6e99e0a3a0622bf64c661ca4e Mon Sep 17 00:00:00 2001 From: Stefan Kremser Date: Tue, 28 May 2019 20:33:31 +0200 Subject: [PATCH] New CLI commands for getting and setting settings --- esp8266_deauther/Accesspoints.h | 2 +- esp8266_deauther/Attack.h | 4 +- esp8266_deauther/CLI.cpp | 127 +++++++++++++++++++++++++++++++- esp8266_deauther/CLI.h | 8 +- esp8266_deauther/Names.h | 2 +- esp8266_deauther/Settings.cpp | 42 +++++++---- esp8266_deauther/Settings.h | 6 +- esp8266_deauther/Stations.h | 2 +- esp8266_deauther/functions.h | 60 ++++++++++++--- esp8266_deauther/language.h | 20 +++-- 10 files changed, 227 insertions(+), 46 deletions(-) diff --git a/esp8266_deauther/Accesspoints.h b/esp8266_deauther/Accesspoints.h index 84cc3a0..5726bfb 100644 --- a/esp8266_deauther/Accesspoints.h +++ b/esp8266_deauther/Accesspoints.h @@ -15,7 +15,7 @@ extern Names names; extern String searchVendor(uint8_t* mac); extern String leftRight(String a, String b, int len); extern String fixUtf8(String str); -extern String bytesToStr(uint8_t* b, uint32_t size); +extern String bytesToStr(const uint8_t* b, uint32_t size); struct AP { uint8_t id; diff --git a/esp8266_deauther/Attack.h b/esp8266_deauther/Attack.h index 0b028b7..2963538 100644 --- a/esp8266_deauther/Attack.h +++ b/esp8266_deauther/Attack.h @@ -26,8 +26,8 @@ extern uint32_t currentTime; extern bool macBroadcast(uint8_t* mac); extern void getRandomMac(uint8_t* mac); extern void setOutputPower(float dBm); -extern String macToStr(uint8_t* mac); -extern String bytesToStr(uint8_t* b, uint32_t size); +extern String macToStr(const uint8_t* mac); +extern String bytesToStr(const uint8_t* b, uint32_t size); extern void setWifiChannel(uint8_t ch); extern bool writeFile(String path, String& buf); extern int8_t free80211_send(uint8_t* buffer, uint16_t len); diff --git a/esp8266_deauther/CLI.cpp b/esp8266_deauther/CLI.cpp index 3100544..69ce205 100644 --- a/esp8266_deauther/CLI.cpp +++ b/esp8266_deauther/CLI.cpp @@ -673,14 +673,133 @@ void CLI::runCommand(String input) { // ===== GET/SET ===== // // get - else if (eqlsCMD(0, CLI_GET) && (list->size() == 2)) { - settings.print(); - // prntln(settings.get(list->get(1).c_str())); + else if (eqlsCMD(0, CLI_GET) /*&& (list->size() == 2)*/) { + String _tmp = list->get(1); + const char* str = _tmp.c_str(); + + if (eqls(str, "settings")) settings.print(); + + // Version + else if (eqls(str, S_JSON_VERSION)) prntln(DEAUTHER_VERSION); + else if (eqls(str, S_JSON_AUTOSAVE)) prntln(settings.getAutosaveSettings().enabled); + else if (eqls(str, S_JSON_AUTOSAVETIME)) prntln(settings.getAutosaveSettings().time); + + // Attack + else if (eqls(str, S_JSON_BEACONCHANNEL)) prntln((int)settings.getAttackSettings().attack_all_ch); + else if (eqls(str, S_JSON_RANDOMTX)) prntln(settings.getAttackSettings().random_tx); + else if (eqls(str, S_JSON_ATTACKTIMEOUT)) prntln(settings.getAttackSettings().timeout); + else if (eqls(str, S_JSON_DEAUTHSPERTARGET)) prntln(settings.getAttackSettings().deauths_per_target); + else if (eqls(str, S_JSON_DEAUTHREASON)) prntln(settings.getAttackSettings().deauth_reason); + else if (eqls(str, S_JSON_BEACONINTERVAL)) prntln((bool)settings.getAttackSettings().beacon_interval); + else if (eqls(str, S_JSON_PROBESPERSSID)) prntln(settings.getAttackSettings().probe_frames_per_ssid); + + // WiFi + else if (eqls(str, S_JSON_CHANNEL)) prntln(settings.getWifiSettings().channel); + else if (eqls(str, S_JSON_MACST)) prntln(macToStr(settings.getWifiSettings().mac_st)); + else if (eqls(str, S_JSON_MACAP)) prntln(macToStr(settings.getWifiSettings().mac_ap)); + + // Sniffer + else if (eqls(str, S_JSON_CHTIME)) prntln(settings.getSnifferSettings().channel_time); + else if (eqls(str, S_JSON_MIN_DEAUTHS)) prntln(settings.getSnifferSettings().min_deauth_frames); + + // AP + else if (eqls(str, S_JSON_SSID)) prntln(settings.getAccessPointSettings().ssid); + else if (eqls(str, S_JSON_PASSWORD)) prntln(settings.getAccessPointSettings().password); + else if (eqls(str, S_JSON_HIDDEN)) prntln(settings.getAccessPointSettings().hidden); + else if (eqls(str, S_JSON_IP)) prntln(settings.getAccessPointSettings().ip); + + // Web + else if (eqls(str, S_JSON_WEBINTERFACE)) prntln(settings.getWebSettings().enabled); + else if (eqls(str, S_JSON_CAPTIVEPORTAL)) prntln(settings.getWebSettings().captive_portal); + else if (eqls(str, S_JSON_WEB_SPIFFS)) prntln(settings.getWebSettings().use_spiffs); + else if (eqls(str, S_JSON_LANG)) prntln(settings.getWebSettings().lang, 3); + + // CLI + else if (eqls(str, S_JSON_SERIALINTERFACE)) prntln(settings.getCLISettings().enabled); + else if (eqls(str, S_JSON_SERIAL_ECHO)) prntln(settings.getCLISettings().serial_echo); + + // LED + else if (eqls(str, S_JSON_LEDENABLED)) prntln(settings.getLEDSettings().enabled); + + // Display + else if (eqls(str, S_JSON_DISPLAYINTERFACE)) prntln(settings.getDisplaySettings().enabled); + else if (eqls(str, S_JSON_DISPLAY_TIMEOUT)) prntln(settings.getDisplaySettings().timeout); + + else { + prnt(_tmp); + prntln(" settings not found"); + } } // set else if (eqlsCMD(0, CLI_SET) && (list->size() == 3)) { - // settings.set(list->get(1).c_str(), list->get(2)); + String _tmp = list->get(1); + const char* str = _tmp.c_str(); + + String strVal = list->get(2); + bool boolVal = s2b(strVal); + int intVal = strVal.toInt(); + uint32_t unsignedVal = intVal < 0 ? 0 : (uint32_t)intVal; + + settings_t newSettings = settings.getAllSettings(); + + // Autosave + if (eqls(str, S_JSON_AUTOSAVE)) newSettings.autosave.enabled = boolVal; + else if (eqls(str, S_JSON_AUTOSAVETIME)) newSettings.autosave.time = unsignedVal; + + // Attack + else if (eqls(str, S_JSON_BEACONCHANNEL)) newSettings.attack.attack_all_ch = boolVal; + else if (eqls(str, S_JSON_RANDOMTX)) newSettings.attack.random_tx = boolVal; + else if (eqls(str, S_JSON_ATTACKTIMEOUT)) newSettings.attack.timeout = unsignedVal; + else if (eqls(str, S_JSON_DEAUTHSPERTARGET)) newSettings.attack.deauths_per_target = unsignedVal; + else if (eqls(str, S_JSON_DEAUTHREASON)) newSettings.attack.deauth_reason = unsignedVal; + else if (eqls(str, S_JSON_BEACONINTERVAL)) newSettings.attack.beacon_interval = (beacon_interval_t)boolVal; + else if (eqls(str, S_JSON_PROBESPERSSID)) newSettings.attack.probe_frames_per_ssid = unsignedVal; + + // WiFi + else if (eqls(str, S_JSON_CHANNEL)) newSettings.wifi.channel = unsignedVal; + else if (eqls(str, S_JSON_MACST)) strToMac(strVal, newSettings.wifi.mac_st); + else if (eqls(str, S_JSON_MACAP)) strToMac(strVal, newSettings.wifi.mac_ap); + + // Sniffer + else if (eqls(str, S_JSON_CHTIME)) newSettings.sniffer.channel_time = unsignedVal; + else if (eqls(str, S_JSON_MIN_DEAUTHS)) newSettings.sniffer.min_deauth_frames = unsignedVal; + + // AP + else if (eqls(str, S_JSON_SSID)) strncpy(newSettings.ap.ssid, strVal.c_str(), 32); + else if (eqls(str, S_JSON_PASSWORD)) strncpy(newSettings.ap.password, strVal.c_str(), 64); + else if (eqls(str, S_JSON_HIDDEN)) newSettings.ap.hidden = boolVal; + else if (eqls(str, S_JSON_IP)) strToIP(strVal, newSettings.ap.ip); + + // Web + else if (eqls(str, S_JSON_WEBINTERFACE)) newSettings.web.enabled = boolVal; + else if (eqls(str, S_JSON_CAPTIVEPORTAL)) newSettings.web.captive_portal = boolVal; + else if (eqls(str, S_JSON_WEB_SPIFFS)) newSettings.web.use_spiffs = boolVal; + else if (eqls(str, S_JSON_LANG)) strncpy(newSettings.web.lang, strVal.c_str(), 3); + + // CLI + else if (eqls(str, S_JSON_SERIALINTERFACE)) newSettings.cli.enabled = boolVal; + else if (eqls(str, S_JSON_SERIAL_ECHO)) newSettings.cli.serial_echo = boolVal; + + // LED + else if (eqls(str, S_JSON_LEDENABLED)) newSettings.led.enabled = boolVal; + + // Display + else if (eqls(str, S_JSON_DISPLAYINTERFACE)) newSettings.display.enabled = boolVal; + else if (eqls(str, S_JSON_DISPLAY_TIMEOUT)) newSettings.display.timeout = unsignedVal; + + else { + prnt(str); + prntln(" not found"); + return; + } + + prnt("Set "); + prnt(str); + prnt(" = "); + prntln(strVal); + + settings.setAllSettings(newSettings); } // ====== CHICKEN ===== // diff --git a/esp8266_deauther/CLI.h b/esp8266_deauther/CLI.h index 490a04a..8dd005e 100644 --- a/esp8266_deauther/CLI.h +++ b/esp8266_deauther/CLI.h @@ -30,7 +30,9 @@ extern DisplayUI displayUI; extern uint32_t currentTime; extern uint32_t autosaveTime; -extern String macToStr(uint8_t* mac); +extern String macToStr(const uint8_t* mac); +extern bool strToMac(String macStr, uint8_t* mac); +extern bool strToIP(String ipStr, uint8_t* ip); extern void strToColor(String str, uint8_t* buf); extern void readFileToSerial(String path, bool showLineNum); extern bool readFile(String path, String& buf); @@ -69,8 +71,8 @@ class CLI { private: bool enabled = false; - SimpleList* list; - SimpleList* queue; + SimpleList*list; + SimpleList*queue; bool delayed = false; uint32_t delayTime = 0; diff --git a/esp8266_deauther/Names.h b/esp8266_deauther/Names.h index 328891e..85792f9 100644 --- a/esp8266_deauther/Names.h +++ b/esp8266_deauther/Names.h @@ -23,7 +23,7 @@ extern String searchVendor(uint8_t* mac); extern String fixUtf8(String str); extern String leftRight(String a, String b, int len); extern String escape(String str); -extern String bytesToStr(uint8_t* b, uint32_t size); +extern String bytesToStr(const uint8_t* b, uint32_t size); class Names { public: diff --git a/esp8266_deauther/Settings.cpp b/esp8266_deauther/Settings.cpp index f2fe5eb..4f8322c 100644 --- a/esp8266_deauther/Settings.cpp +++ b/esp8266_deauther/Settings.cpp @@ -25,15 +25,15 @@ void jsonStr(String& str, const char* name, const char* value) { str += ','; } -void jsonFlag(String& str, const char* name, bool value) { +/* + void jsonFlag(String& str, const char* name, bool value) { str += '"'; str += String(name); str += '"'; str += ':'; str += String(value ? S_JSON_TRUE : S_JSON_FALSE); str += ','; -} - + }*/ void jsonValue(String& str, const char* name, int value) { str += '"'; str += String(name); @@ -91,16 +91,16 @@ String Settings::getJsonStr() { jsonStr(str, S_JSON_VERSION, DEAUTHER_VERSION); // Autosave - jsonFlag(str, S_JSON_AUTOSAVE, data.autosave.enabled); + /*jsonFlag*/ jsonValue(str, S_JSON_AUTOSAVE, data.autosave.enabled); jsonValue(str, S_JSON_AUTOSAVETIME, data.autosave.time); // Attack - jsonFlag(str, S_JSON_BEACONCHANNEL, data.attack.attack_all_ch); - jsonFlag(str, S_JSON_RANDOMTX, data.attack.random_tx); + /*jsonFlag*/ jsonValue(str, S_JSON_BEACONCHANNEL, data.attack.attack_all_ch); + /*jsonFlag*/ jsonValue(str, S_JSON_RANDOMTX, data.attack.random_tx); jsonValue(str, S_JSON_ATTACKTIMEOUT, data.attack.timeout); jsonValue(str, S_JSON_DEAUTHSPERTARGET, data.attack.deauths_per_target); jsonValue(str, S_JSON_DEAUTHREASON, data.attack.deauth_reason); - jsonFlag(str, S_JSON_BEACONINTERVAL, data.attack.beacon_interval == INTERVAL_1S); + /*jsonFlag*/ jsonValue(str, S_JSON_BEACONINTERVAL, data.attack.beacon_interval == INTERVAL_1S); jsonValue(str, S_JSON_PROBESPERSSID, data.attack.probe_frames_per_ssid); // WiFi @@ -115,24 +115,24 @@ String Settings::getJsonStr() { // Access Point jsonStr(str, S_JSON_SSID, data.ap.ssid); jsonStr(str, S_JSON_PASSWORD, data.ap.password); - jsonFlag(str, S_JSON_HIDDEN, data.ap.hidden); + /*jsonFlag*/ jsonValue(str, S_JSON_HIDDEN, data.ap.hidden); jsonDec(str, S_JSON_IP, data.ap.ip, 4); // Web Interface - jsonFlag(str, S_JSON_WEBINTERFACE, data.web.enabled); - jsonFlag(str, S_JSON_CAPTIVEPORTAL, data.web.captive_portal); - jsonFlag(str, S_JSON_WEB_SPIFFS, data.web.use_spiffs); + /*jsonFlag*/ jsonValue(str, S_JSON_WEBINTERFACE, data.web.enabled); + /*jsonFlag*/ jsonValue(str, S_JSON_CAPTIVEPORTAL, data.web.captive_portal); + /*jsonFlag*/ jsonValue(str, S_JSON_WEB_SPIFFS, data.web.use_spiffs); jsonStr(str, S_JSON_LANG, data.web.lang); // CLI - jsonFlag(str, S_JSON_SERIALINTERFACE, data.cli.enabled); - jsonFlag(str, S_JSON_SERIAL_ECHO, data.cli.serial_echo); + /*jsonFlag*/ jsonValue(str, S_JSON_SERIALINTERFACE, data.cli.enabled); + /*jsonFlag*/ jsonValue(str, S_JSON_SERIAL_ECHO, data.cli.serial_echo); // LED - jsonFlag(str, S_JSON_LEDENABLED, data.led.enabled); + /*jsonFlag*/ jsonValue(str, S_JSON_LEDENABLED, data.led.enabled); // Display - jsonFlag(str, S_JSON_DISPLAYINTERFACE, data.display.enabled); + /*jsonFlag*/ jsonValue(str, S_JSON_DISPLAYINTERFACE, data.display.enabled); jsonValue(str, S_JSON_DISPLAY_TIMEOUT, data.display.timeout); str[str.length()-1] = '}'; @@ -197,6 +197,8 @@ void Settings::print() { String settingsJson = getJsonStr(); settingsJson.replace("\":", " = "); + settingsJson.replace("= 0\r\n", "= false\r\n"); + settingsJson.replace("= 1\r\n", "= true\r\n"); settingsJson.replace("\"", ""); settingsJson.replace("{", ""); settingsJson.replace("}", ""); @@ -208,6 +210,10 @@ void Settings::print() { // ===== GETTERS ===== // +const settings_t& Settings::getAllSettings() { + return data; +} + const version_t& Settings::getVersion() { return data.version; } @@ -250,6 +256,12 @@ const display_settings_t& Settings::getDisplaySettings() { // ===== SETTERS ===== // +void Settings::setAllSettings(settings_t& newSettings) { + newSettings.version = this->data.version; + data = newSettings; + changed = true; +} + void Settings::setAutosaveSettings(const autosave_settings_t& autosave) { data.autosave = autosave; changed = true; diff --git a/esp8266_deauther/Settings.h b/esp8266_deauther/Settings.h index f96fd95..982ee01 100644 --- a/esp8266_deauther/Settings.h +++ b/esp8266_deauther/Settings.h @@ -35,6 +35,8 @@ const char S_JSON_FALSE[] PROGMEM = "true"; // Version const char S_JSON_VERSION[] PROGMEM = "version"; + +// Autosave const char S_JSON_AUTOSAVE[] PROGMEM = "autosave"; const char S_JSON_AUTOSAVETIME[] PROGMEM = "autosavetime"; @@ -198,7 +200,8 @@ class Settings { void reset(); void print(); - const version_t& getVersion(); + const settings_t& getAllSettings(); + const version_t & getVersion(); const autosave_settings_t& getAutosaveSettings(); const attack_settings_t & getAttackSettings(); const wifi_settings_t & getWifiSettings(); @@ -209,6 +212,7 @@ class Settings { const led_settings_t& getLEDSettings(); const display_settings_t& getDisplaySettings(); + void setAllSettings(settings_t& settings); void setAutosaveSettings(const autosave_settings_t& autosave); void setAttackSettings(const attack_settings_t& attack); void setWifiSettings(const wifi_settings_t& wifi); diff --git a/esp8266_deauther/Stations.h b/esp8266_deauther/Stations.h index 1e7e3c7..438ea57 100644 --- a/esp8266_deauther/Stations.h +++ b/esp8266_deauther/Stations.h @@ -20,7 +20,7 @@ extern String searchVendor(uint8_t* mac); extern bool macMulticast(uint8_t* mac); extern bool macValid(uint8_t* mac); extern bool macBroadcast(uint8_t* mac); -extern String bytesToStr(uint8_t* b, uint32_t size); +extern String bytesToStr(const uint8_t* b, uint32_t size); class Stations { public: diff --git a/esp8266_deauther/functions.h b/esp8266_deauther/functions.h index 21e24d2..d418c63 100644 --- a/esp8266_deauther/functions.h +++ b/esp8266_deauther/functions.h @@ -247,15 +247,15 @@ bool s2b(String input) { } // ===== PRINT FUNCTIONS ===== // -void prnt(String s) { +void prnt(const String s) { Serial.print(s); } -void prnt(bool b) { +void prnt(const bool b) { Serial.print(b2s(b)); } -void prnt(char c) { +void prnt(const char c) { Serial.print(c); } @@ -263,23 +263,31 @@ void prnt(const char* ptr) { Serial.print(FPSTR(ptr)); } -void prnt(int i) { +void prnt(const char* ptr, int len) { + for (int i = 0; i 0) && (ch < 15)) { @@ -402,7 +419,7 @@ String searchVendor(uint8_t* mac) { } /* ===== STRING ===== */ -String bytesToStr(uint8_t* b, uint32_t size) { +String bytesToStr(const uint8_t* b, uint32_t size) { String str; for (uint32_t i = 0; i < size; i++) { @@ -414,7 +431,7 @@ String bytesToStr(uint8_t* b, uint32_t size) { return str; } -String macToStr(uint8_t* mac) { +String macToStr(const uint8_t* mac) { return bytesToStr(mac, 6); } @@ -435,6 +452,29 @@ bool strToMac(String macStr, uint8_t* mac) { return true; } +bool strToIP(String ipStr, uint8_t* ip) { + String parts[4] = { "0", "0", "0", "0" }; + int ipAddr[4] = { -1, -1, -1, -1 }; + + int j = 0; + + for (int i = 0; i 255)) return false; + } + + for (int i = 0; i<4; i++) { + ip[i] = (uint8_t)ipAddr[i]; + } + + return true; +} + void strToColor(String str, uint8_t* buf) { str.replace(":", ""); str.replace("0x", ""); diff --git a/esp8266_deauther/language.h b/esp8266_deauther/language.h index 000cdba..b84fa8f 100644 --- a/esp8266_deauther/language.h +++ b/esp8266_deauther/language.h @@ -10,17 +10,21 @@ extern bool eqls(String str, const char* keywordPtr); extern String b2s(bool input); extern String b2a(bool input); extern bool s2b(String input); -extern void prnt(String s); -extern void prnt(bool b); -extern void prnt(char c); +extern void prnt(const String s); +extern void prnt(const bool b); +extern void prnt(const char c); extern void prnt(const char* ptr); -extern void prnt(int i); +extern void prnt(const char* ptr, int len); +extern void prnt(const int i); +extern void prnt(const uint32_t i); extern void prntln(); -extern void prntln(String s); -extern void prntln(bool b); -extern void prntln(char c); +extern void prntln(const String s); +extern void prntln(const bool b); +extern void prntln(const char c); extern void prntln(const char* ptr); -extern void prntln(int i); +extern void prntln(const char* ptr, int len); +extern void prntln(const int i); +extern void prntln(const uint32_t i); /* The following variables are the strings used for the serial interface, display interface and settings.