Если кто не в курсе, это динамический код компании Nice, применяемый в пультах дистанционного управления автоматикой ворот и шлагбаумов. Информации по этой кодировке в открытом доступе мне найти не удалось, скорее всего из-за того, что профит с ее взлома никакой, а сложность высокая. Пару лет назад мне обломилась халява в виде двух пультов этого типа, один пульт был тут же вскрыт, внутри обнаружился контроллер PIC16f526 подключенный по схеме:
CODE
pin 4 /MCLR - RC генератор импульса сброса pin 5 (RC5) - удержание включения питания pin 6 (RC4) - передатчик pin 7 (RC3) - вход кнопки 1-го канала pin 8 (RC2) - вход кнопки 2-го канала pin 9 (RC1) - вход кнопки 3-го канала pin 10 (RC0) - вход кнопки 4-го канала pin 11 (AN2) - делитель напряжения питания
Был подключен осциллограф и срисована времянка. После нажатия кнопки формируется импульс 25.2ms затем пауза 104.8ms и затем передается 5 или более кодовых посылок. Кодовая посылка начинается с импульса 1.48ms и паузы 1.48ms затем 52 информационных бита и заканчивается импульсом 1.48ms, пауза между посылками 19ms. Информационные биты кодируются (условно): 1 - импульс 980us пауза 480us, 0 - импульс 480us пауза 980us. Первые четыре бита соответствуют нажатой кнопке 0001-кнопка 1, 0010-кнопка 2, 0011-нажаты обе кнопки. Если держать кнопку нажатой, следующие четыре бита меняются так: 1100,1111,1110,1001,1000,1011,1010,0101,0100,0111,0110,0001,0000,0011,0010,1101 и далее по кругу. Внимательно посмотрев на эту последовательность я заксорил каждый код на 1101 и получил 1,2,3,4,5,6,7,8,9,0 и далее по кругу - это счетчик повторов кода посылки. Оставшиеся биты посылки не изменяются пока кнопка нажата, но в следующий раз они будут уже совсем другие. Пробуем считать прошивку контроллера - читаются только первые 64 байта, как и ожидалось, стоит защита от чтения. Дисассемблер показал переход в глубь защищенного от чтения кода и процедуру измерения напряжения на входе AN2 с усреднением результата (интересно...). Немного позже было собрано устройство, захватывающее с радиоканала код нажатой кнопки и скидывающее его в лог, вот несколько строк того лога:
CODE
2-0010-1100-00101100111110001100010011100010000100011010-2 2-0010-1100-01010111011001100011010110010011011000001101-2 2-0010-1100-01100010000101100001000010100110010101011110-2 2-0010-1100-10110100111010100100011001110000100000110011-2 2-0010-1100-11101011001011001111011100100001110100100110-2 2-0010-1100-00011111111101011010001011010100001001111001-2 2-0010-1100-11100110101010000111000000100110110101010110-2 2-0010-1100-11000100100101010100011100000001111100100100-2 2-0010-1100-11111100100110101100010100110011110000000111-2 2 - это стартовый и стоповый биты, тетрады кода кнопки и счетчика я выделил, так же убраны повторяющиеся коды с каждого нажатия.
На тот момент больше ничего понять не получилось и свободное время неожиданно закончилось, совсем закончилось.
Но, буквально на днях, мне снова попались старые записи и из любопытства я продолжил копаться в том логе. И так разбиваем посылку на тетрады и нумеруем их по порядку, чтобы было понятнее.
Интересно что операция XOR между тетрадами 02и08, 02и10, 02и12, 07и09, 09и11 одной посылки имеет одинаковый результат с аналогичными операциями в остальных посылках (очень интересно...). Выводы делать пока не буду.
Отличаются друг от друга длительностями импульсов. Для реализации передатчиков используются микросхемы кодеров Holtek HT-12E – в этом случае в брелоках устанавливают микропереключатели, которыми задается номер брелока. Могут иметь одну или несколько кнопок – микросхема кодера позволяет реализовать от 1 до 4 кнопок. Встречались и в старых пейджерах, там выводы кнопок использовались для кодирования серийного номера. Длительности импульсов задаются резистором в обвязке кодера. Встречаются кодеры без наборного поля, серийный номер прошивается в микросхему производителем.
Кодовая посылка состоит из 12 бит. Перед началом кода идет пилотный период (состоящий из 36 интервалов низкого уровня) и стартовый импульс (состоящий из 1 интервала высокого уровня). Именно длительность стартового импульса указывает, какой временной интервал используется при формировании сигнала. После стартового бита начинается сама посылка, начало бита – с низкого уровня. После окончания последнего импульса кодовое слово повторяется, начиная с пилотного периода. При коротком нажатии на кнопку передаются 4 кодовых слова, при удержании кнопки посылки циклически повторяются (сериями по 4 кодовых слова).
Возможное количество кодовых комбинаций – 4096.
Длительности импульсов CAME:
Лог. «1» – 640мкс низкий уровень (два интервала), 320мкс высокий (один интервал)
Лог. «0» – 320мкс низкий уровень (один интервал), 640мкс высокий (два интервала).
Пилотный период – 11520мкс , стартовый импульс – 320 мкс.
Длительности импульсов NICE:
Лог. «1» – 1400мкс низкий уровень (два интервала), 700мкс высокий (один интервал)
Лог. «0» – 700мкс низкий уровень (один интервал), 1400мкс высокий (два интервала).
Пилотный период – 25200мкс , стартовый импульс – 700 мкс.
Возможны и другие длительности импульсов, но соотношения высоких и низких уровней, а так же пилотный период и стартовый бит формируются по такому же принципу.
В данном формате сигналов существуют и 24-битные кодеры, которые отличаются от 12-битных принципом формирования логических нулей и единиц. Пример такого кодера – микросхемы серии Holtek HT-601х, отличающиеся количеством реализованных кнопок. По сути кодер реализует те же 12 бит кода, но каждый логический бит представляется в виде двух циклов импульсов. Кроме того, кодер подразумевает три вида логических битов – «единица», «ноль» и «свободный» («open»). Тип бита определяется замыканием соответствующего вывода микросхемы на минус или плюс питания, «свободные» биты реализуются, если вывод микросхемы остается неподключенным. ВременнЫе параметры передаваемых сигналов формируются по такому же принципу, как и в 12-битном кодере.
Формат PT-2240 (Princeton)
Кодеры этого формата состоят из 24 информационных битов, за которыми следует бит синхронизации, состоящий из одного интервала высокого уровня и 31 интервала низкого уровня. Длительность высокого уровня указывает временной интервал, который лежит в основе формируемого кода. ВременнЫе параметры задаются резистором в обвязке кодера. Код может содержать 2, 3, 4, 6 или 8 команд (кодов кнопок), в зависимости от типа микросхемы. Кодовое слово не имеет преамбулы, самый первый бит в посылке является информационным. Серийный номер кодера (биты адреса) программируются изготовителем.
Длительности импульсов:
Лог. «1» – 1350мкс высокий уровень (три интервала), 450мкс низкий (один интервал),
Лог. «0» – 450мкс высокий уровень (один интервал), 1350мкс низкий (три интервала).
Бит синхронизации – 450мкс высокий уровень, 13950мкс низкий.
Формат PT-2262 (Princeton)
Количество бит (24 цикла импульсов) и принцип формирования временнЫх интервалов аналогичен РТ-2240. Основное отлчие состоит в формировании информационных битов – для получения серийного номера (битов адреса) используются выводы микросхемы кодера. В зависимости от состояния вывода (подключен к плюсу питания, к минусу или оставлен неподключенным) бит может принимать значение 1, 0 или «плавающий» («floating bit»). Каждый информационный бит кодируется двумя циклами импульсов по тому же принципу, как и в 24-битных кодерах Holtek HT-601х. В зависимости от схемы подключения микросхемы кодера может быть реализовано от 0 (передача только битов адреса) до 6 кодов управления (кодов кнопок), соответственно количество битов адреса может быть от 12 до 6. Биты кодов управления не могут быть «плавающими». При нажатии кнопки брелока кодер формирует посылку, состоящую из 4 кодовых слов, при удержании кнопки брелока посылки из 4 слов циклически повторяются.
ВременнЫе параметры задаются резистором в обвязке кодера.
Продолжим. Посылок у меня в логе более 300 и все проверять вручную это совсем не вариант. Поэтому я взял небольшую паузу, чтобы написать программку для автоматизации этого процесса. А заодно и разные варианты декодирования посылки проверить. Больше всего мне понравился такой:
Вторая колонка - это посылка записанная в HEX формате, третья - посылка поле XOR'а. В результате младшая тетрада байта 0, а также байты 4 и 5 получились одинаковые, во всех посылках. Скорее всего, байты 4 и 5 содержат, спрятанный от нас, идентификатор пульта. Что находится в младшей тетраде байта 0 - не знаю, но явно что то постоянное или очень редко изменяющееся. Основная загадка это байты 1,2,3 - однозначно, здесь закодирован счетчик посылок, но явной системы я не вижу.
На фрикер клубе камрад stallion_x в своем блоге опубликовал статью с анализом протокола Flor-s. Формат пакета Nice Flor-s: START-P0-P1-P2-P3-P4-P5-P6-P7-STOP P0 (4-бита) - позиционный код кнопки - 1:0x1, 2:0x2, 3:0x4, 4:0x8; P1 (4-бита) - номер повтора пакета, вычисляется по формуле: P1 = 0xF ^ P0 ^ n; где n меняется от 1 до 15, затем 0, и далее по кругу. кнопка 1: {0xF,0xC,0xD,0xA,0xB,0x8,0x9,0x6,0x7,0x4,0x5,0x2,0x3,0x0,0x1,0xE}; кнопка 2: {0xC,0xF,0xE,0x9,0x8,0xB,0xA,0x5,0x4,0x7,0x6,0x1,0x0,0x3,0x2,0xD}; кнопка 3: {0xA,0x9,0x8,0xF,0xE,0xD,0xC,0x3,0x2,0x1,0x0,0x7,0x6,0x5,0x4,0xB}; кнопка 4: {0x6,0x5,0x4,0x3,0x2,0x1,0x0,0xF,0xE,0xD,0xC,0xB,0xA,0x9,0x8,0x7}; P2 (4-бита) - часть серийного номера, P2 = (K ^ S3) & 0xF; P3 (байт) - старшая часть зашифрованного индекса. P4 (байт) - младшая часть зашифрованного индекса. P5 (байт) - часть серийного номера, P5 = K ^ S2; P6 (байт) - часть серийного номера, P6 = K ^ S1; P7 (байт) - часть серийного номера, P7 = K ^ S0; K (байт) - зависит от P3 и P4, K = Fk(P3, P4); S3,S2,S1,S0 - серийный номер пульта 28 бит.
Функция Fk() нам не известна, значит подслушать с эфира настоящий серийный номер пульта не получится. Подбирать серийный номер длиной 28 бит - не вариант, но мы можем получить с эфира часть номера...
Берем P1, P5, P6 и P7 из подслушанного пакета и вычисляем часть номера с потерей одного полного байта: X3 = [P1 ^ P7] = [(K ^ S3) ^ (K ^ S0)] = S3 ^ S0; X2 = [P5 ^ P7] = [(K ^ S2) ^ (K ^ S0)] = S2 ^ S0; X1 = [P5 ^ P7] = [(K ^ S1) ^ (K ^ S0)] = S1 ^ S0; Здесь мы пожертвовали S0 и теперь его придется подбирать, это всего 256 вариантов, уже вполне реально.
Допусти мы имеем некоторое количество правильных комбинаций P3n, P4n и Кn тогда мы можем собрать новый пакет для каждого значения S0: P0 (4-бита) - позиционный код кнопки; P1 (4-бита) - вычисляются по известной методике. P2 (4-бита) = [Kn ^ S3] = [Kn ^ (S3 ^ S0) ^ S0] = (Kn ^ X3 ^ S0) & 0xF; P3 (байт) = P3n; P4 (байт) = P4n; P5 (байт) = [Kn ^ S2] = [Kn ^ (S2 ^ S0) ^ S0] = Kn ^ X2 ^ S0; P6 (байт) = [Kn ^ S1] = [Kn ^ (S1 ^ S0) ^ S0] = Kn ^ X1 ^ S0; P7 (байт) = Kn ^ S0;
У меня есть чип, снятый из оригинального пульта, и решил я снять с него полное кольцо пакетов 65536 штук, по моим прикидкам можно справиться часов за 7, это только опрос. А еще нужно сделать макет и написать прошивку...
Размерность индекса, действительно, оказалась 16 бит. Однако, полную таблицу снять не получилось. Дойдя до максимального значения индекса, чип "заблокировался" и теперь передает только 12 последних команд. Очевидные способы, типа закоротить тест-поинт, не позволяют обнулить индекс, если кто-то знает как это сделать - подскажите (в личку, если не для распространения).
Получается что дойдя до максимального индекса, каждый пульт начнет передавать только 12 последних команд. И в случае перехвата они, с большой вероятностью, будут приниматься автоматикой как настоящие. Последние 12 команд с моего чипа: 1-F-F-2D-54-83-EC-D7 1-F-F-DD-A6-23-4C-77 1-F-4-AF-BF-C8-A7-9C 1-F-6-6D-7E-EA-85-BE 1-F-1-CD-67-BD-D2-E9 1-F-0-E1-FE-6C-03-38 1-F-2-A2-FD-8E-E1-DA 1-F-4-27-DB-E8-87-BC 1-F-1-C9-50-AD-C2-F9 1-F-C-3A-2F-40-2F-14 1-F-C-45-B5-C0-AF-94 1-F-4-60-BA-68-07-3C
Функция шифрования индекса не зависит от серийного номера пульта. А значит все пульты будут генерить одинаковые последовательности для шифрования индекса. И это дает возможность для атаки.
Запоминаем некоторое количество команд своего пульта. Строим таблицу - последовательно сохраняем байты P3, P4 и P5 из каждой команды. Принимаем команду с эфира и ищем пару байт P3, P4 в нашей таблице. Если нашли - извлекаем серийный номер с помощью байта P5 из таблицы. Теперь можно вычислять следующие команды. Берем следующую ячейку таблицы и запаковываем найденный серийный номер с помощью байта P5. Теперь байты P3, P4 и запакованный серийный номер дают нам, следующую за перехваченной, команду.
Успешность метода зависит от длины построенной таблицы. Для создания аналога алгоритмического граба - таблица должна занимать 192кб в памяти контроллера или 256кб во внешнем флеше.
Напомню формат пакета Nice Flor-s: START-P0-P1-P2-P3-P4-P5-P6-P7-STOP байты P3-P4 - зашифрованный индекс, байт P5 - часть серийного номера (P5 = K xor S2) S2 - не меняется (для конкретного пульта), K - зависит от индекса.
Заметил еще одну закономерность, если сделать (P4 xor P5) на выходе получаем строго периодическую последовательность из 256 байт:
В эту таблицу подмешан S2 моего чипа, который я не знаю, поэтому выпилить его не получится. Некоторые коды здесь повторяются несколько раз, а другие отсутствуют совсем. Поэтому на роль таблицы перестановок для функции шифрования она не подходит, а вот как зависимость К от индекса - самое то.
Пример для последних 12 команд моего чипа, это самый конец таблицы:
CODE
54 xor 83 = D7 A6 xor 23 = 85 BF xor C8 = 77 7E xor EA = 94 67 xor BD = DA FE xor 6C = 92 FD xor 8E = 73 DB xor E8 = 33 50 xor AD = FD 2F xor 40 = 6F B5 xor C0 = 75
и только последняя команда выбивается из общего ряда:
CODE
BA xor 68 = D2
скорее всего она соответствует индексу 0 или 2, чтобы сбросить индекс сохраненный в приемнике.
В полученной таблице всего 141 уникальный код, а это значит что количество попыток, в атаке с подбором, можно сократить с 256 до 141.
Найденная таблица, сокращает подбор серийного номера до 141 попытки, но это все равно много. Количество попыток при подборе серийного номера можно значительно уменьшить.
Рассмотрим ситуацию, когда хозяин пульта открывает ворота, заезжает и закрывает за собой ворота. В этом случае мы приняли две команды и мы знаем, что индекс у этих команд отличается на 1. Берем из нашей таблицы два последовательных кода, с их помощью извлекаем из команд серийные номера и сравниваем между собой. Если номера совпадают - запоминаем, если нет - пропускаем. Проверяем таким образом все 256 вариантов парных кодов. Результат зависит от зашифрованного в командах индекса, всего комбинаций команд также 256. Из них 19 дают на выходе 1 серийный номер, остальные - от 2 до 12 серийных номеров. Таким образом перехватив и обработав 2 последовательные команды, количество попыток при подборе серийного номера можно сократить до 12.
Но и это еще не все, можно рассмотреть случай перехвата 3 и более последовательных команд. Правда, для этого нужно будет ставить помеху, чтобы вынудить хозяина повторно нажать кнопку пульта. Помеху лучше всего ставить на 1-2 бита в байте P3, но так чтобы собственный приемник успешно принял P4 и всю оставшуюся часть команды. 3 команды: 188 комбинаций дают 1 серийный номер, остальные - 2 или 4 серийных номера. 4 команды: 228 комбинаций дают 1 серийный номер, остальные - 2 или 4 серийных номера. 5 команды: 244 комбинаций дают 1 серийный номер, остальные - 2 или 4 серийных номера. 6 команд: в любом случае получаем 1 серийный номер.
Вот такая "надежная" защита оказалась у протокола Nice Flor-s.
Ребят я не знаю насколько это верно но на cybergho.st виде прошивку которая открывает в том числе и nice flor s под брелок zx940. Там есть разные какие-то 45 кбб 33 кб. Я решил взять 7 кб и дизассемблерить. Собственно пока с помощью отладчика mplab x я гонял по программе и примерно нашел кусок кода готорый зацикливается (ожидает нажатия 1 из 4 кнопок которые как я определил по дизассемблеру висят на портах d 5,6,7,4). Кто хочет помочь мне дизассемблерить эту прошивку и могу ли я ее скинуть? (мой аваст вирусов не обнаружил). Будет даже хорошо проверить в самом брелке, но у меня его нет.
Кто нить пробовал словить шесть посылок и декодировать серийник и счетчик?
Пробовал словить и больше посылок, только не понятно как вычислить счетчик и коэффициенты для получения серийного номера. S/n известен, более того уже даже открывашку сделал. Осталось только s/n из эфира вычисоить. Есть приблуда, которая его из 3х посылок вычисляет, но это не Наш метод. Может у кого есть содержимое eprom приемника с известным sn, поделитесь.
Это сообщение отредактировал Mvd2 - May 10 2020, 09:35 AM
Кто нить пробовал словить шесть посылок и декодировать серийник и счетчик?
Пробовал словить и больше посылок, только не понятно как вычислить счетчик и коэффициенты для получения серийного номера. S/n известен, более того уже даже открывашку сделал. Осталось только s/n из эфира вычисоить. Есть приблуда, которая его из 3х посылок вычисляет, но это не Наш метод. Может у кого есть содержимое eprom приемника с известным sn, поделитесь.
Сейчас делаю граб как раз только на шлагбаумны (( зае**али эти шлаги)) Вся статика есть + есть шлаги с keeloq ( есть. с мануфаками )
В проекте остался один FLOR S ...вон он , снятый c моих ворот лежит в тумбочке: приемник с флешкой (она вставляется в приемнике) + 2 пульта. Щас закончу в проекте сохранение в EEPROM и займусь FLORом.. Погляжу скока еще в камне места останется .... Если интересно буду оповещать _
Сразу хочу предупредить что важен еще не только сам протокол в статике НО и интервалы посылок, которые нужно проанализировать и сохранить на выброс к каждому конкретному шлагу.. Эти "Грабли" уже проверены __
Это сообщение отредактировал 23rus - May 10 2020, 02:45 PM
я предполагаю, что если ему дать одну из первых(по счётчику) посылку
то он запомнит пульт и воспроизведет все 65536 посылок, потом его можно будет повторно перепрограммировать этой же первой посылкой (само собой выплескиваем в эфир её ардуиной или на чем сделали на fs1000a) чтобы не запарывать основной пульт переполнением счётчика
так же могу поделится 1000 посылками счетчика с серийником в подряд, больше пока не делал
если кто то со мной поделится аналогично таблицой против не буду. пишите в ЛС
Напомню формат пакета Nice Flor-s: START-P0-P1-P2-P3-P4-P5-P6-P7-STOP байты P3-P4 - зашифрованный индекс, байт P5 - часть серийного номера (P5 = K xor S2) S2 - не меняется (для конкретного пульта), K - зависит от индекса.
Заметил еще одну закономерность, если сделать (P4 xor P5) на выходе получаем строго периодическую последовательность из 256 байт:
насчёт 256 кбайт памяти для сохранения всех кодов пульта.
т. к. младший байт счётчика цикличный, сохранять его не нужно. только 256 байт таблицы, далее серийник 4 байта старший байт счетчика 65536 значений и K 65536 значений. Получается уже 129кб + 4 байта, но всё равно это много. т. к. в pic16f526 НЕТУ столько памяти, там 1024 асм строчки. операции там от силы битовые алгоритм должен быть простым. Делать открывашку с Фокусом переполнением счётчика не вариант. а значит нужно понять как он работает, из 2048 мной изученных посылок старший байт совместно с младшим^ K не повторяется ни разу. нужно больше посылок, который у меня пока нет.
снял все 65536 посылок, но счётчик обнулился и заново пошел причём повторяет первые посылки так что на моём пульте нет никакой защиты от переполнения счётчика.
может быть у Вас EEPROM сдох
Это сообщение отредактировал Nikitos210 - Oct 6 2020, 04:44 PM
после 65535 выдаётся 65536 посылка причём с 256ым индексом 3C потом счетчик стартует не с 0 а с 3 индекса и до 255 потом с 0 и так далее на 256 раз появляется 256 индекс
Это сообщение отредактировал Nikitos210 - Oct 7 2020, 03:48 PM
Непонятная какая то чехарда у вас с индексом творится, похоже тоже не все гладко с переполнением. У меня был старый пульт и там при переполнении счетчика решили перейти к укороченному циклу, но на современной автоматике этот фокус не работает - должен применяться другой набор команд, похожий на тот что описываете вы.
Запилил утилиту анализа посылок на основе полной таблицы индексов, может поможет в анализе посылок. Использовать только для изучения протокола!!!
Наверно у Вас был оригинальный пульт где переполнился счётчик
мыслим так: 2 байта это 0..65535 65536 это 3 байта. их там нет соответственно нулевой индекс это 256ой лишний табличный индекс 1ый и 2ой индекс зарезервировали разработчики поэтому счётчик у меня стартует с индекса 3, потом до 65535
соответственно предположим, что шлагбаум будет видеть N следующих посылок например 10 или 100 соответственно когда мы достигли 0го значения, шлагбаум откроется на 3..3+N посылку а в начале статьи даётся по кругу 0,65524,65525 ... 65535 посылки это не прокатит шифросчётчик с индексами 1 и 2 соответсвенно DFAB D803 у меня не встретились, все остальные комбинации пульт отдал Ваша прога выдаёт на них 1-F-6-DF-AB-CC-DD-22 #F0514EB Index: 65535 1-F-2-D8-03-68-79-86 #4A5BA4 Index: 0
нумерация индекса это наша придумка, можно как угодно считать
за Вашу прогу отдельное спасибо.
а Алго то удалось разгадать или по табличке?
Это сообщение отредактировал Nikitos210 - Oct 9 2020, 08:57 AM
с индексом разобрался, там всё просто посылок с индексом 0 и 1 нету [0]:1 F S DFAB S2S1S0 Tc:40 Ix:000 Reserved Not used [1]:1 F S D803 S2S1S0 Tc:A7 Ix:001 Reserved Not used и шифросчётчиков тоже нету таких.
стартует с (я её считал 65536 ) со второй 1 F S 60BA S2S1S0 Tc=3C Ix:002 Start. и до 65535. потом снова со второй.
Это сообщение отредактировал Nikitos210 - Oct 9 2020, 03:27 PM
Алгоритм, анализируя только посылки пульта не разгадать, поэтому таблица. Индексы, это не наша придумка, это так в оригинале. D803 - индекс 0, видимо действительно зарезервирован DFAB - индекс 65535 или 0xFFFF, что соответствует незаписанной флеш, поэтому не использкется.