Маленькая USB пакость

Вот представьте себе вы тихо-мирно набираете текст на компьютере. Постепенно начинаете замечать, что периодически на клавиатуре начинают нажиматься случайные буквы. Сначала это не особо напрягает, но через некоторое время начинает очень злить :-) Вы меняете клавиатуру на другую, но проблема не исчезает. Проверяете компьютер всеми возможными антивирусами но все усилия ни к чему не приводят и проблема не решается. В конце концов переустановка операционной системы. Но и после этого ничего не изменяется. Через некоторое время вы обнаруживаете подозрительную «флешку»

А флешка эта ни какая на самом деле не флешка! А эмулятор usb клавиатуры. Суть его работы такова. Эмулятор представляется компьютеру  как обычная usb клавиатура и через случайные промежутки времени нажимает случайные буквы клавиатуры. Эмулятор не требует ни каких драйверов (они уже есть в системе) и ни какой настройки. Достаточно просто воткнуть его во вражеский компьютер и смотреть на мучения жертвы :-) Конечно флешка довольно таки заметна, но подозрений вызвать по идее не должна. Так же этот эмулятор легко вычислить если открыть диспетчер устройств и просмотреть список подключенных клавиатур. Наш эмулятор там обязательно засветится.  Схема девайса особой сложностью не отличается:

Следует обратить внимание на то, что на плате и на схеме отведен проводок от  PC0. Естественно возникает вопрос для чего это нужно. А нужно это для инициализации генератора случайных чисел. По идее есть функция random() которая возвращает случайное число, но она нам не совсем подходит. Дело в том, что функция делает свое дело, но последовательность генерируемых случайных чисел будет каждый раз одинаковая. Чтоб хоть как-то ее изменить нужно перед вызовом функции random, вызвать srandom и передать ей какое либо случайное число. Для генерации такого случайного числа я решил использовать . . . АЦП! В двух младших битах регистра данных ацп как правило всегда находится всякий случайный мусор. Вот этот мусор как раз и использует моя функция GetRndDigit(). Она 8 раз считывает младший бит ацп и запихивает бит за битом в переменную. У функции есть один недостаток. Что бы получать качественные случайные числа, нужно перед считыванием в очередной раз первого бита ацп, делать задержку. В результате функция исполняется слишком продолжительное время. Именно поэтому она вызывается только один раз чтоб инициализировать генератор случайных чисел. Проводок на плате от пина PC0 нужен чтоб лучше ловить наводки и тем самым улучшить генерацию случайных чисел. Я использовал микроконтроллер в корпусе TQFP-32 исключительно для миниатюрности. Можно без проблем воткнуть и в DIP корпусе главное помнить, что нумерация выводов другая! Для создания этого девайса была принесена в жертву флешка JetFlash на 128 мегабайт. Платка у меня получилась вот такой:

Ни каких настроек девайс не требует. Достаточно просто прошить контроллер и запаять детальки. Нужно только не забыть выставить фьюзы микроконтроллера на тактирование от кварцевого резонатора. Можно доработать устройство, приделать к нему пару кнопок и сделать так чтоб при нажатии печатались целые фразы. Ну или еще что-нибудь придумать ведь исходники есть. Кстати об исходниках. Данная разработка основана на коде компании Objective Development. Я просто немного допилил схему и программу.
Файлы проекта
P.S. на фотке плата с не большой ошибкой. схема и печатка в файле — правильные

