The ESP8266 is an amazing cheap microcontroller that has WiFi capability embedded. One of its fun features is that you can use it in Promiscuous Mode to sniff packets.
Here is the Arduino code for ESP8266:
#ifdef ESP8266 extern "C" { #include "ets_sys.h" #include "osapi.h" #include "gpio.h" #include "os_type.h" #include "user_config.h" #include "user_interface.h" } #endif int ap_channel = 1; // AP channel char ap_mac[6] = { 0x34, 0xCD, 0xBE, 0x56, 0x64, 0xA0 }; // AP MAC struct RxControl { signed rssi: 8; unsigned rate: 4; unsigned is_group: 1; unsigned: 1; unsigned sig_mode: 2; unsigned legacy_length: 12; unsigned damatch0: 1; unsigned damatch1: 1; unsigned bssidmatch0: 1; unsigned bssidmatch1: 1; unsigned MCS: 7; unsigned CWB: 1; unsigned HT_length: 16; unsigned Smoothing: 1; unsigned Not_Sounding: 1; unsigned: 1; unsigned Aggregation: 1; unsigned STBC: 2; unsigned FEC_CODING: 1; unsigned SGI: 1; unsigned rxend_state: 8; unsigned ampdu_cnt: 8; unsigned channel: 4; unsigned: 12; }; struct LenSeq { uint16_t length; uint16_t seq; uint8_t address3[6]; }; struct sniffer_buf { struct RxControl rx_ctrl; uint8_t buf[36]; uint16_t cnt; struct LenSeq lenseq[1]; }; struct sniffer_buf2 { struct RxControl rx_ctrl; uint8_t buf[112]; uint16_t cnt; uint16_t len; }; unsigned long time_ = 0; // Callback function void ICACHE_FLASH_ATTR promisc_cb(uint8 *buf, uint16 len) { if (len == 12) { struct RxControl *sniffer = (struct RxControl*) buf; } else if (len == 128) { struct sniffer_buf2 *sniffer = (struct sniffer_buf2*) buf; int i = 0; // Check MAC for (i = 0; i < 6; i++) if (sniffer->buf[i + 10] != ap_mac[i]) return; Serial.printf("RSSI: %2d (%d ms)\n", sniffer->rx_ctrl.rssi, millis() - time_); time_ = millis(); } else { struct sniffer_buf *sniffer = (struct sniffer_buf*) buf; int i = 0; // Check MAC for (i = 0; i < 6; i++) if (sniffer->buf[i + 10] != ap_mac[i]) return; Serial.printf("RSSI: %2d (%d ms)\n", sniffer->rx_ctrl.rssi, millis() - time_); time_ = millis(); } } void setup() { Serial.begin(115200); Serial.println(" -> WiFi Sniffer"); Serial.println(" -> Initializing!\n\n"); wifi_set_opmode(0x1); wifi_set_channel(ap_channel); wifi_promiscuous_enable(0); wifi_set_promiscuous_rx_cb(promisc_cb); wifi_promiscuous_enable(1); Serial.println(" -> Init finished!\n\n"); time_ = millis(); } void loop(){ // Loop }
October 5, 2017 at 3:46 pm
Could you give us a guide of how to use it? I have uploaded it to my ESP12F but there is nothing on the serial monitor. What I have to do next to upload the code? Thank you!