/* ===================== This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther ===================== */ extern "C" { // Please follow this tutorial: // https://github.com/spacehuhn/esp8266_deauther/wiki/Installation#compiling-using-arduino-ide // And be sure to have the right board selected #include "user_interface.h" } #include "EEPROMHelper.h" #include "src/ArduinoJson-v5.13.5/ArduinoJson.h" #if ARDUINOJSON_VERSION_MAJOR != 5 // The software was build using ArduinoJson v5.x // version 6 is still in beta at the time of writing // go to tools -> manage libraries, search for ArduinoJSON and install version 5 #error Please upgrade/downgrade ArduinoJSON library to version 5! #endif // if ARDUINOJSON_VERSION_MAJOR != 5 #include "oui.h" #include "language.h" #include "functions.h" #include "settings.h" #include "Names.h" #include "SSIDs.h" #include "Scan.h" #include "Attack.h" #include "CLI.h" #include "DisplayUI.h" #include "A_config.h" #include "led.h" // Run-Time Variables // Names names; SSIDs ssids; Accesspoints accesspoints; Stations stations; Scan scan; Attack attack; CLI cli; DisplayUI displayUI; simplebutton::Button* resetButton; #include "wifi.h" uint32_t autosaveTime = 0; uint32_t currentTime = 0; bool booted = false; void setup() { // for random generator randomSeed(os_random()); // start serial Serial.begin(115200); Serial.println(); // start SPIFFS prnt(SETUP_MOUNT_SPIFFS); // bool spiffsError = !LittleFS.begin(); LittleFS.begin(); prntln(/*spiffsError ? SETUP_ERROR : */ SETUP_OK); // Start EEPROM EEPROMHelper::begin(EEPROM_SIZE); #ifdef FORMAT_SPIFFS prnt(SETUP_FORMAT_SPIFFS); LittleFS.format(); prntln(SETUP_OK); #endif // ifdef FORMAT_SPIFFS #ifdef FORMAT_EEPROM prnt(SETUP_FORMAT_EEPROM); EEPROMHelper::format(EEPROM_SIZE); prntln(SETUP_OK); #endif // ifdef FORMAT_EEPROM // Format SPIFFS when in boot-loop if (/*spiffsError || */ !EEPROMHelper::checkBootNum(BOOT_COUNTER_ADDR)) { prnt(SETUP_FORMAT_SPIFFS); LittleFS.format(); prntln(SETUP_OK); prnt(SETUP_FORMAT_EEPROM); EEPROMHelper::format(EEPROM_SIZE); prntln(SETUP_OK); EEPROMHelper::resetBootNum(BOOT_COUNTER_ADDR); } // get time currentTime = millis(); // load settings #ifndef RESET_SETTINGS settings::load(); #else // ifndef RESET_SETTINGS settings::reset(); settings::save(); #endif // ifndef RESET_SETTINGS wifi::begin(); wifi_set_promiscuous_rx_cb([](uint8_t* buf, uint16_t len) { scan.sniffer(buf, len); }); // start display if (settings::getDisplaySettings().enabled) { displayUI.setup(); displayUI.mode = DISPLAY_MODE::INTRO; } // load everything else names.load(); ssids.load(); cli.load(); // create scan.json scan.setup(); // dis/enable serial command interface if (settings::getCLISettings().enabled) { cli.enable(); } else { prntln(SETUP_SERIAL_WARNING); Serial.flush(); Serial.end(); } // start access point/web interface if (settings::getWebSettings().enabled) wifi::startAP(); // STARTED prntln(SETUP_STARTED); // version prntln(DEAUTHER_VERSION); // setup LED led::setup(); // setup reset button resetButton = new ButtonPullup(RESET_BUTTON); } void loop() { currentTime = millis(); led::update(); // update LED color wifi::update(); // manage access point attack.update(); // run attacks displayUI.update(); cli.update(); // read and run serial input scan.update(); // run scan ssids.update(); // run random mode, if enabled // auto-save if (settings::getAutosaveSettings().enabled && (currentTime - autosaveTime > settings::getAutosaveSettings().time)) { autosaveTime = currentTime; names.save(false); ssids.save(false); settings::save(false); } if (!booted) { booted = true; EEPROMHelper::resetBootNum(BOOT_COUNTER_ADDR); #ifdef HIGHLIGHT_LED displayUI.setupLED(); #endif // ifdef HIGHLIGHT_LED } resetButton->update(); if (resetButton->holding(5000)) { led::setMode(LED_MODE::SCAN); DISPLAY_MODE _mode = displayUI.mode; displayUI.mode = DISPLAY_MODE::RESETTING; displayUI.update(true); settings::reset(); settings::save(true); delay(2000); led::setMode(LED_MODE::IDLE); displayUI.mode = _mode; } }