Маленькая USB пакость: 73 комментария

  1. Чем больше интересуюсь, тем больше убеждаюсь, какая же на самом деле жесть этот USB. Казалось бы, всего-то передать несколько байт скан-кода клавиши, а сколько исходного кода для этого нужно, аж страшно становится. Да и хекс на 8 кб — это тоже очень нехило. А так хочется делать девайсы, которые бы по usb с компом работали без всяких драйверов виртуального com-порта.
    Это так, на рассуждения потянуло после вкуривания исходников и 650 страниц спецификации usb.

    1. Вообще есть дофига книг про USB. В том числе и для чайников вроде меня =)
      Вот буду посвободней может займусь изучением. Как раскурю немного может выложу все это на своем сайте с примерами и подробным описанием на доступном языке

  2. А можно ссылочку на дофига книг про USB? Ну или хотя бы подсказку, где искать? Я чё-то ничего не нашел простого, а официальная спецификация это убийство. Причем, проблема даже не в том, что она большая, а в том, что она бессвязная. Всё описывается по-отдельности, и нету ни одного цельного рабочего примера.

  3. Вопрос намбер ван :
    1) А как мне надо извратится для того что бы запрограмить TQFP ? Как ты это делал? Мне просто как то в западло делать ещё одну плату для програмирования.

    2) Зачем тебе капча? Бееее

    1. 1) Смотри у меня на платке есть контактные площадки. Вот я к ним подпаивался и шил. Кстати тут в схемке косяк был. но я уже подправил. там два стабилитрона на одну линию данных юсб были припаяны. щас пофиксил уже.

      2) Капча вынужденная мера. Спамеры озверели льют тонны говна в комменты. просто уже устал чистить. кстати если ты зарегистрируешься то она исчезнет.

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

  4. У меня вопрос возник, флешка полностью эмулирует клавиатуру? Те на нее не нужны никакие драйвера, кроме стандартных виндовских на usb клаву и она работает в BIOS’е?

      1. а можно и для меня фьюзы в Code Vision AVR.? а то по http://zalil.ru/32692139 уже нету того файла… я уже в панике чуть не залочил МК, тыкаю эти биты и поштучно и проверяю, не определилась ли клавиатура… один раз както написало «тыры пыры майкрософт кейбоард» и все …(

          1. спасибо, но не помогло. я тут еще вычитал на одном форуме по самодельным ЮСБ устройствам, что стабилитроны нужны именно на 3,6V (на 3,3V, особенно низкоскоростные, могут давать ошибки). а 1N4728A, вроде как на 3.3В… И резистор на 1.5кОма — это в случае питание МК от 3.3 вольта, а если питание 5В, то этот резистор нужно ставить 2.2кОм . Завтра пойду раздобуду деталей, буду эксперементировать дальше.

            1. все, заработало!!!!! поменял стабилитроны на 3.6 Вольтовые — сразу отределилась!
              иногда очень быстро отсылает коды клавиш( палевно… ну то ладно, надо испытать на практике))))

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

  6. Если я б знал вобще хоть что то в програмировании мк!Так, есть знание по делфи и больше ничего.Мк начал заниматься месяца три назад.Сначала попробывал pic, сделал Ехтrа pic, работает отлично, а недавно решил попробывать Avr.Сделал Аvr 910 но прошил прошивкой от stk 500.Скорость good!Мечтаю научится програмировать мк, но нет времени, студент.

    1. Идея хорошая, мне она давно в голову пришла.
      У нас на работе для доступа в комнаты используются карточки бесконтактной идентификации, и у меня она конечно же есть. Вот хочу сделать девас который будет разблокировать компьютер при поднесении этой карточки к нему. А пароль будет вводится при помощи вот этой самой штуковины!

  7. Ребят, разбираюсь с usb и для начала хочу флешку переделать в клавиатуру, работаю в CodeVisionAVR… Подскажите, под какую среду адаптирован данный код??? Будет не сложно же прицепить к схеме кнопку(+написать код), и при нажатии на нее, допустим на компе будет печататься некая буква???

    1. Надо переключить фьюзы на тактирование от внешного кварца. И самой собой поставить правильный кварц который указан на схеме. Иначе ничего работать не будет 100% Как переключить фьюзы можно погуглить.

  8. Я так понял, что нужно поставить галочку на CKOPT для синхроницации с внешним кварцем… Поставил, прошил, результата нет…
    CKOPT — бит, определяющий режим работы встроенного генератора тактовой частоты для работы с кварцевыми резонаторами. Реально изменяет коэффициент усиления встроенного инвертора в схеме генератора и значит выходное напряжение на ножке XTAL2. Ошибочная установка может приводить к неустойчивому запуску кварцевого генератора, вплоть до возбуждения его не на той гармонике, что надо (из-за этого бита кварц запускался или только при питании МК напряжением не выше 3,6В, или только после прикосновения к выводу XTAL1 пинцетом)

Добавить комментарий