фейк wi-fi сеть для ретрансляции антивоенных лозунгов
Бункер радикалаВ этой статье я расскажу о том как сделать устройство с помощью которого можно ретранслировать антивоенные лозунги и позиции .Материалы были присланы и проверены подписчиком .
как сообщает сам подписчик : "Я вот кстати вообще ни разу не айти, не инженер, взялся за Arduino, ничего не понял. Зато когда захотел сделать что-то конкретное, то сделал. Просто сидел вечерами и читал разные примеры реальных проектов, кодов каких-то.
Начал с проекта для диссера, запилил устройство которое с датчиков данные записывает. Потом помню сделал устройство которое анализирует загрязнение воздуха и пишет координату места. Потом я это на дрон прицепил, хотел строить карты загрязнения воздуха. Самое последнее, что я делал это фэйковую Wi-Fi сеть, которая транслирует антивоенные лозунги. Сделал одно носимое устройство, еще несколько спрятал в тройники и раскидал по ТЦ."
Так что с задачей научится и с нуля освоить это устройство способен каждый в ком есть это желание
Я бы хотел поделиться устройством на ESP8266, конкретно я использовал модель WeMos D1 CH340
(https://sl.aliexpress.ru/p?key=Yuuqtqf). Устройство довольно незамысловатое и позволяет по встроенному Wi-Fi передать на смартфон сообщение, например с антивоенным лозунгом.
Все очень просто, мы запустим сервер на этой малютке и будем использовать captive portal, своеобразную заглушку, которую вы могли видеть при регистрации в публичной Wi-Fi сети. Попробуем передать в качестве примера простое антивоенное сообщение, но вы можете быть более изобретательны, использовать html верстку. Только помните, что ESP8266 не особо мощный чип и проще использовать что-то не очень емкое.
Паять ничего не нужно, для начала мы просто подключим плату WeMos D1 CH340 к компьютеру и проверим, что она действительно работает, определяется как устройство, а на самой плате мигает светодиод.
Далее нам нужно как-то записать на плату код, который как раз будет выводить нам лозунг через captive portal. Для начала вам стоит зайти на сайт Arduino (https://www.arduino.cc/en/software) в раздел "Software" и скачать оттуда установщик Arduino IDE, допустим "Win 10 and newer, 64 bits". Установите программу на компьютер и запустите ее. Программа предложит установить драйвер для USB — соглагайтесь. Далее переподключите плату.
В программе зайдите в меню Board Manager (вкладка слева вверху) и в поле поиска введите "ESP8266" и нажмите кнопку "INSTALL" дождитесь пока в меню слева, в верху появиться надпись "INSTALLED" напротив наименования платы (более подробная инструкция по работе в Board manager: https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-board-manager).
Скачайте код (файл в приложениях) и откройте в программе, через меню "открыть с помощью" или через меню программы File>Open file. Откроется код. Обратите внимания на строки 1-5:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <DNSServer.h>
#include <ESP8266mDNS.h>
В скобках "<>" находятся названия библиотек, которые нужно загрузить.
В левом меню, ниже вкладки "Board manager" найдите вкладку "Library manager" и так же как в случае с "Board manager" через поле поиска найдите нужную библиотеку и устноовите ее, повторите это для всего списка библиотек (более подробная информация: https://docs.arduino.cc/software/ide-v2/tutorials/ide-v2-installing-a-library).
После установки всех библиотек вы сможете проверить код на ошибки, нажав кнопку "VERIFY" расположенную рядом с полем поиска слева вверху.
В терминале снизу должна появиться надпись "SUCCESSFULL COMPILATION". Это значит, что ошибок в коде нет и можно загрузить его на плату.
Нажмите "UPLOAD" и дождитесь пока появятся надпись "SUCCESSFULL UPLOAD".
Если в терминале вы увидели ошибку, то скорее всего проблема в библиотеках, возможно какие-то из них не установились и нужна замена. Если терминал ссылается на проблему подключения платы, то значит порт выбран неверно или драйвер USB установлен неверно.
Проверьте порт через меню Tools>Port>COM/USB:Название вашей платы>.
Если код был успешно загружен на плату, то можно отсоеденить ее от USB, лучше сделать это через безопасное отключение USB устройства.
Обратите внимание также на строку 8:
#define SSID "MT_FREE"
— это желаемое название сети.
Строки 69-71 это наше сообщение, ниже оно показано как "test" (но в коде приведен пример сообщения):
"<html><head></head><body>"
"<h1>test</h1>");
p += F("</body></html>");
— обратите внимания, что все символы кроме "test" это html код, если вы не разбирсетесь в html, то замените только "test".
Помните, что плата без корпуса, старайтесь не замыкать контакты и держать плату в сухом месте.
Проверьте работу платы подключив ее к пауэр банку или USB заряднику от смартфона. Подключитесь к сети, на экране должно появиться всплывающее окно captive portal с вашим сообщением.
Осталось найти корпус и блок питания нужного размера, чтобы спрятать устройство. Если же вы хотите носить устройство с собой, то можно обернуть его в кусок плёнки, затем обмотать изолентой, оставив прорезь для подключения USB.
Ниже будет готовый код, так называемый скетч для Arduino IDE в формате *.ino.
Так как я нахожусь сейчас не в РФ, а в Германии, в лагере беженцев, то фотоматериала будет не так много. Устройство по понятным причинам я не стал брать с собой. Также внезапно за время моего отсутствия у Arduino вышла версия IDE 2.0 и она отличается от первой, более похожа на Web IDE от Arduino которой я обычно пользуюсь. Я взял за основу версию 2.0, чтобы у вас не было проблем с загрузкой ядра и библиотек, так как я не могу проверить сейчас корректность работы старой версии IDE.
При возникновении проблем вы можете прочитать ошибки в терминале, зайти в справочник Arduino IDE или поискать ответ в google или сразу на reddit. Справочник по Arduino IDE: https://docs.arduino.cc/software/ide-v2.
Так же в случае вопросов вы можете связаться со мной: @cursemebot.
Я не особо разбиоаюсь в Arduino и не связан с IT. Я буду очень благодарен, если кто-то проверит этот гайд на Arduino IDE 2.X или поправит меня в случае чего.
Хотя я пытался сделать инструкцию наиболее понятной, работа с Arduino иногда предполагает какую-то базу знаний перед началом работы. Возможно перед началом работы вам стоит прочитать гайды для новичков на arduino.cc и написать к примеру пресловутую программу Blink. Хотя я почему-то уверен, что большинство людей которые возьмутся за проект освоят его даже без подготовки.
Теперь к корпусу. Я предлагаю использовать тройник/четверник и тогда возможно все-таки придётся паять. Для создания скрытного корпуса необходимо разобрать тройник, сделать это нужно разумеется в отключенном от сети случае. Найдите тройник максимально большой, так чтобы в нем было много пустого места (пример на фото ниже). Купите дешёвое зарядное устройство, самое маленькое из возможных (фото ниже), разберите его, извлеките плату и изолируйте скотчем, но так чтобы зарядное устройство поместилось внутрь тройника. Контакты зарядного устройства нужно припаять к контактам одной из розеток или к вилке. Все контакты должны быть изолировпаны скотчем или термоусадкой. Поместите внутрь тройника плату, также изолировав ее. Последний штрих это USB кабель, он должен быть коротким, чтобы опять же влезть внутрь тройника. Когда вы все разместите и проверите, то можно будет собрать тройник обратно и проверить работоспособность устройства. Тройник предполагается размещать в ТЦ, там много розеток, устройство будет постоянно перемещаться, так как его скорее всего заберет завхоз иди кто-то другой из персонала со временем. Но они никогда не догадаются, что именно из вашего устройства идёт передача данных. Но на всякий случай попытайтесь не оставлять свои пальцы, особенно если они есть в картотеке МВД или еще где.
На самом деле это далеко не единственный способ скрытого размещения устройства, проявите фантазию, у меня на это не было особо времени.
Мое носимое устройство было снабжено блоком питания в формате так назывемого shild-а и батареей, а также корпусом напечатаном на 3D принтере. Но все это совершенно не обязательно.
Далее на скриншоте и фото можно видеть, что это обычная Wi-Fi сеть. Причём сеть можно поймать даже через 3 стены в панельном доме, что довольно хороший показатель.
И последние фото это тройники и дешевый блок питания малого размера.
Мне очень жаль, что у меня нет с собой фотографий процесса сборки вариантов данного устройства, но я надеюсь что вы проявите фантазию и изобретательность.
Инструкция для чайников
И собственно сам обещанный код.
#include <ESP8266WiFi.h> #include <WiFiClient.h> #include <ESP8266WebServer.h> #include <DNSServer.h> #include <ESP8266mDNS.h> #ifndef SSID #define SSID "MT_FREE" #endif const char *softAP_ssid = SSID; // The access points IP address and net mask // It uses the default Google DNS IP address 8.8.8.8 to capture all // Android dns requests IPAddress apIP(8, 8, 8, 8); IPAddress netMsk(255, 255, 255, 0); // DNS server const byte DNS_PORT = 53; DNSServer dnsServer; // Web server ESP8266WebServer server(80); // check if this string is an IP address boolean isIp(String str) { for (size_t i = 0; i < str.length(); i++) { int c = str.charAt(i); if (c != '.' && (c < '0' || c > '9')) { return false; } } return true; } String toStringIp(IPAddress ip) { String res = ""; for (int i = 0; i < 3; i++) { res += String((ip >> (8 * i)) & 0xFF) + "."; } res += String(((ip >> 8 * 3)) & 0xFF); return res; } // checks if the request is for the controllers IP, if not we redirect automatically to the // captive portal boolean captivePortal() { if (!isIp(server.hostHeader())) { Serial.println("Request redirected to captive portal"); server.sendHeader("Location", String("http://") + toStringIp(server.client().localIP()), true); server.send(302, "text/plain", ""); server.client().stop(); return true; } return false; } void handleRoot() { if (captivePortal()) { return; } server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server.sendHeader("Pragma", "no-cache"); server.sendHeader("Expires", "-1"); String p; p += F( "<html><head></head><body>" "<h1>Становитесь частью антивоенного движения, выступайте против войны. Сделайте это хотя бы для того, чтобы показать всему миру, что в России были, есть и будут люди, которые не примут подлости, творимой властями, превратившими само государство и народы России в орудие своих преступлений.</h1>"); p += F("</body></html>"); server.send(200, "text/html", p); } void handleNotFound() { if (captivePortal()) { return; } String message = F("File Not Found\n\n"); message += F("URI: "); message += server.uri(); message += F("\nMethod: "); message += (server.method() == HTTP_GET) ? "GET" : "POST"; message += F("\nArguments: "); message += server.args(); message += F("\n"); for (uint8_t i = 0; i < server.args(); i++) { message += String(F(" ")) + server.argName(i) + F(": ") + server.arg(i) + F("\n"); } server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate"); server.sendHeader("Pragma", "no-cache"); server.sendHeader("Expires", "-1"); server.send(404, "text/plain", message); } void setup() { delay(1000); Serial.begin(9600); Serial.println(); Serial.println("Configuring access point..."); WiFi.softAPConfig(apIP, apIP, netMsk); // its an open WLAN access point without a password parameter WiFi.softAP(softAP_ssid); delay(1000); Serial.print("AP IP address: "); Serial.println(WiFi.softAPIP()); /* Setup the DNS server redirecting all the domains to the apIP */ dnsServer.setErrorReplyCode(DNSReplyCode::NoError); dnsServer.start(DNS_PORT, "*", apIP); /* Setup the web server */ server.on("/", handleRoot); server.on("/generate_204", handleRoot); server.onNotFound(handleNotFound); server.begin(); // Web server start Serial.println("HTTP server started"); } void loop() { // put your main code here, to run repeatedly: //DNS dnsServer.processNextRequest(); //HTTP server.handleClient(); }