esp8266_deauther/esp8266_deauther/esp8266_deauther.ino

197 lines
4.6 KiB
C++

/* =====================
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;
}
}