WiFiScan.cpp 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. #include "WiFiScan.h"
  2. //esp_err_t esp_wifi_80211_tx(wifi_interface_t ifx, const void *buffer, int len, bool en_sys_seq);
  3. class bluetoothScanAllCallback: public BLEAdvertisedDeviceCallbacks {
  4. void onResult(BLEAdvertisedDevice advertisedDevice) {
  5. String display_string = "";
  6. if (display_obj.display_buffer->size() >= 0)
  7. {
  8. display_string.concat(" RSSI: ");
  9. display_string.concat(advertisedDevice.getRSSI());
  10. Serial.print(" RSSI: ");
  11. Serial.print(advertisedDevice.getRSSI());
  12. display_string.concat(" ");
  13. Serial.print(" ");
  14. Serial.print("Device: ");
  15. if(advertisedDevice.getName().length() != 0)
  16. {
  17. display_string.concat(advertisedDevice.getName().c_str());
  18. Serial.print(advertisedDevice.getName().c_str());
  19. }
  20. else
  21. {
  22. display_string.concat(advertisedDevice.getAddress().toString().c_str());
  23. Serial.print(advertisedDevice.getAddress().toString().c_str());
  24. }
  25. int temp_len = display_string.length();
  26. for (int i = 0; i < 40 - temp_len; i++)
  27. {
  28. display_string.concat(" ");
  29. }
  30. Serial.println();
  31. while (display_obj.printing)
  32. delay(1);
  33. display_obj.loading = true;
  34. display_obj.display_buffer->add(display_string);
  35. display_obj.loading = false;
  36. }
  37. }
  38. };
  39. class bluetoothScanSkimmersCallback: public BLEAdvertisedDeviceCallbacks {
  40. void onResult(BLEAdvertisedDevice advertisedDevice) {
  41. String bad_list[bad_list_length] = {"HC-03", "HC-05", "HC-06"};
  42. if (display_obj.display_buffer->size() >= 0)
  43. {
  44. Serial.print("Device: ");
  45. String display_string = "";
  46. //display_string.concat(" RSSI: ");
  47. //display_string.concat(advertisedDevice.getRSSI());
  48. //display_string.concat(" ");
  49. if(advertisedDevice.getName().length() != 0)
  50. {
  51. //display_string.concat(advertisedDevice.getName().c_str());
  52. Serial.print(advertisedDevice.getName().c_str());
  53. for(int i = 0; i < bad_list_length; i++)
  54. {
  55. if(strcmp(advertisedDevice.getName().c_str(), bad_list[i].c_str()) == 0)
  56. {
  57. display_string.concat("Potential Skimmer: ");
  58. display_string.concat(" ");
  59. display_string.concat(advertisedDevice.getName().c_str());
  60. int temp_len = display_string.length();
  61. for (int i = 0; i < 40 - temp_len; i++)
  62. {
  63. display_string.concat(" ");
  64. }
  65. while (display_obj.printing)
  66. delay(1);
  67. display_obj.loading = true;
  68. display_obj.display_buffer->add(display_string);
  69. display_obj.loading = false;
  70. }
  71. }
  72. }
  73. else
  74. {
  75. Serial.print(advertisedDevice.getAddress().toString().c_str());
  76. //display_string.concat(advertisedDevice.getAddress().toString().c_str());
  77. }
  78. /*
  79. int temp_len = display_string.length();
  80. for (int i = 0; i < 40 - temp_len; i++)
  81. {
  82. display_string.concat(" ");
  83. }
  84. */
  85. Serial.print(" RSSI: ");
  86. Serial.println(advertisedDevice.getRSSI());
  87. /*
  88. while (display_obj.printing)
  89. delay(1);
  90. display_obj.loading = true;
  91. display_obj.display_buffer->add(display_string);
  92. display_obj.loading = false;
  93. */
  94. }
  95. }
  96. };
  97. WiFiScan::WiFiScan()
  98. {
  99. }
  100. // Function to prepare to run a specific scan
  101. void WiFiScan::StartScan(uint8_t scan_mode, uint16_t color)
  102. {
  103. //Serial.println("Starting Scan...");
  104. if (scan_mode == WIFI_SCAN_OFF)
  105. StopScan(scan_mode);
  106. else if (scan_mode == WIFI_SCAN_PROBE)
  107. RunProbeScan(scan_mode, color);
  108. else if (scan_mode == WIFI_SCAN_AP)
  109. RunBeaconScan(scan_mode, color);
  110. else if (scan_mode == WIFI_SCAN_DEAUTH)
  111. RunDeauthScan(scan_mode, color);
  112. else if (scan_mode == WIFI_ATTACK_BEACON_SPAM)
  113. RunBeaconSpam(scan_mode, color);
  114. else if (scan_mode == WIFI_ATTACK_RICK_ROLL)
  115. RunRickRoll(scan_mode, color);
  116. else if (scan_mode == BT_SCAN_ALL)
  117. RunBluetoothScan(scan_mode, color);
  118. else if (scan_mode == BT_SCAN_SKIMMERS)
  119. RunBluetoothScan(scan_mode, color);
  120. WiFiScan::currentScanMode = scan_mode;
  121. }
  122. // Function to stop all wifi scans
  123. void WiFiScan::StopScan(uint8_t scan_mode)
  124. {
  125. if ((currentScanMode == WIFI_SCAN_PROBE) ||
  126. (currentScanMode == WIFI_SCAN_AP) ||
  127. (currentScanMode == WIFI_SCAN_ST) ||
  128. (currentScanMode == WIFI_SCAN_ALL) ||
  129. (currentScanMode == WIFI_SCAN_DEAUTH) ||
  130. (currentScanMode == WIFI_ATTACK_BEACON_SPAM) ||
  131. (currentScanMode == WIFI_ATTACK_RICK_ROLL))
  132. {
  133. esp_wifi_set_promiscuous(false);
  134. WiFi.mode(WIFI_OFF);
  135. }
  136. else if ((currentScanMode == BT_SCAN_ALL) ||
  137. (currentScanMode == BT_SCAN_SKIMMERS))
  138. {
  139. Serial.println("Stopping BLE scan...");
  140. pBLEScan->stop();
  141. Serial.println("BLE Scan Stopped");
  142. }
  143. display_obj.display_buffer->clear();
  144. Serial.print("display_buffer->size(): ");
  145. Serial.println(display_obj.display_buffer->size());
  146. display_obj.tteBar = false;
  147. }
  148. void WiFiScan::RunRickRoll(uint8_t scan_mode, uint16_t color)
  149. {
  150. //Serial.println("Rick Roll...");
  151. display_obj.TOP_FIXED_AREA_2 = 32;
  152. display_obj.tteBar = true;
  153. display_obj.print_delay_1 = 15;
  154. display_obj.print_delay_2 = 10;
  155. display_obj.clearScreen();
  156. display_obj.initScrollValues(true);
  157. display_obj.tft.setTextWrap(false);
  158. display_obj.tft.setTextColor(TFT_BLACK, color);
  159. display_obj.tft.fillRect(0,0,240,16, color);
  160. display_obj.tft.drawCentreString(" Rick Roll Beacon ",120,0,2);
  161. display_obj.touchToExit();
  162. display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK);
  163. packets_sent = 0;
  164. //esp_wifi_set_mode(WIFI_MODE_STA);
  165. WiFi.mode(WIFI_AP_STA);
  166. esp_wifi_set_promiscuous_filter(NULL);
  167. esp_wifi_set_promiscuous(true);
  168. esp_wifi_set_max_tx_power(78);
  169. initTime = millis();
  170. //display_obj.clearScreen();
  171. //Serial.println("End of func");
  172. }
  173. // Function to prepare for beacon spam
  174. void WiFiScan::RunBeaconSpam(uint8_t scan_mode, uint16_t color)
  175. {
  176. //Serial.println("Beacon Spam...");
  177. display_obj.TOP_FIXED_AREA_2 = 32;
  178. display_obj.tteBar = true;
  179. display_obj.print_delay_1 = 15;
  180. display_obj.print_delay_2 = 10;
  181. display_obj.clearScreen();
  182. display_obj.initScrollValues(true);
  183. display_obj.tft.setTextWrap(false);
  184. display_obj.tft.setTextColor(TFT_BLACK, color);
  185. display_obj.tft.fillRect(0,0,240,16, color);
  186. display_obj.tft.drawCentreString(" Beacon Spam Random ",120,0,2);
  187. display_obj.touchToExit();
  188. display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK);
  189. packets_sent = 0;
  190. //esp_wifi_set_mode(WIFI_MODE_STA);
  191. WiFi.mode(WIFI_AP_STA);
  192. esp_wifi_set_promiscuous_filter(NULL);
  193. esp_wifi_set_promiscuous(true);
  194. esp_wifi_set_max_tx_power(78);
  195. initTime = millis();
  196. //display_obj.clearScreen();
  197. //Serial.println("End of func");
  198. }
  199. // Function to start running a beacon scan
  200. void WiFiScan::RunBeaconScan(uint8_t scan_mode, uint16_t color)
  201. {
  202. display_obj.TOP_FIXED_AREA_2 = 32;
  203. display_obj.tteBar = true;
  204. display_obj.print_delay_1 = 15;
  205. display_obj.print_delay_2 = 10;
  206. display_obj.clearScreen();
  207. display_obj.initScrollValues(true);
  208. display_obj.tft.setTextWrap(false);
  209. display_obj.tft.setTextColor(TFT_WHITE, color);
  210. display_obj.tft.fillRect(0,0,240,16, color);
  211. display_obj.tft.drawCentreString(" Beacon Sniffer ",120,0,2);
  212. display_obj.touchToExit();
  213. display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK);
  214. display_obj.setupScrollArea(display_obj.TOP_FIXED_AREA_2, BOT_FIXED_AREA);
  215. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  216. esp_wifi_init(&cfg);
  217. esp_wifi_set_storage(WIFI_STORAGE_RAM);
  218. esp_wifi_set_mode(WIFI_MODE_NULL);
  219. esp_wifi_set_promiscuous(true);
  220. esp_wifi_set_promiscuous_filter(&filt);
  221. esp_wifi_set_promiscuous_rx_cb(&beaconSnifferCallback);
  222. esp_wifi_set_channel(set_channel, WIFI_SECOND_CHAN_NONE);
  223. initTime = millis();
  224. }
  225. void WiFiScan::RunDeauthScan(uint8_t scan_mode, uint16_t color)
  226. {
  227. display_obj.TOP_FIXED_AREA_2 = 32;
  228. display_obj.tteBar = true;
  229. display_obj.print_delay_1 = 15;
  230. display_obj.print_delay_2 = 10;
  231. display_obj.clearScreen();
  232. display_obj.initScrollValues(true);
  233. display_obj.tft.setTextWrap(false);
  234. display_obj.tft.setTextColor(TFT_BLACK, color);
  235. display_obj.tft.fillRect(0,0,240,16, color);
  236. display_obj.tft.drawCentreString(" Deauthentication Sniffer ",120,0,2);
  237. display_obj.touchToExit();
  238. display_obj.tft.setTextColor(TFT_RED, TFT_BLACK);
  239. display_obj.setupScrollArea(display_obj.TOP_FIXED_AREA_2, BOT_FIXED_AREA);
  240. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  241. esp_wifi_init(&cfg);
  242. esp_wifi_set_storage(WIFI_STORAGE_RAM);
  243. esp_wifi_set_mode(WIFI_MODE_NULL);
  244. esp_wifi_set_promiscuous(true);
  245. esp_wifi_set_promiscuous_filter(&filt);
  246. esp_wifi_set_promiscuous_rx_cb(&deauthSnifferCallback);
  247. esp_wifi_set_channel(set_channel, WIFI_SECOND_CHAN_NONE);
  248. initTime = millis();
  249. }
  250. // Function for running probe request scan
  251. void WiFiScan::RunProbeScan(uint8_t scan_mode, uint16_t color)
  252. {
  253. display_obj.TOP_FIXED_AREA_2 = 32;
  254. display_obj.tteBar = true;
  255. display_obj.print_delay_1 = 15;
  256. display_obj.print_delay_2 = 10;
  257. display_obj.clearScreen();
  258. display_obj.initScrollValues(true);
  259. display_obj.tft.setTextWrap(false);
  260. display_obj.tft.setTextColor(TFT_BLACK, color);
  261. display_obj.tft.fillRect(0,0,240,16, color);
  262. display_obj.tft.drawCentreString(" Probe Request Sniffer ",120,0,2);
  263. display_obj.touchToExit();
  264. display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK);
  265. display_obj.setupScrollArea(display_obj.TOP_FIXED_AREA_2, BOT_FIXED_AREA);
  266. wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  267. esp_wifi_init(&cfg);
  268. esp_wifi_set_storage(WIFI_STORAGE_RAM);
  269. esp_wifi_set_mode(WIFI_MODE_NULL);
  270. esp_wifi_set_promiscuous(true);
  271. esp_wifi_set_promiscuous_filter(&filt);
  272. esp_wifi_set_promiscuous_rx_cb(&probeSnifferCallback);
  273. esp_wifi_set_channel(set_channel, WIFI_SECOND_CHAN_NONE);
  274. initTime = millis();
  275. }
  276. // Function to start running any BLE scan
  277. void WiFiScan::RunBluetoothScan(uint8_t scan_mode, uint16_t color)
  278. {
  279. display_obj.print_delay_1 = 50;
  280. display_obj.print_delay_2 = 20;
  281. BLEDevice::init("");
  282. pBLEScan = BLEDevice::getScan(); //create new scan
  283. if (scan_mode == BT_SCAN_ALL)
  284. {
  285. display_obj.TOP_FIXED_AREA_2 = 32;
  286. display_obj.tteBar = true;
  287. display_obj.clearScreen();
  288. display_obj.initScrollValues(true);
  289. display_obj.tft.setTextWrap(false);
  290. display_obj.tft.setTextColor(TFT_BLACK, color);
  291. display_obj.tft.fillRect(0,0,240,16, color);
  292. display_obj.tft.drawCentreString(" Bluetooth Sniff ",120,0,2);
  293. display_obj.touchToExit();
  294. display_obj.tft.setTextColor(TFT_CYAN, TFT_BLACK);
  295. display_obj.setupScrollArea(display_obj.TOP_FIXED_AREA_2, BOT_FIXED_AREA);
  296. pBLEScan->setAdvertisedDeviceCallbacks(new bluetoothScanAllCallback());
  297. }
  298. else if (scan_mode == BT_SCAN_SKIMMERS)
  299. {
  300. display_obj.TOP_FIXED_AREA_2 = 160;
  301. display_obj.tteBar = true;
  302. display_obj.clearScreen();
  303. display_obj.tft.fillScreen(TFT_DARKGREY);
  304. display_obj.initScrollValues(true);
  305. display_obj.tft.setTextWrap(false);
  306. display_obj.tft.setTextColor(TFT_BLACK, color);
  307. display_obj.tft.fillRect(0,0,240,16, color);
  308. display_obj.tft.drawCentreString(" Detect Card Skimmers ",120,0,2);
  309. display_obj.twoPartDisplay("Scanning for\nBluetooth-enabled skimmers\nHC-03, HC-05, and HC-06...");
  310. display_obj.tft.setTextColor(TFT_BLACK, TFT_DARKGREY);
  311. display_obj.setupScrollArea(display_obj.TOP_FIXED_AREA_2, BOT_FIXED_AREA);
  312. pBLEScan->setAdvertisedDeviceCallbacks(new bluetoothScanSkimmersCallback());
  313. }
  314. pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  315. pBLEScan->setInterval(100);
  316. pBLEScan->setWindow(99); // less or equal setInterval value
  317. pBLEScan->start(0, scanCompleteCB);
  318. Serial.println("Started BLE Scan");
  319. initTime = millis();
  320. }
  321. // Function that is called when BLE scan is completed
  322. void WiFiScan::scanCompleteCB(BLEScanResults scanResults) {
  323. printf("Scan complete!\n");
  324. printf("Found %d devices\n", scanResults.getCount());
  325. scanResults.dump();
  326. } // scanCompleteCB
  327. // Function to extract MAC addr from a packet at given offset
  328. void WiFiScan::getMAC(char *addr, uint8_t* data, uint16_t offset) {
  329. sprintf(addr, "%02x:%02x:%02x:%02x:%02x:%02x", data[offset+0], data[offset+1], data[offset+2], data[offset+3], data[offset+4], data[offset+5]);
  330. }
  331. void WiFiScan::beaconSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type)
  332. {
  333. wifi_promiscuous_pkt_t *snifferPacket = (wifi_promiscuous_pkt_t*)buf;
  334. WifiMgmtHdr *frameControl = (WifiMgmtHdr*)snifferPacket->payload;
  335. wifi_pkt_rx_ctrl_t ctrl = (wifi_pkt_rx_ctrl_t)snifferPacket->rx_ctrl;
  336. int len = snifferPacket->rx_ctrl.sig_len;
  337. String display_string = "";
  338. if (type == WIFI_PKT_MGMT)
  339. {
  340. int fctl = ntohs(frameControl->fctl);
  341. const wifi_ieee80211_packet_t *ipkt = (wifi_ieee80211_packet_t *)snifferPacket->payload;
  342. const WifiMgmtHdr *hdr = &ipkt->hdr;
  343. // If we dont the buffer size is not 0, don't write or else we get CORRUPT_HEAP
  344. if ((snifferPacket->payload[0] == 0x80) && (display_obj.display_buffer->size() == 0))
  345. {
  346. delay(random(0, 10));
  347. Serial.print("RSSI: ");
  348. Serial.print(snifferPacket->rx_ctrl.rssi);
  349. Serial.print(" Ch: ");
  350. Serial.print(snifferPacket->rx_ctrl.channel);
  351. Serial.print(" BSSID: ");
  352. char addr[] = "00:00:00:00:00:00";
  353. getMAC(addr, snifferPacket->payload, 10);
  354. Serial.print(addr);
  355. display_string.concat(addr);
  356. Serial.print(" ESSID: ");
  357. display_string.concat(" -> ");
  358. for (int i = 0; i < snifferPacket->payload[37]; i++)
  359. {
  360. Serial.print((char)snifferPacket->payload[i + 38]);
  361. display_string.concat((char)snifferPacket->payload[i + 38]);
  362. }
  363. int temp_len = display_string.length();
  364. for (int i = 0; i < 40 - temp_len; i++)
  365. {
  366. display_string.concat(" ");
  367. }
  368. Serial.print(" ");
  369. if (display_obj.display_buffer->size() == 0)
  370. {
  371. display_obj.loading = true;
  372. display_obj.display_buffer->add(display_string);
  373. display_obj.loading = false;
  374. }
  375. Serial.println();
  376. }
  377. }
  378. }
  379. void WiFiScan::deauthSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type)
  380. {
  381. wifi_promiscuous_pkt_t *snifferPacket = (wifi_promiscuous_pkt_t*)buf;
  382. WifiMgmtHdr *frameControl = (WifiMgmtHdr*)snifferPacket->payload;
  383. wifi_pkt_rx_ctrl_t ctrl = (wifi_pkt_rx_ctrl_t)snifferPacket->rx_ctrl;
  384. int len = snifferPacket->rx_ctrl.sig_len;
  385. String display_string = "";
  386. if (type == WIFI_PKT_MGMT)
  387. {
  388. int fctl = ntohs(frameControl->fctl);
  389. const wifi_ieee80211_packet_t *ipkt = (wifi_ieee80211_packet_t *)snifferPacket->payload;
  390. const WifiMgmtHdr *hdr = &ipkt->hdr;
  391. // If we dont the buffer size is not 0, don't write or else we get CORRUPT_HEAP
  392. if ((snifferPacket->payload[0] == 0xA0 || snifferPacket->payload[0] == 0xC0 ) && (display_obj.display_buffer->size() == 0))
  393. {
  394. delay(random(0, 10));
  395. Serial.print("RSSI: ");
  396. Serial.print(snifferPacket->rx_ctrl.rssi);
  397. Serial.print(" Ch: ");
  398. Serial.print(snifferPacket->rx_ctrl.channel);
  399. Serial.print(" BSSID: ");
  400. char addr[] = "00:00:00:00:00:00";
  401. getMAC(addr, snifferPacket->payload, 10);
  402. Serial.print(addr);
  403. display_string.concat(" RSSI: ");
  404. display_string.concat(snifferPacket->rx_ctrl.rssi);
  405. display_string.concat(" ");
  406. display_string.concat(addr);
  407. for (int i = 0; i < 19 - snifferPacket->payload[37]; i++)
  408. {
  409. display_string.concat(" ");
  410. }
  411. Serial.print(" ");
  412. if (display_obj.display_buffer->size() == 0)
  413. {
  414. display_obj.loading = true;
  415. display_obj.display_buffer->add(display_string);
  416. display_obj.loading = false;
  417. }
  418. Serial.println();
  419. }
  420. }
  421. }
  422. void WiFiScan::probeSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t type) {
  423. wifi_promiscuous_pkt_t *snifferPacket = (wifi_promiscuous_pkt_t*)buf;
  424. WifiMgmtHdr *frameControl = (WifiMgmtHdr*)snifferPacket->payload;
  425. wifi_pkt_rx_ctrl_t ctrl = (wifi_pkt_rx_ctrl_t)snifferPacket->rx_ctrl;
  426. int len = snifferPacket->rx_ctrl.sig_len;
  427. String display_string = "";
  428. if (type == WIFI_PKT_MGMT)
  429. {
  430. int fctl = ntohs(frameControl->fctl);
  431. const wifi_ieee80211_packet_t *ipkt = (wifi_ieee80211_packet_t *)snifferPacket->payload;
  432. const WifiMgmtHdr *hdr = &ipkt->hdr;
  433. // If we dont the buffer size is not 0, don't write or else we get CORRUPT_HEAP
  434. if ((snifferPacket->payload[0] == 0x40) && (display_obj.display_buffer->size() == 0))
  435. {
  436. delay(random(0, 10));
  437. Serial.print("RSSI: ");
  438. Serial.print(snifferPacket->rx_ctrl.rssi);
  439. Serial.print(" Ch: ");
  440. Serial.print(snifferPacket->rx_ctrl.channel);
  441. Serial.print(" Client: ");
  442. char addr[] = "00:00:00:00:00:00";
  443. getMAC(addr, snifferPacket->payload, 10);
  444. Serial.print(addr);
  445. display_string.concat(addr);
  446. Serial.print(" Requesting: ");
  447. display_string.concat(" -> ");
  448. for (int i = 0; i < snifferPacket->payload[25]; i++)
  449. {
  450. Serial.print((char)snifferPacket->payload[26 + i]);
  451. display_string.concat((char)snifferPacket->payload[26 + i]);
  452. }
  453. // Print spaces because of the rotating lines of the hardware scroll.
  454. // The same characters print from previous lines so I just overwrite them
  455. // with spaces.
  456. for (int i = 0; i < 19 - snifferPacket->payload[25]; i++)
  457. {
  458. display_string.concat(" ");
  459. }
  460. if (display_obj.display_buffer->size() == 0)
  461. {
  462. //while (display_obj.printing)
  463. // delay(1);
  464. display_obj.loading = true;
  465. display_obj.display_buffer->add(display_string);
  466. display_obj.loading = false;
  467. }
  468. Serial.println();
  469. }
  470. }
  471. }
  472. // Function to send beacons with random ESSID length
  473. void WiFiScan::broadcastSetSSID(uint32_t current_time, char* ESSID) {
  474. set_channel = random(1,12);
  475. esp_wifi_set_channel(set_channel, WIFI_SECOND_CHAN_NONE);
  476. delay(1);
  477. // Randomize SRC MAC
  478. packet[10] = packet[16] = random(256);
  479. packet[11] = packet[17] = random(256);
  480. packet[12] = packet[18] = random(256);
  481. packet[13] = packet[19] = random(256);
  482. packet[14] = packet[20] = random(256);
  483. packet[15] = packet[21] = random(256);
  484. /////////////////////////////
  485. //int essid_len = random(6, 10);
  486. // random prefix to beacon essid
  487. //uint8_t rand_reg[essid_len] = {};
  488. //for (int i = 0; i < essid_len; i++)
  489. // rand_reg[i] = alfa[random(65)];
  490. int ssidLen = strlen(ESSID);
  491. //int rand_len = sizeof(rand_reg);
  492. int fullLen = ssidLen;
  493. packet[37] = fullLen;
  494. // Insert random prefix
  495. //for (int i = 0; i < rand_len; i++)
  496. // packet[38+i] = rand_reg[i];
  497. // Insert my tag
  498. for(int i = 0; i < ssidLen; i++)
  499. packet[38 + i] = ESSID[i];
  500. /////////////////////////////
  501. packet[50 + fullLen] = set_channel;
  502. uint8_t postSSID[13] = {0x01, 0x08, 0x82, 0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, //supported rate
  503. 0x03, 0x01, 0x04 /*DSSS (Current Channel)*/ };
  504. // Add everything that goes after the SSID
  505. for(int i = 0; i < 12; i++)
  506. packet[38 + fullLen + i] = postSSID[i];
  507. esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  508. esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  509. esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  510. //esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  511. //esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  512. //esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  513. packets_sent = packets_sent + 3;
  514. }
  515. // Function for sending crafted beacon frames
  516. void WiFiScan::broadcastRandomSSID(uint32_t currentTime) {
  517. set_channel = random(1,12);
  518. esp_wifi_set_channel(set_channel, WIFI_SECOND_CHAN_NONE);
  519. delay(1);
  520. // Randomize SRC MAC
  521. packet[10] = packet[16] = random(256);
  522. packet[11] = packet[17] = random(256);
  523. packet[12] = packet[18] = random(256);
  524. packet[13] = packet[19] = random(256);
  525. packet[14] = packet[20] = random(256);
  526. packet[15] = packet[21] = random(256);
  527. packet[37] = 6;
  528. // Randomize SSID (Fixed size 6. Lazy right?)
  529. packet[38] = alfa[random(65)];
  530. packet[39] = alfa[random(65)];
  531. packet[40] = alfa[random(65)];
  532. packet[41] = alfa[random(65)];
  533. packet[42] = alfa[random(65)];
  534. packet[43] = alfa[random(65)];
  535. packet[56] = set_channel;
  536. uint8_t postSSID[13] = {0x01, 0x08, 0x82, 0x84, 0x8b, 0x96, 0x24, 0x30, 0x48, 0x6c, //supported rate
  537. 0x03, 0x01, 0x04 /*DSSS (Current Channel)*/ };
  538. // Add everything that goes after the SSID
  539. for(int i = 0; i < 12; i++)
  540. packet[38 + 6 + i] = postSSID[i];
  541. //Serial.println("About to send packets...");
  542. esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  543. esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  544. esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  545. //esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  546. //esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  547. //esp_wifi_80211_tx(WIFI_IF_AP, packet, sizeof(packet), false);
  548. packets_sent = packets_sent + 3;
  549. //Serial.print("Packets sent: ");
  550. //Serial.println(packets_sent);
  551. //Serial.println("Sent packets");
  552. }
  553. //void WiFiScan::sniffer_callback(void* buf, wifi_promiscuous_pkt_type_t type) {
  554. // wifi_promiscuous_pkt_t *snifferPacket = (wifi_promiscuous_pkt_t*)buf;
  555. // showMetadata(snifferPacket, type);
  556. //}
  557. // Function to cycle to the next channel
  558. void WiFiScan::channelHop()
  559. {
  560. set_channel = set_channel + 1;
  561. if (set_channel > 13) {
  562. set_channel = 1;
  563. }
  564. esp_wifi_set_channel(set_channel, WIFI_SECOND_CHAN_NONE);
  565. delay(1);
  566. }
  567. // Function for updating scan status
  568. void WiFiScan::main(uint32_t currentTime)
  569. {
  570. // WiFi operations
  571. if ((currentScanMode == WIFI_SCAN_PROBE) ||
  572. (currentScanMode == WIFI_SCAN_AP) ||
  573. (currentScanMode == WIFI_SCAN_ST) ||
  574. (currentScanMode == WIFI_SCAN_DEAUTH) ||
  575. (currentScanMode == WIFI_SCAN_ALL))
  576. {
  577. if (currentTime - initTime >= 1000)
  578. {
  579. initTime = millis();
  580. channelHop();
  581. }
  582. }
  583. else if ((currentScanMode == WIFI_ATTACK_BEACON_SPAM))
  584. {
  585. // Need this for loop because getTouch causes ~10ms delay
  586. // which makes beacon spam less effective
  587. for (int i = 0; i < 55; i++)
  588. broadcastRandomSSID(currentTime);
  589. if (currentTime - initTime >= 1000)
  590. {
  591. initTime = millis();
  592. //Serial.print("packets/sec: ");
  593. //Serial.println(packets_sent);
  594. String displayString = "";
  595. String displayString2 = "";
  596. displayString.concat("packets/sec: ");
  597. displayString.concat(packets_sent);
  598. for (int x = 0; x < STANDARD_FONT_CHAR_LIMIT; x++)
  599. displayString2.concat(" ");
  600. display_obj.showCenterText(displayString2, 160);
  601. display_obj.showCenterText(displayString, 160);
  602. packets_sent = 0;
  603. }
  604. }
  605. else if ((currentScanMode == WIFI_ATTACK_RICK_ROLL))
  606. {
  607. // Need this for loop because getTouch causes ~10ms delay
  608. // which makes beacon spam less effective
  609. for (int i = 0; i < 7; i++)
  610. {
  611. for (int x = 0; x < (sizeof(rick_roll)/sizeof(char *)); x++)
  612. {
  613. broadcastSetSSID(currentTime, rick_roll[x]);
  614. }
  615. }
  616. if (currentTime - initTime >= 1000)
  617. {
  618. initTime = millis();
  619. //Serial.print("packets/sec: ");
  620. //Serial.println(packets_sent);
  621. String displayString = "";
  622. String displayString2 = "";
  623. displayString.concat("packets/sec: ");
  624. displayString.concat(packets_sent);
  625. for (int x = 0; x < STANDARD_FONT_CHAR_LIMIT; x++)
  626. displayString2.concat(" ");
  627. display_obj.showCenterText(displayString2, 160);
  628. display_obj.showCenterText(displayString, 160);
  629. packets_sent = 0;
  630. }
  631. }
  632. }