Compare commits
5 Commits
bc1a8ec197
...
ef5352a7f1
| Author | SHA1 | Date |
|---|---|---|
|
|
ef5352a7f1 | |
|
|
a51e4c5c84 | |
|
|
8f6c64d4b3 | |
|
|
2e20bbf311 | |
|
|
3fdbc971b5 |
140
README.md
140
README.md
|
|
@ -1,52 +1,130 @@
|
||||||
|
|
||||||
# 🛰️ Orion RF (WIP)
|
# 🛰️ Orion RF (WIP)
|
||||||
|
|
||||||
**Orion RF** is a portable RF & wireless experimentation toolkit built for the ESP32 platform.
|
**Orion RF** is a portable RF & wireless experimentation toolkit built for the ESP32 platform with NRF24 support.
|
||||||
|
|
||||||
> ⚠️ This project is **work in progress** — many features are planned but not yet implemented.
|
> ⚠️ This project is currently under active development. Some features are experimental, incomplete, or may change frequently.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🚀 Current Features
|
# 🚀 Current Features
|
||||||
|
|
||||||
* **BLE Scanning**
|
## 📡 Wireless Tools
|
||||||
|
|
||||||
* Discover nearby Bluetooth Low Energy devices
|
### BLE Scan
|
||||||
* Display device info (MAC, RSSI, etc.)
|
- Discover nearby Bluetooth Low Energy devices
|
||||||
|
- View MAC address, RSSI, and device information
|
||||||
|
- Real-time scanning interface
|
||||||
|
|
||||||
* **WiFi Scanning**
|
### WiFi Scan
|
||||||
|
- Scan nearby WiFi access points
|
||||||
|
- View:
|
||||||
|
- SSID
|
||||||
|
- Signal strength (RSSI)
|
||||||
|
- Channel
|
||||||
|
- Encryption type
|
||||||
|
|
||||||
* Scan nearby access points
|
### WiFi Analyzer
|
||||||
* View SSID, signal strength, channel, encryption
|
- Analyze surrounding WiFi activity
|
||||||
|
- Useful for understanding channel congestion and wireless environments
|
||||||
* **WiFi Packet Analysis**
|
|
||||||
|
|
||||||
* Basic packet inspection and monitoring
|
|
||||||
* Useful for learning wireless traffic behavior
|
|
||||||
|
|
||||||
* **BadUSB**
|
|
||||||
|
|
||||||
* HID-based payload execution
|
|
||||||
* Emulate keyboard input for automation/testing
|
|
||||||
|
|
||||||
- **Jammer ()**
|
|
||||||
|
|
||||||
- BLE/Bluetooth Jammer (Works with single NRF right now)
|
|
||||||
|
|
||||||
|
### RF Capture *(WIP)*
|
||||||
|
- Experimental RF packet capture functionality
|
||||||
|
- Replay support planned
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 🧩 Project Status
|
# 📻 NRF24 Tools
|
||||||
|
|
||||||
|
### BLE Jammer
|
||||||
|
- NRF24-based BLE interference testing
|
||||||
|
- Functional
|
||||||
|
|
||||||
|
### Bluetooth Jammer
|
||||||
|
- NRF24-based Bluetooth interference testing
|
||||||
|
- Functional
|
||||||
|
|
||||||
|
### WiFi Jammer
|
||||||
|
- NRF24-based WiFi interference testing
|
||||||
|
- Experimental
|
||||||
|
|
||||||
|
> ⚠️ These tools are intended strictly for wireless research, testing, and educational purposes in authorized environments.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# ⌨️ BadUSB
|
||||||
|
|
||||||
|
- HID keyboard emulation
|
||||||
|
- Execute automated payloads/scripts
|
||||||
|
- Useful for testing and automation workflows
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🖱️ BLE Mouse
|
||||||
|
|
||||||
|
- ESP32-based Bluetooth mouse emulation
|
||||||
|
- Experimental HID functionality
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🔧 System Utilities
|
||||||
|
|
||||||
|
### System Info
|
||||||
|
- Display device/system information
|
||||||
|
- Useful for debugging and diagnostics
|
||||||
|
|
||||||
|
### Device Check
|
||||||
|
- Verify connected peripherals/modules
|
||||||
|
- Hardware diagnostics utility
|
||||||
|
|
||||||
|
### Restart
|
||||||
|
- Quick device reboot option from UI
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🧩 Project Status
|
||||||
|
|
||||||
| Feature | Status |
|
| Feature | Status |
|
||||||
| ----------------- | ---------- |
|
| -------------------- | ----------------- |
|
||||||
| BLE Scan | ✅ Working |
|
| BLE Scan | ✅ Working |
|
||||||
| WiFi Scan | ✅ Working |
|
| WiFi Scan | ✅ Working |
|
||||||
| Packet Analysis | ✅ Working |
|
| WiFi Analyzer | ✅ Working |
|
||||||
| BadUSB | ✅ Working |
|
| BadUSB | ✅ Working |
|
||||||
| Jammer | Works Partially |
|
| BLE Mouse | ✅ Working |
|
||||||
| SD Card | 🚧 WIP |
|
| BLE Jammer | ✅ Working |
|
||||||
| RF Capture/Replay | 🚧 WIP |
|
| Bluetooth Jammer | ✅ Working |
|
||||||
| Emulator | 🚧 WIP |
|
| WiFi Jammer | ⚠️ Experimental |
|
||||||
|
| RF Capture | 🚧 WIP |
|
||||||
|
| RF Replay | 🚧 WIP |
|
||||||
|
| SD Card Support | 🚧 Planned |
|
||||||
|
| Emulator | 🚧 Planned |
|
||||||
| NFC | 🚧 Planned |
|
| NFC | 🚧 Planned |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 🛠️ Hardware
|
||||||
|
|
||||||
|
- 1 x ESP32-S3
|
||||||
|
- 2 x NRF24L01 Modules
|
||||||
|
- 2 x CC1101 Modules
|
||||||
|
- 1 x OLED Display
|
||||||
|
- Battery-powered portable setup
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# 📌 Notes
|
||||||
|
|
||||||
|
- Designed primarily for learning, experimentation, and embedded RF research
|
||||||
|
- Optimized for portable usage
|
||||||
|
- UI-driven navigation system
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# ⚖️ Disclaimer
|
||||||
|
|
||||||
|
This project is intended for:
|
||||||
|
- Educational purposes
|
||||||
|
- RF experimentation
|
||||||
|
- Hardware research
|
||||||
|
- Authorized security testing
|
||||||
|
|
||||||
|
The authors are not responsible for misuse or illegal operation of this project.
|
||||||
|
|
|
||||||
|
|
@ -203,9 +203,7 @@ void ble_loop()
|
||||||
}
|
}
|
||||||
else if (btnBack())
|
else if (btnBack())
|
||||||
{
|
{
|
||||||
ble_scan();
|
|
||||||
selectedIndex = 0;
|
|
||||||
ble_drawMenu();
|
|
||||||
lastPress = millis();
|
lastPress = millis();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,6 @@
|
||||||
#include "buttons.h"
|
#include "buttons.h"
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
|
#include "config.h"
|
||||||
#define BTN_UP 4
|
|
||||||
#define BTN_DOWN 5
|
|
||||||
#define BTN_SELECT 6
|
|
||||||
#define BTN_BACK 7
|
|
||||||
|
|
||||||
void buttonsInit()
|
void buttonsInit()
|
||||||
{
|
{
|
||||||
|
|
@ -12,9 +8,13 @@ void buttonsInit()
|
||||||
pinMode(BTN_DOWN, INPUT_PULLUP);
|
pinMode(BTN_DOWN, INPUT_PULLUP);
|
||||||
pinMode(BTN_SELECT, INPUT_PULLUP);
|
pinMode(BTN_SELECT, INPUT_PULLUP);
|
||||||
pinMode(BTN_BACK, INPUT_PULLUP);
|
pinMode(BTN_BACK, INPUT_PULLUP);
|
||||||
|
pinMode(BTN_RIGHT, INPUT_PULLUP);
|
||||||
|
pinMode(BTN_LEFT, INPUT_PULLUP);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool btnUp() { return !digitalRead(BTN_UP); }
|
bool btnUp() { return !digitalRead(BTN_UP); }
|
||||||
bool btnDown() { return !digitalRead(BTN_DOWN); }
|
bool btnDown() { return !digitalRead(BTN_DOWN); }
|
||||||
bool btnSelect() { return !digitalRead(BTN_SELECT); }
|
bool btnSelect() { return !digitalRead(BTN_SELECT); }
|
||||||
bool btnBack() { return !digitalRead(BTN_BACK); }
|
bool btnBack() { return !digitalRead(BTN_BACK); }
|
||||||
|
bool btnRight() { return !digitalRead(BTN_RIGHT); }
|
||||||
|
bool btnLeft() { return !digitalRead(BTN_LEFT); }
|
||||||
|
|
|
||||||
|
|
@ -6,3 +6,5 @@ bool btnUp();
|
||||||
bool btnDown();
|
bool btnDown();
|
||||||
bool btnSelect();
|
bool btnSelect();
|
||||||
bool btnBack();
|
bool btnBack();
|
||||||
|
bool btnRight();
|
||||||
|
bool btnLeft();
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,10 @@ extern U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2;
|
||||||
|
|
||||||
// ===== RESULTS =====
|
// ===== RESULTS =====
|
||||||
struct DeviceStatus {
|
struct DeviceStatus {
|
||||||
bool nrf_link = false;
|
|
||||||
bool nrf1 = false;
|
bool nrf1 = false;
|
||||||
bool nrf2 = false;
|
bool nrf2 = false;
|
||||||
bool cc1101 = false;
|
bool cc1101_1 = false;
|
||||||
|
bool cc1101_2 = false;
|
||||||
bool oled = true;
|
bool oled = true;
|
||||||
bool buttons = false;
|
bool buttons = false;
|
||||||
};
|
};
|
||||||
|
|
@ -37,7 +37,7 @@ bool checkNRF(RF24 &radio)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===== CC1101 CHECK =====
|
// ===== CC1101 CHECK =====
|
||||||
bool checkCC1101()
|
bool checkCC1101_1()
|
||||||
{
|
{
|
||||||
ELECHOUSE_cc1101.setSpiPin(
|
ELECHOUSE_cc1101.setSpiPin(
|
||||||
cc1101_SCK,
|
cc1101_SCK,
|
||||||
|
|
@ -51,6 +51,21 @@ bool checkCC1101()
|
||||||
return ELECHOUSE_cc1101.getCC1101();
|
return ELECHOUSE_cc1101.getCC1101();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool checkCC1101_2()
|
||||||
|
{
|
||||||
|
ELECHOUSE_cc1101.setSpiPin(
|
||||||
|
cc1101_SCK,
|
||||||
|
cc1101_MISO,
|
||||||
|
cc1101_MOSI,
|
||||||
|
CC1101_2_CS
|
||||||
|
);
|
||||||
|
|
||||||
|
delay(5); // important stabilization
|
||||||
|
|
||||||
|
return ELECHOUSE_cc1101.getCC1101();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ===== BUTTON CHECK =====
|
// ===== BUTTON CHECK =====
|
||||||
bool checkButtons()
|
bool checkButtons()
|
||||||
{
|
{
|
||||||
|
|
@ -82,8 +97,8 @@ bool checkButtons()
|
||||||
const char* labels[MAX_ITEMS] = {
|
const char* labels[MAX_ITEMS] = {
|
||||||
"NRF1",
|
"NRF1",
|
||||||
"NRF2",
|
"NRF2",
|
||||||
"LINK",
|
"CC1101_1",
|
||||||
"CC1101",
|
"CC1101_2",
|
||||||
"BUTTONS",
|
"BUTTONS",
|
||||||
"OLED"
|
"OLED"
|
||||||
};
|
};
|
||||||
|
|
@ -97,8 +112,8 @@ void drawStatus(DeviceStatus &s)
|
||||||
{
|
{
|
||||||
values[0] = s.nrf1;
|
values[0] = s.nrf1;
|
||||||
values[1] = s.nrf2;
|
values[1] = s.nrf2;
|
||||||
values[2] = s.nrf_link;
|
values[2] = s.cc1101_1;
|
||||||
values[3] = s.cc1101;
|
values[3] = s.cc1101_2;
|
||||||
values[4] = s.buttons;
|
values[4] = s.buttons;
|
||||||
values[5] = s.oled;
|
values[5] = s.oled;
|
||||||
|
|
||||||
|
|
@ -139,56 +154,6 @@ void drawStatus(DeviceStatus &s)
|
||||||
u8g2.sendBuffer();
|
u8g2.sendBuffer();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool testNRFLink()
|
|
||||||
{
|
|
||||||
const byte address[6] = "00001";
|
|
||||||
uint8_t payload = 0xAB;
|
|
||||||
uint8_t received = 0;
|
|
||||||
|
|
||||||
// --- init radios ---
|
|
||||||
if (!radio1.begin(RADIO_SPI)) return false;
|
|
||||||
if (!radio2.begin(RADIO_SPI)) return false;
|
|
||||||
|
|
||||||
radio1.setPALevel(RF24_PA_LOW);
|
|
||||||
radio2.setPALevel(RF24_PA_LOW);
|
|
||||||
|
|
||||||
radio1.setDataRate(RF24_1MBPS);
|
|
||||||
radio2.setDataRate(RF24_1MBPS);
|
|
||||||
|
|
||||||
radio1.setChannel(100);
|
|
||||||
radio2.setChannel(100);
|
|
||||||
|
|
||||||
radio1.setAutoAck(false);
|
|
||||||
radio2.setAutoAck(false);
|
|
||||||
|
|
||||||
// --- configure pipes ---
|
|
||||||
radio1.openWritingPipe(address);
|
|
||||||
radio2.openReadingPipe(0, address);
|
|
||||||
|
|
||||||
radio2.startListening();
|
|
||||||
|
|
||||||
delay(50);
|
|
||||||
|
|
||||||
// --- send ---
|
|
||||||
radio1.stopListening();
|
|
||||||
bool sent = radio1.write(&payload, sizeof(payload));
|
|
||||||
|
|
||||||
if (!sent) return false;
|
|
||||||
|
|
||||||
// --- receive ---
|
|
||||||
unsigned long start = millis();
|
|
||||||
|
|
||||||
while (millis() - start < 200)
|
|
||||||
{
|
|
||||||
if (radio2.available())
|
|
||||||
{
|
|
||||||
radio2.read(&received, sizeof(received));
|
|
||||||
return (received == payload);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ===== MAIN =====
|
// ===== MAIN =====
|
||||||
void device_check_run()
|
void device_check_run()
|
||||||
|
|
@ -199,12 +164,12 @@ void device_check_run()
|
||||||
|
|
||||||
// NRF
|
// NRF
|
||||||
// NRF link test
|
// NRF link test
|
||||||
status.nrf_link = testNRFLink();
|
|
||||||
status.nrf1 = checkNRF(radio1);
|
status.nrf1 = checkNRF(radio1);
|
||||||
status.nrf2 = checkNRF(radio2);
|
status.nrf2 = checkNRF(radio2);
|
||||||
|
|
||||||
// CC1101
|
// CC1101
|
||||||
status.cc1101 = checkCC1101();
|
status.cc1101_1 = checkCC1101_1();
|
||||||
|
status.cc1101_2 = checkCC1101_1();
|
||||||
|
|
||||||
// Buttons
|
// Buttons
|
||||||
status.buttons = checkButtons();
|
status.buttons = checkButtons();
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
#include "wifi_scan.h"
|
#include "wifi_scan.h"
|
||||||
#include "wifi_analyzer.h"
|
#include "wifi_analyzer.h"
|
||||||
#include "device_check.h"
|
#include "device_check.h"
|
||||||
#include "blemouse.h"
|
#include "ble_mouse.h"
|
||||||
#include "sysinfo.h"
|
#include "sysinfo.h"
|
||||||
#include "BleMouse.h"
|
#include "BleMouse.h"
|
||||||
|
|
||||||
|
|
@ -36,7 +36,8 @@ Menu mainMenu = {mainMenuItems, sizeof(mainMenuItems) / sizeof(mainMenuItems[0])
|
||||||
// NRF Tools menu
|
// NRF Tools menu
|
||||||
const char *nrfToolsItems[] = {
|
const char *nrfToolsItems[] = {
|
||||||
"BLE Jammer",
|
"BLE Jammer",
|
||||||
"Bluetooth Jammer"
|
"Bluetooth Jammer",
|
||||||
|
"Wifi Jammer"
|
||||||
};
|
};
|
||||||
|
|
||||||
Menu nrfToolsMenu = {nrfToolsItems, sizeof(nrfToolsItems) / sizeof(nrfToolsItems[0])};
|
Menu nrfToolsMenu = {nrfToolsItems, sizeof(nrfToolsItems) / sizeof(nrfToolsItems[0])};
|
||||||
|
|
@ -226,13 +227,82 @@ void launchFeature()
|
||||||
device_check_run();
|
device_check_run();
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
|
{
|
||||||
|
// wait for button release
|
||||||
|
delay(200);
|
||||||
|
|
||||||
|
while (btnSelect())
|
||||||
|
delay(10);
|
||||||
|
bool confirm = false;
|
||||||
|
|
||||||
|
while (1)
|
||||||
|
{
|
||||||
u8g2.clearBuffer();
|
u8g2.clearBuffer();
|
||||||
u8g2.setFont(u8g2_font_6x13_tr);
|
u8g2.setFont(u8g2_font_6x13_tr);
|
||||||
u8g2.drawStr(30, 30, "Restarting...");
|
|
||||||
|
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();
|
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);
|
delay(1000);
|
||||||
ESP.restart();
|
ESP.restart();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (btnBack())
|
||||||
|
{
|
||||||
|
delay(150);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 9:
|
case 9:
|
||||||
// Begin Ble mouse
|
// Begin Ble mouse
|
||||||
bleMouse.begin();
|
bleMouse.begin();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue