Badusb arduino nano

BadUSB устройство на базе arduino leonardo

12 августа, 2019

Для реализации примера нам понадобится:

Arduino на микроконтроллере atmega 32u4: http://ali.pub/3ncdj8

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

В этой статье я попробую рассказать о том как можно навредить вашему компьютеру через usb порт. Данный тип атаки на компьютер частенько используют хакеры и называется он Badusb.

BadUSB — класс хакерских атак, основанный на уязвимости USB устройств. Благодаря отсутствию защиты от перепрошивки в некоторых USB-устройствах, злоумышленник может видоизменить или полностью заменить оригинальную прошивку и заставить устройство имитировать любое другое устройство. BadUSB предназначен для доставки и исполнения вредоносного кода.

Так как микроконтроллер Atmega32u4 умеет работать как hit устройство (клавиатура или мышь) то можно написать код для имитации нажатия клавиш. Мы делали что-то подобное в статье когда использовали arduino leonardo и rfid метки для авторизации на компьютере. Тогда мы прикладывали авторизационную карточку и у нас вводился пароль от компьютера, как аз он вводился “имитацией нажатия клавиш” . Ссылка на статью тут.

И так, первый пример который я Вам покажу очень простой, мы сделаем так, что когда устройство подключим к компьютеру по usb, он у нас выключится. Назовем скетч “poweroff” Он выглядит следующим образом:

Данная программа при подключении к компьютеру вызывает командную строку и вводит команду “shutdown -s -f -t 0”, что приводит к выключению компьютера. Но есть одно но программа все корректно введет, если будет стоять английская раскладка клавиатуры. Существует несколько вариантов обхода данного неудобства, но пока я не буду Вам о них рассказывать, хватит для первого раза и этого. Данный скетч можно скачать по ссылке: https://yadi.sk/d/vha87lq2gB3nmQ

Еще есть вариант для поиграться, это вариант от AlexGyver он там делает из такого устройства имитацию разных нажатий и это будет очень раздражать. Ссылка.

С простыми примерами разобрались, теперь давайте немного усложним, а именно при подключении устройства к компьютеру устройство скачает архив с удаленного сервера, разархивирует из него два .bat файла, и запустит один из них. Тот .bat файл который мы запустим копирует второй файл в автозагрузку. BAT файл который мы отправим в автозагрузку будет при каждом включении компьютера создавать на рабочем столе текстовый файл с сообщением test. Естественно вы можете заменить .bat файлы на свои и сделать что-то другое, я лишь расскажу о способе доставки скриптов на Ваш компьютер для того чтоб Вы не допустили такого с Вашим ПК.

Итак скетч выглядит следующим образом:

На этом пока все, если тема интересна, то пишите предложения в комментариях или в комментариях под видео.

Видео с демонстрацией работы:

Источник

Русские Блоги

Используйте arduino, чтобы сделать BadUSB

BadUSB

BadUSB — это уязвимость USB, обнаруженная Арстеном Нолом и Якобом Леллом и объявленная на конференции по безопасности BlackHat в 2014 году. На заре появления вирусов на U-диске небольшой скрипт autorun.inf хранился на обычном U-диске, который мог автоматически запускать программы для автоматического запуска определенных программ для достижения эффекта вторжения троянского коня или вирусной атаки, но время все же продвигается. Такой простой метод атаки, естественно, легко обнаружить и уничтожить с помощью различного антипрограммного обеспечения и встроенной системы защиты системы. Позже Microsoft также обнаружила эту уязвимость в системе безопасности, поэтому последующие версии системы Windows также по умолчанию отключены. , Так что этот метод атаки стал очень безвкусным, поэтому появилась еще одна идея USB-атаки. Часто в микросхеме USB-устройства есть флэш-память, отвечающая за хранение данных. Ее функция похожа на жесткий диск на нашем компьютере. Часть этой флэш-памяти будет зарезервирована для хранения прошивки устройства, и новая идея здесь состоит в том, чтобы напрямую внедрить вредоносный код в прошивку, чтобы он не был обнаружен антипрограммным обеспечением и не был уничтожен. Практическое воплощение — BadUSB.

Есть две ранние реализации BadUSB:
USB RUBBER DUCKY

USB Rubber Duck для краткости — это самый ранний инструмент для инъекций кнопок, реализованный через встроенную плату для разработки, а затем разработанный в полностью зрелую коммерческую платформу для атак путем инъекций кнопок. Его принцип также состоит в том, чтобы имитировать USB-устройство как клавиатуру, позволить компьютеру распознать его как клавиатуру, а затем выполнить сценарий для имитации нажатия клавиши для атаки.Теперь он стал коммерческим продуктом.

TEENSY

Позже настала моя очередь быть самой милой ардуино. По сравнению с USB RUBBER DUCKY, она дешевле и универсальнее. По сравнению с TEENSY, она с открытым исходным кодом.

Первое, что нужно объяснить, это то, что, поскольку основной метод реализации BadUSB заключается в установке платы разработки Arduino в качестве устройства клавиатуры для управления устройством-жертвой, вам следует выбрать плату для разработки, которая поддерживает прямую связь USB. Не используйте arduino nano или тому подобное. Последовательный порт преобразуется в отладочную плату USB через преобразовательный чип, такой как CH340G. Во-первых, отладочная плата, которая использует эти преобразовательные чипы, должна установить драйвер, который будет распознан на новом устройстве (вы никогда не можете ожидать этого, когда вы проникнете на компьютер жертвы. Жертва сам устанавливает драйвер и подставляет себя.) После второго заголовочный файл, который мы будем использовать, поддерживает только отладочную плату с возможностью прямой связи USB.

Итак, я использовал здесь микроплату для разработки Arduino. Во-первых, она достаточно мала. Во-вторых, поскольку он использует ATmega32U4 в качестве основного чипа, он напрямую поддерживает связь по USB. Для получения подробной информации, пожалуйста, проверьте руководство по чипу ATmega32U4 в Интернете.
Здесь я положил три платы разработки, средняя и одна в сумке — это необходимые нам микроплаты для разработки, а та, к которой подключен кабель DuPont, — это плата разработки Arduino Nano, эти две платы для разработки. Хотя внешний вид выглядит очень похожим, разница довольно велика.Во-первых, интерфейс USB, используемый Arduino Nano, — это старый интерфейс Mini USB, который является одним из зарядных кабелей ранних старых мобильных телефонов, в то время как Micro использует mirco USB, обычно используемый для устройств Android. Для линии передачи данных интерфейса чип, используемый nano, обычно ATmega328P или ATmega168. Эти два чипа не поддерживают прямую связь USB. Необходимо преобразовать последовательный порт в USB, о чем я только что упомянул, в то время как micro использует чип ATmega32U4. , Он поддерживает прямую связь USB, но цена 32U4 немного дороже, чем 328P и 168, поэтому плата разработки, естественно, немного дороже, кроме того, самая большая разница во внешнем виде между ними заключается в том, что nano больше, чем micro Довольно много, nano в принципе невозможно установить в оболочку U-диска и его можно идеально замаскировать.
Стоимость моей единственной платы для разработки составляет около 17 юаней. Бесплатная доставка. Если вам нужно много, но вы считаете, что розничная цена слишком высока, вы можете подумать о покупке микросхемы ATmega32U4 и самостоятельной покупке микроплаты для Arduino. , Он полностью с открытым исходным кодом (да здравствует открытый исходный код), вы можете скачать принципиальную схему и схему печатной платы прямо с официального сайта, скопировать плату, а затем записать в нее загрузчик.
официальный веб-сайт arduino micro:
Arduino Mirco

Обратите внимание, что официальный сайт только в формате Eagle, а не в формате AD.

После завершения работы с аппаратным обеспечением пора поговорить о среде разработки программного обеспечения. В среде разработки, естественно, используется IDE Arduino. Вы можете загрузить необходимую версию прямо с официального сайта. Я использую версию для Linux здесь.
Я хочу объяснить, что после загрузки сжатого пакета tar.gz под Linux просто откройте arduino и напишите код после распаковки. Не используйте install.sh для ненужной установки, а я использую install.sh под kali После установки обнаруживается, что программа не может быть загружена в обычном режиме и плата разработки не может быть распознана. Ее необходимо сбросить.

После открытия IDE, если с платой для разработки нет проблем, в столбце tool =》 port будет флажок для / dev / ttyACM0 (Arduino Micro) (COMx (Arduino Micro) под окнами), отметьте его, как и раньше Если есть проблема с подключением отладочной платы или отладочная плата не подключена, есть только / dev / ttyS0 (COM1, COM2 под окнами), и столбец отладочной платы будет выбран как arduino micro по умолчанию. Если он не выбран, выберите его самостоятельно
Затем вы можете начать писать код
Здесь я просто пишу код, который запускается под окнами и запускает команду tree после открытия окна cmd

На самом деле функция настройки — это функция, которая запускается только один раз после загрузки устройства. Вы можете инициализировать требуемые глобальные переменные в этой функции. Функция цикла — это функция, которая будет продолжать выполняться в цикле после загрузки устройства.
Функция в файле заголовка keyboard.h — это файл заголовка, который нам нужен для взаимодействия с клавиатурой. Он может быть скомпилирован только на плате разработки, которая поддерживает связь по USB. Если это nano или что-то подобное При компиляции на платах разработки, которые не поддерживают напрямую USB-соединение, будет сообщено об ошибке.
Будет такая ошибка, которая явно включает файл заголовка keyboard.h, но по-прежнему предлагает, чтобы он не был включен

После того, как программа скомпилирована и успешно загружена, код успешно выполняется при вставке в USB-порт системы Windows, но после повторной проверки обнаруживается, что драйвер не распознается в старой системе win7, и все win10 распознаются и распознаются как устройство клавиатуры. Однако теперь win7 в основном находится в коммерческой среде. Если вас исключат, эта проблема пока будет проигнорирована. Кроме того, если вы хотите замаскировать плату разработки непосредственно под USB-накопитель, вы можете купить адаптеры OTG на Taobao. Обратите внимание, что интерфейс на плате разработки женский, поэтому На преобразовательной головке OTG есть два штыревых разъема, один штыревой разъем вставлен в гнездовой разъем платы разработки, а другой штыревой соединитель открыт для компьютера.
Например:
В этом случае вы также можете купить штекерный разъем USB и использовать электрический паяльник для самостоятельного изготовления, точно так же, как тот, который я использую на плате разработки Nano. Обратите внимание, что вам нужно купить интерфейс micro USB.

Источник

smdll/bad_usb

Use Git or checkout with SVN using the web URL.

Work fast with our official CLI. Learn more.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

README.md

A bad usb device which uses an AtTiny85 to emulate a HID keyboard, run some powershell code to gain reversed TCP shell.

This project is only for study purposes, DO NOT USE IT AGAINST THE LAW. I don’t take any responsibility for abused use.

  1. A chip with USB port and AtTiny85 on it, DigiSpark made this kind of things and work well.
  2. Arduino IDE with DigiSpark AVR add-on installed.
  3. A target computer(you can use your own one).
  4. A server which had python and flask preinstalled.
  1. Open the bad_usb.ino file with Arduino IDE, change the IP address to your server.
  2. Flash it into your chip.
  3. Run the bad_server.py on your computer, or deploy it to your server.
  4. Plug your chip into target computer.
  5. Open http://yourserver:80/index to gain a reversed TCP shell, where yourserver is localhost if you run it locally.

1. What if I don’t have a chip?

Well. GO AND BUY ONE OR MAKE YOUR OWN ONE! You’ll find it quite cheap on online shop. It’s also very easy to build one.

2. Okay, I have one but I can’t flash the program. What happened?

That’s because you haven’t got the right driver installed.

3. Riiiiiight. I don’t have Python environment, what now?

Источник

Статья Bad Usb или как я уток разводил, Практическое пособие по Rubber Duck

Решил я как-то хозяйство дома завести, благо земли хватает вдоволь. Выбор остановил на утках. Знающие люди сказали, что от них куда больше пользы, чем от кур да и вкуснее они. Началось с того (как это частенько бывает), что узнал я про этих уток не из новостных лент, я практически от первоисточника, а точнее всеми любимого DEFCON-а. Заинтересовало меня их послание, хотя, если честно, не скажу, что я да и другие разработчики не догадывались об этом раньше, но ребята потрудились на славу и выдали миру весьма полезную информацию, касаемо этих самых уток и дали им звучное имя Rubber Duck. Как Вы догадались, эта порода уток ни что иное, как Bad Usb.

Первый блин комом

Как водится у хорошего хозяина, не все сразу ладится, так как первый опыт разведения этой породы мерзо-уток по сути ничем хорошим не увенчался, трудности возникли уже на первом этапе, когда я заглянул в список, предлагаемых авторами проекта уязвимых девайсов, который в основном состоял из (нифига не дешевых на тот момент) USB 3.0 флэшек и тем паче еще и с довольно большим объемом памяти. Выложить ради сомнительных экспериментов пару косарей — перспектива, как мне тогда виделось, ничуть не радужная, но, чем не пожертвуешь ради науки. С горем пополам мне таки удалось найти необходимый девайс, потратив около (недели!!) на поиски. Вооружившись ноутбуком, распечатками ворованной спецификации на Phison 2251-03 и, собственно, самой уткой, я приступил к экспериментам. Ни одна банка Adrenaline была выпита, ни одна сигарета скурена, в итоге родилось устройство и оно заработало, не ахти как, если честно. Ожидаемые результаты сильно разнились с радужными предположениями, приходящими ко мне в красочных снах. Устройство было капризным, глючным, работало не всегда и не с первого раза, в связи с чем идея продолжения показалась мне утопической и была заброшена в «долгий ящик».

Новая порода уток

И вот настала эра Teensy. Этот проект появился значительно позже, но в силу специфичности контроллера обещал быть куда более перспективным, чем колдунства с флэшками. Приобрел Teensy 3, и первым, что залил в него (кстати совсем без танцев с бубнами) через обычный Arduino IDE + модуль поддержки Teensy (следует заметить, что корректно устанавливался он только с версией IDE 1.8.0) со всеми остальными драйвера наотрез отказывались искать исполняемый файл иде-шки, был скетч открывающий сессию meterpreter на атакуемой машине на Windows. Контроллер мне понравился- работал шустро, бойко и безглючно. Единственной сложностью казался злополучный разъем Micro USB который я решил заменить на обычный. В итоге родилось вот что:

Teensy 3.1 в утиной шкуре

Сам скетч значительно отличался от тех детский писулек, которые представляли из себя rubber dack скрипты, написанные по принципу «подойди к окну, два раза подпрыгни, повернись налево..). Собственно вот сам скетч. KernelEquinox/Teensyterpreter

Здесь нам достаточно просто вставить значения своего IP адреса и порта в HEX формате (в тексте кода это прокоментировано) и собственно можно сразу использовать. Работает четко и очень быстро. Тут вообщем пояснения излишни, девайс откроет шелл meterpreter reverse tcp открыли метасплоит и ждем «клиента». Единственный (как мне казалось на тот момент) минус девайса в том, что он нифига не persistence и после перезагрузки с долгожданной сессией можно распрощаться. Ну да фиг с ним. Не успел я толком наиграться с Teensy-уткой, как на птичий рынок повалили новые и доселе незведданные зверюшки всех парод и мастей заграничных.

Глаза разбегались от такого ассортимента, но я остановил свой выбор на этот раз на Arduino pro micro (некое подобие Leonardo, но куда более миниатюрное) на очень интересном контроллере ATMEGA 32U4. Его спецификация прямо скаже внушала доверие. 16Мгц процессорной шустрости, 32 КБ памяти для программулек и, самая важная вишенка на торте- наличие на борту полноценного порта USB. То есть не того жалкого подобия, которым оснащены отладочные платы других ардуинок, которые являются ни чем иным, как просто входом UART программатора для прошивки, а именно полноценным портом со всеми вытекающими. Я купил два вот таких зверька-

Две вариации ARDUINO PRO Micro

и счастливый поехал эксперементировать. Вот тут моя радость была несколько омрачена очередными танцами с бубном. Так система определяет подключенное устройство по команде lsusb

В очередной раз порадовал Linux -вообще никаких заморочек с установкой дров. Теперь о бубнах и о танцах. Бединушка, собственно в том, что нет на плате кнопки reset так как братья Китайцы, хоть и радуют нас постоянно своими новинками, но все же почему то решили, что плата сама должна отработать команду RESET при прошивке, так вот именно здесь мы и наступаем на первые грабли. Залив любой скетч эмуляции клавиатуры, мы уже заставляем наш девайс вести себя как клавиатура, как только он унюхает 5 вольт питания, и вот здесь начнутся разногласия, при попытке залить новый скетч. То есть -мы заливаем скетч через USB разъем, выбирая созданый платой виртуальный (именно ВИРТУАЛЬНЫЙ!) порт, который она создает, но поскольку в нейт уже залит наш предыдущий скетч, работающий как эмулятор клавиатуры, то соответственно наблюдаем конфликт интересов. Плата наотрез отказывается делиться портом, используемым для выполнения программы с ARDUINO IDE которая хочет заюзать этот же порт под свои (а точнее наши) не менее корымтные цели. Ну вы примерно поняли, о чем идет речь, но это не все траблы, которые скрываются в утиной шкуре. Теперь включаем воображение и пытаемся представить проблемму в общеглобальном масштабе. Мы залили скетч в нашу про-микро, который, например, открывает на VICTIM машине Powershell, выполняя ряд манипуляций с командной строкой и прописывая туда необходимые команды, но мы надумали залить туда скетч новый, скомпилировали в IDE, вставили про-микро в порт и. началась свистопляска под рок-музыку.

Представьте что в процессе ваших манипуляций с новой прошивкой к компу подключили еще одну клавиатуру и какой-то чувак начал клацать на ней свои команды. Теперь суть проблеммы в полной мере?))) Логичен вывод, что для загрузки скетча в нашу утку, нужно нажать reset и тем самым остановить выполнение программы, но тут еще одна проблемма всплывает- когда вы жмете reset (к слову его нужно вывести самостоятельно на кнопку. На плате его нет) то виртуальный порт, который мы уже выбрали в Arduino ide попросту пропадает и ИДЕ-шка начинает материться нехорошими словами , оповещая нас о недоступности порта. Натанцевавшись с бубном вдоволь, нашел таки решение- вставлять утку нужно с зажатой кнопкой резет и отпускать ее перед надписью UPLOAD тогда иде должна подхватить порт девайса.

Но важное замечание — ОЧЕНЬ желательно, чтобы никаких других устройст USB (кроме клавы и мыши) подключено не было, в этом случае ИДЕ автоматом подхватит порт, который появится в списке доступных после подключения про-микро. Ну на этом танцы с бубном, вроде закончились. В ардуино ИДЕ платы PRO Micro не существует, выбирать нужно Leonardo, да собственно и загрузчик китайцы зашили туда леонардовский.

Утята учатся летать

Итак поколение уток вырастил. Доволен всем, примеры скетчей приводить не стал, так как в сети их полно и восновном ничего нового, аж скучно, но вот бесконечные блуждания по глубинам Github вывели меня на спаривание Pro-micro с esp-12 модулем, что позволит управлять нашей уткой по воздуху. Ура-летим!
Что же мы получим в итоге?

Гибрид Arduino pro nicro и ESP8266 (ESP-012) со стороны преобразователя 3.3 в

то-же с торца. Видно спаяные все 3 модуля.

гибрид получился весьма маленький и размером не больше флэшки. После нижеописанных манипуляций с прошивкой, вставляем девайс в комп и наблюдаем следующую картину- esp- ха поднимает точку доступа (ее настройки можно изменить при первом запуске либо в самом коде) подключившись к которой мы заходим на вэб морду пунктом управления уткой.

вэб панель управления уткой

Здесь раздолье для работы. Скрипты можно писать прямо здесь и отдавать команду на запуск. Можно поставить на автозапуск любой из них. Можно их сохранять прямо в память и называть как угодно для удобства. Можно скрипт скачать на комп или телефон а так же закачать на утку с компа или телефона просто методов копи-паста текста кода прямо в окно редактирования. Любой сохраненный скрипт можно отредактировать либо вообще удалить за ненадобностью. Предусмотрен даже терминал UART дляя общения с устройством по принципу двухстороннего монитора порта. Вобщем арсенал внушительным оказался.

словарь с командами под рукой. очень удобно

меню настройки Wifi

UART терминал тоже под рукой с HELP страницей

Но и здесь не все так гладко. Дело в том, что на плате Arduino pro-micro нет вывода питания 3.3 вольта, которое необходимо для ESP-12 (Совсем забыл- использовать нужно именно 12 либо 07 но с объемом флэш памяти 3М иначе на написание скриптов памяти не останется.) Всвязи с чем пришлось ставить малюсенькую платку преобразователя 5V-3.3V и как минимум на 500 мА, так как ESP оказалась весьма «жадной до току» и жрет в режиме работы аж 150 мА временами. В процессе работы вся конструкция греется. Не скажу, что прямо сильно, но греется. На работу никак не влияет (в плохом смысле). Вот собственно сам GitHub этого проекта (замечу, три месяца назад обновился, а обновление можно прошить прямо через вэб морду)

GitHub — SpacehuhnTech/WiFiDuck: Wireless keystroke injection attack platform

В прошивке этих девайсов сложностей нет, за исключением того, что было описано выше насчет бубнов с прошивкой Pro micro. Касаемо ESP , то один нюанс все же есть. Она должна шиться как плата Dstrike ESP8266 но о этих нюансах подробно написано на сайте проекта.

Имя нам — легион!

Казалось-бы о чем еще то мечтать? Получили в распоряжение летающую утку, да еще и ручную! Сделаешь все, что скажет. Но нет же. Нет предела человеческой фантазии и нет границ возможностей. И вот в этом штиле благополучия утиного зародился вообще умопомрачительный проект новой утки, которую автор наградил искуственным интеллектом. Хоть, как предыдущая. летать она не умеет, зато умеет она автоматически определять машину, в которую ее воткнули, точнее систему. установленную на этой машине и в соответствии результатами сканирования выполнять заранее заготовленный код для той или иной системы. Где это может быть полезно для Нас-исследователей и для Них-злоумышленников?

А вот Вам пару примеров. Пришли вы к потенциальной жертве, а у жертвы стоит на компе винда с линуксовой оболочкой либо с маковской (ну знаете, есть такие фичи) Времени разбираться что за система нет. Воткнули по быстрому, утка сама разберется и все сделает. Вот еще пример: Вашу рожу потенциальная жертва узнает и в толпе на площади и вход к нему (ней) в кабинет Вам заказан. Зато Вы нет-нет загуливаете с его секретаршей или (не дай Бог женой) в пьяном угаре, пока Его в командировку отправили. И вы всучиваете утку той самой «жене-секретарше» так как ввиду ее блондинистости она не сможет вам внятно объяснить, какая операционка стоит на Его компе. Да и вообще едва ли научилась выговаривать это слово «операционка».. Суть вобщем ясна. В данном «дефолтном» варианте код практически пустой. Соответствующие команды для выполнения в случае
обнаружения той или иной ОС необходимо дописать вручную по вашему желанию, что они должны будут делать. Краткий гайд по установки из README.

  1. Скачать данный репозиторий — joelsernamoreno/PoC-BadUSB_DetectOS
  2. Распоковать (или клонировать) в рабочую папку Arduino
  3. Папку Keyboard из libraries папки проекта скопировать в папку Libraries рабочей папку Arduino
  4. Папку FingerprintUSBHost так-же скопировать в Libraries рабочей папки Arduino
  5. Открываем скетч PoC-BadUSB_DetectOS.ino в ARDUINO IDE
  6. Выбираем плату Arduino Leonardo и соответствующий порт
  7. Компилируем и загружаем на плату.

В дефолтном виде код просто определяет систему на машине жертвы и открыват текстовй редактор прописывая банальный HELLO WORLD

Но. Заменив этот код своей полезной нагрузкой получаем боевую машину

Красным выделен участок кода, который относится к определенной и именно он выполняется после определения ОС. Соответственно его мы и меняем на свой. Аналогично и с другими операционками.

код скрипта определяющего ОС Windows с исполняемой частью

Утиная ферма растет и развивается, значит мои надежды оправдались. Технологии летят вперед с астрономической скоростью и порой за ними трудно угнаться. Вот и мы с вами стали свидетелями стремительного развития совсем недавно родившегося проекта BADUSB. Единственное, чем хотелось бы дополнить утку последней ревизии- это автоопределение раскладки клавиатуры, но это тема уже была описана ранее и осталось найти время, чтобы скомпоновать все в одно целое.

Источник

Adblock
detector