From 38146c9c779f3e466ba07c590c0cbcd21def39c1 Mon Sep 17 00:00:00 2001 From: Stefan Kremser Date: Wed, 21 Nov 2018 16:49:13 +0100 Subject: [PATCH] Fixed stupid SSID bug --- esp8266_deauther/SSIDs.cpp | 630 ++++++++++++++++++------------------- 1 file changed, 314 insertions(+), 316 deletions(-) diff --git a/esp8266_deauther/SSIDs.cpp b/esp8266_deauther/SSIDs.cpp index ae50e9b..f1459f3 100644 --- a/esp8266_deauther/SSIDs.cpp +++ b/esp8266_deauther/SSIDs.cpp @@ -1,316 +1,314 @@ -#include "SSIDs.h" - -SSIDs::SSIDs() { - list = new SimpleList; -} - -void SSIDs::load() { - internal_removeAll(); - DynamicJsonBuffer jsonBuffer(4000); - - checkFile(FILE_PATH, str(SS_JSON_DEFAULT)); - JsonObject& obj = parseJSONFile(FILE_PATH, jsonBuffer); - JsonArray & arr = obj.get(str(SS_JSON_SSIDS)); - - for (uint32_t i = 0; i < arr.size() && i < SSID_LIST_SIZE; i++) { - JsonArray& tmpArray = arr.get(i); - internal_add(tmpArray.get(0), tmpArray.get(1), tmpArray.get(2)); - } - - prnt(SS_LOADED); - prntln(FILE_PATH); -} - -void SSIDs::load(String filepath) { - String tmp = FILE_PATH; - - FILE_PATH = filepath; - load(); - FILE_PATH = tmp; -} - -void SSIDs::removeAll() { - internal_removeAll(); - prntln(SS_CLEARED); - changed = true; -} - -void SSIDs::save(bool force) { - if (!force && !changed) return; - - String buf = String(); // create buffer - buf += String(OPEN_CURLY_BRACKET) + String(DOUBLEQUOTES) + str(SS_JSON_RANDOM) + String(DOUBLEQUOTES) + String( - DOUBLEPOINT) + b2s(randomMode) + String(COMMA); // {"random":false, - buf += String(DOUBLEQUOTES) + str(SS_JSON_SSIDS) + String(DOUBLEQUOTES) + String(DOUBLEPOINT) + - String(OPEN_BRACKET); // "ssids":[ - - if (!writeFile(FILE_PATH, buf)) { - prnt(F_ERROR_SAVING); - prntln(FILE_PATH); - return; - } - buf = String(); // clear buffer - - String name; - int c = count(); - - for (int i = 0; i < c; i++) { - name = escape(getName(i)); - - buf += String(OPEN_BRACKET) + String(DOUBLEQUOTES) + name + String(DOUBLEQUOTES) + String(COMMA); // ["name", - buf += b2s(getWPA2(i)) + String(COMMA); // false, - buf += String(getLen(i)) + String(CLOSE_BRACKET); // 12] - - if (i < c - 1) buf += COMMA; // , - - if (buf.length() >= 1024) { - if (!appendFile(FILE_PATH, buf)) { - prnt(F_ERROR_SAVING); - prntln(FILE_PATH); - return; - } - - buf = String(); // clear buffer - } - } - - buf += String(CLOSE_BRACKET) + String(CLOSE_CURLY_BRACKET); // ]} - - if (!appendFile(FILE_PATH, buf)) { - prnt(F_ERROR_SAVING); - prntln(FILE_PATH); - return; - } - - prnt(SS_SAVED_IN); - prntln(FILE_PATH); - changed = false; -} - -void SSIDs::save(bool force, String filepath) { - String tmp = FILE_PATH; - - FILE_PATH = filepath; - save(force); - FILE_PATH = tmp; -} - -void SSIDs::update() { - if (randomMode) { - if (currentTime - randomTime > randomInterval * 1000) { - prntln(SS_RANDOM_INFO); - - for (int i = 0; i < SSID_LIST_SIZE; i++) { - SSID newSSID; - - if (check(i)) newSSID = list->get(i); - - newSSID.name = String(); - newSSID.len = 32; - - for (int i = 0; i < 32; i++) newSSID.name += char(random(32, 127)); - - newSSID.wpa2 = random(0, 2); - - if (check(i)) list->replace(i, newSSID); - else list->add(newSSID); - } - - randomTime = currentTime; - changed = true; - } - } -} - -String SSIDs::getName(int num) { - return check(num) ? list->get(num).name : String(); -} - -bool SSIDs::getWPA2(int num) { - return check(num) ? list->get(num).wpa2 : false; -} - -int SSIDs::getLen(int num) { - return check(num) ? list->get(num).len : 0; -} - -void SSIDs::setWPA2(int num, bool wpa2) { - SSID newSSID = list->get(num); - - newSSID.wpa2 = wpa2; - list->replace(num, newSSID); -} - -String SSIDs::getEncStr(int num) { - if (getWPA2(num)) return "WPA2"; - else return "-"; -} - -void SSIDs::remove(int num) { - if (!check(num)) return; - - internal_remove(num); - prnt(SS_REMOVED); - prntln(getName(num)); - changed = true; -} - -String SSIDs::randomize(String name) { - int ssidlen = name.length(); - - if (ssidlen > 32) name = name.substring(0, 32); - - if (ssidlen < 32) { - for (int i = ssidlen; i < 32; i++) { - int rnd = random(3); - - if ((i < 29) && (rnd == 0)) { // ZERO WIDTH SPACE - name += char(0xE2); - name += char(0x80); - name += char(0x8B); - i += 2; - } else if ((i < 30) && (rnd == 1)) { // NO-BREAK SPACE - name += char(0xC2); - name += char(0xA0); - i += 1; - } else { - name += char(0x20); // SPACE - } - } - } - return name; -} - -void SSIDs::add(String name, bool wpa2, int clones, bool force) { - if (list->size() >= SSID_LIST_SIZE) { - if (force) { - internal_remove(0); - } else { - prntln(SS_ERROR_FULL); - return; - } - } - - if (clones > SSID_LIST_SIZE) clones = SSID_LIST_SIZE; - - for (int i = 0; i < clones; i++) { - if (clones > 1) name = randomize(name); - - internal_add(name, wpa2, name.length()); - - if (list->size() > SSID_LIST_SIZE) internal_remove(0); - } - - prnt(SS_ADDED); - prntln(name); - changed = true; -} - -void SSIDs::cloneSelected(bool force) { - if (accesspoints.selected() > 0) { - int clones = SSID_LIST_SIZE; - - if (!force) clones -= list->size(); - clones /= accesspoints.selected(); - - int apCount = accesspoints.count(); - - for (int i = 0; i < apCount; i++) { - if (accesspoints.getSelected(i)) add(accesspoints.getSSID(i), accesspoints.getEnc(i) != 0, clones, force); - } - } -} - -bool SSIDs::getRandom() { - return randomMode; -} - -void SSIDs::replace(int num, String name, bool wpa2) { - if (!check(num)) return; - - int len = name.length(); - - if (len > 32) len = 32; - SSID newSSID; - newSSID.name = randomize(name); - newSSID.wpa2 = wpa2; - newSSID.len = (uint8_t)len; - list->replace(num, newSSID); - - prnt(SS_REPLACED); - prntln(name); - changed = true; -} - -void SSIDs::print(int num) { - print(num, true, false); -} - -void SSIDs::print(int num, bool header, bool footer) { - if (!check(num)) return; - - if (header) { - prntln(SS_TABLE_HEADER); - prntln(SS_TABLE_DIVIDER); - } - - prnt(leftRight(String(), (String)num, 2)); - prnt(leftRight(String(SPACE), getEncStr(num), 5)); - prntln(leftRight(String(SPACE) + getName(num), String(), 33)); - - if (footer) prntln(SS_TABLE_DIVIDER); -} - -void SSIDs::printAll() { - prntln(SS_HEADER); - int c = count(); - - if (c == 0) prntln(SS_ERROR_EMPTY); - else - for (int i = 0; i < c; i++) print(i, i == 0, i == c - 1); -} - -int SSIDs::count() { - return list->size(); -} - -bool SSIDs::check(int num) { - return num >= 0 && num < count(); -} - -void SSIDs::enableRandom(uint32_t randomInterval) { - randomMode = true; - SSIDs::randomInterval = randomInterval; - prntln(SS_RANDOM_ENABLED); - update(); -} - -void SSIDs::disableRandom() { - randomMode = false; - internal_removeAll(); - prntln(SS_RANDOM_DISABLED); -} - -void SSIDs::internal_add(String name, bool wpa2, int len) { - if (len > 32) { - name = name.substring(0, 32); - len = 32; - } - - name = fixUtf8(name); - - SSID newSSID; - newSSID.name = name; - newSSID.wpa2 = wpa2; - newSSID.len = (uint8_t)len; - - list->add(newSSID); -} - -void SSIDs::internal_remove(int num) { - list->remove(num); -} - -void SSIDs::internal_removeAll() { - list->clear(); -} \ No newline at end of file +#include "SSIDs.h" + +SSIDs::SSIDs() { + list = new SimpleList; +} + +void SSIDs::load() { + internal_removeAll(); + DynamicJsonBuffer jsonBuffer(4000); + + checkFile(FILE_PATH, str(SS_JSON_DEFAULT)); + JsonObject& obj = parseJSONFile(FILE_PATH, jsonBuffer); + JsonArray & arr = obj.get(str(SS_JSON_SSIDS)); + + for (uint32_t i = 0; i < arr.size() && i < SSID_LIST_SIZE; i++) { + JsonArray& tmpArray = arr.get(i); + internal_add(tmpArray.get(0), tmpArray.get(1), tmpArray.get(2)); + } + + prnt(SS_LOADED); + prntln(FILE_PATH); +} + +void SSIDs::load(String filepath) { + String tmp = FILE_PATH; + + FILE_PATH = filepath; + load(); + FILE_PATH = tmp; +} + +void SSIDs::removeAll() { + internal_removeAll(); + prntln(SS_CLEARED); + changed = true; +} + +void SSIDs::save(bool force) { + if (!force && !changed) return; + + String buf = String(); // create buffer + buf += String(OPEN_CURLY_BRACKET) + String(DOUBLEQUOTES) + str(SS_JSON_RANDOM) + String(DOUBLEQUOTES) + String( + DOUBLEPOINT) + b2s(randomMode) + String(COMMA); // {"random":false, + buf += String(DOUBLEQUOTES) + str(SS_JSON_SSIDS) + String(DOUBLEQUOTES) + String(DOUBLEPOINT) + + String(OPEN_BRACKET); // "ssids":[ + + if (!writeFile(FILE_PATH, buf)) { + prnt(F_ERROR_SAVING); + prntln(FILE_PATH); + return; + } + buf = String(); // clear buffer + + String name; + int c = count(); + + for (int i = 0; i < c; i++) { + name = escape(getName(i)); + + buf += String(OPEN_BRACKET) + String(DOUBLEQUOTES) + name + String(DOUBLEQUOTES) + String(COMMA); // ["name", + buf += b2s(getWPA2(i)) + String(COMMA); // false, + buf += String(getLen(i)) + String(CLOSE_BRACKET); // 12] + + if (i < c - 1) buf += COMMA; // , + + if (buf.length() >= 1024) { + if (!appendFile(FILE_PATH, buf)) { + prnt(F_ERROR_SAVING); + prntln(FILE_PATH); + return; + } + + buf = String(); // clear buffer + } + } + + buf += String(CLOSE_BRACKET) + String(CLOSE_CURLY_BRACKET); // ]} + + if (!appendFile(FILE_PATH, buf)) { + prnt(F_ERROR_SAVING); + prntln(FILE_PATH); + return; + } + + prnt(SS_SAVED_IN); + prntln(FILE_PATH); + changed = false; +} + +void SSIDs::save(bool force, String filepath) { + String tmp = FILE_PATH; + + FILE_PATH = filepath; + save(force); + FILE_PATH = tmp; +} + +void SSIDs::update() { + if (randomMode) { + if (currentTime - randomTime > randomInterval * 1000) { + prntln(SS_RANDOM_INFO); + + for (int i = 0; i < SSID_LIST_SIZE; i++) { + SSID newSSID; + + if (check(i)) newSSID = list->get(i); + + newSSID.name = String(); + newSSID.len = 32; + + for (int i = 0; i < 32; i++) newSSID.name += char(random(32, 127)); + + newSSID.wpa2 = random(0, 2); + + if (check(i)) list->replace(i, newSSID); + else list->add(newSSID); + } + + randomTime = currentTime; + changed = true; + } + } +} + +String SSIDs::getName(int num) { + return check(num) ? list->get(num).name : String(); +} + +bool SSIDs::getWPA2(int num) { + return check(num) ? list->get(num).wpa2 : false; +} + +int SSIDs::getLen(int num) { + return check(num) ? list->get(num).len : 0; +} + +void SSIDs::setWPA2(int num, bool wpa2) { + SSID newSSID = list->get(num); + + newSSID.wpa2 = wpa2; + list->replace(num, newSSID); +} + +String SSIDs::getEncStr(int num) { + if (getWPA2(num)) return "WPA2"; + else return "-"; +} + +void SSIDs::remove(int num) { + if (!check(num)) return; + + internal_remove(num); + prnt(SS_REMOVED); + prntln(getName(num)); + changed = true; +} + +String SSIDs::randomize(String name) { + int ssidlen = name.length(); + + if (ssidlen > 32) name = name.substring(0, 32); + + if (ssidlen < 32) { + for (int i = ssidlen; i < 32; i++) { + int rnd = random(3); + + if ((i < 29) && (rnd == 0)) { // ZERO WIDTH SPACE + name += char(0xE2); + name += char(0x80); + name += char(0x8B); + i += 2; + } else if ((i < 30) && (rnd == 1)) { // NO-BREAK SPACE + name += char(0xC2); + name += char(0xA0); + i += 1; + } else { + name += char(0x20); // SPACE + } + } + } + return name; +} + +void SSIDs::add(String name, bool wpa2, int clones, bool force) { + if (list->size() >= SSID_LIST_SIZE) { + if (force) { + internal_remove(0); + } else { + prntln(SS_ERROR_FULL); + return; + } + } + + if (clones > SSID_LIST_SIZE) clones = SSID_LIST_SIZE; + + for (int i = 0; i < clones; i++) { + internal_add(clones > 1 ? randomize(name) : name, wpa2, name.length()); + + if (list->size() > SSID_LIST_SIZE) internal_remove(0); + } + + prnt(SS_ADDED); + prntln(name); + changed = true; +} + +void SSIDs::cloneSelected(bool force) { + if (accesspoints.selected() > 0) { + int clones = SSID_LIST_SIZE; + + if (!force) clones -= list->size(); + clones /= accesspoints.selected(); + + int apCount = accesspoints.count(); + + for (int i = 0; i < apCount; i++) { + if (accesspoints.getSelected(i)) add(accesspoints.getSSID(i), accesspoints.getEnc(i) != 0, clones, force); + } + } +} + +bool SSIDs::getRandom() { + return randomMode; +} + +void SSIDs::replace(int num, String name, bool wpa2) { + if (!check(num)) return; + + int len = name.length(); + + if (len > 32) len = 32; + SSID newSSID; + newSSID.name = randomize(name); + newSSID.wpa2 = wpa2; + newSSID.len = (uint8_t)len; + list->replace(num, newSSID); + + prnt(SS_REPLACED); + prntln(name); + changed = true; +} + +void SSIDs::print(int num) { + print(num, true, false); +} + +void SSIDs::print(int num, bool header, bool footer) { + if (!check(num)) return; + + if (header) { + prntln(SS_TABLE_HEADER); + prntln(SS_TABLE_DIVIDER); + } + + prnt(leftRight(String(), (String)num, 2)); + prnt(leftRight(String(SPACE), getEncStr(num), 5)); + prntln(leftRight(String(SPACE) + getName(num), String(), 33)); + + if (footer) prntln(SS_TABLE_DIVIDER); +} + +void SSIDs::printAll() { + prntln(SS_HEADER); + int c = count(); + + if (c == 0) prntln(SS_ERROR_EMPTY); + else + for (int i = 0; i < c; i++) print(i, i == 0, i == c - 1); +} + +int SSIDs::count() { + return list->size(); +} + +bool SSIDs::check(int num) { + return num >= 0 && num < count(); +} + +void SSIDs::enableRandom(uint32_t randomInterval) { + randomMode = true; + SSIDs::randomInterval = randomInterval; + prntln(SS_RANDOM_ENABLED); + update(); +} + +void SSIDs::disableRandom() { + randomMode = false; + internal_removeAll(); + prntln(SS_RANDOM_DISABLED); +} + +void SSIDs::internal_add(String name, bool wpa2, int len) { + if (len > 32) { + name = name.substring(0, 32); + len = 32; + } + + name = fixUtf8(name); + + SSID newSSID; + newSSID.name = name; + newSSID.wpa2 = wpa2; + newSSID.len = (uint8_t)len; + + list->add(newSSID); +} + +void SSIDs::internal_remove(int num) { + list->remove(num); +} + +void SSIDs::internal_removeAll() { + list->clear(); +}