воскресенье, 22 декабря 2013 г.

Метаком. Делаем универсальный ключ.

    Совсем заглох уже мой бложик, пришло время его немного оживить. Сегодня я расскажу о домофонных ключах, о том как они хранятся в домофоне, и что из этого получается.
    Метакомовские ключи являются дешевой альтернативой ключам стандарта Dallas iButton и сделаны на основе микросхемы К1233КТ2. Микросхема с помощью изменения тока потребления передает индивидуальный код ключа. Код состоит из 4-х байт с битом контроля четности, который дополняет бит до четного количества единиц, таким образом всего может быть 228=268 435 456 комбинаций.

    В MK-20/МК-99/МК-2003 ключи хранятся тупо как массив по 4 байта, никаких дополнительных контрольных сумм или количества ключей нигде не записано. Домофон определяет окончание массива ключей только по началу незаписанной области ПЗУ,  как обычно она заполнена 0хFF. Когда код ключа считан, домофон начинает последовательно считывать из ПЗУ четверки байт  и сравнивать с кодом ключа. Когда считывается последняя четверка FF FF FF FF надо бы домофону остановиться и признать ключ неправильным, однако с другой стороны это корректный код который может быть в одном из ключей, вот и получается баг - ключ с кодом FF FF FF FF  будет открывать любой домофон.
    Для проверки можно собрать вот такую несложную схемку:
 
Код прошивки на Си и HEX файл (F_CPU = 1,2МГц) прилагаются.
Схему можно легко поместить в корпус любой "таблетки".

28 комментариев:

  1. Подтверждаю. На "старых" домофонах Метаком MK-20/МК-99/МК-2003 прекрасно срабатывают коды ключей с FF_ками. На новых моделях МК-20.2, Мк-2003.2 и других дыру по FF закрыли.
    "Вездеход" можно записать на перезаписываемые заготовки/болванки типа ТМ-01С для домофонов где даллас формат ключа отключен, нужно код FFFFFFFF записать. Для домофонов где даллас разрешен можно такой код ключа записать 9B 00 00 FF FF FF FF 01 или 2F FF FF FF FF FF FF 01 или 14 FF FF FF FF FF FF FF.
    Удачи!

    ОтветитьУдалить
    Ответы
    1. З.Ы. на пред идущий мой комментарий. На ТМ-01С нужно писать как ключ Метаком ("токовый" ключ) код FFFFFFFF (он дорогой), остальные на далловские заготовки/болванки типов ТМ-2004, RW1990, TM-08v2 (они дешевле)
      Простой и функциональный копир описан здесь http://kazus.ru/forums/showthread.php?t=67407

      Удалить
    2. Знаю, что тема не новая, просто интересно было сделать свой вариант эмулятора ключа. Интересно, есть ли уже в сети описание цифраловских DC-2000 и способов изготовления копий в формате даллас?

      Удалить
    3. На ключи CYFRAL есть 4 вида перекодировки в DALLAS ( С1 – С4 )
      На ключи МЕТАКОМ есть 2 вида перекодировки в DALLAS ( М1 – М2 )

      Удалить
    4. Хм а я на цифрал только 2 знаю, но даже их описания не встречал.

      Удалить
  2. Цифраловский DC-2000 это микросхема K1233KT1, поиск даст кучу ссылок на даташит.

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

      Удалить
    2. Вот именно. Для правильной перекодировке ключей форматов Метаком и Цифрал в формат даллас необходимо знать как эти коды ключей хранятся в памяти домофонов. Вся беда в том что у разных производителей домофонов это по разному реализовано, мало того, в разных вызывных панелях домофонов одной фирмы в памяти коды ключей по разному хранятся.

      Удалить
  3. P.S. Кстати, "Код прошивки на Си и HEX файл (F_CPU = 1,2МГц) прилагаются" недоступны для просмотра и скачивания :(

    ОтветитьУдалить
  4. P.S.2 На радикоте есть эмулятор "3 в 1", эмулирует 3 типа ключей, метаком, цифрал и даллас. Память на 32 ключа, Atmega8, индикатор 7сегментный http://radiokot.ru/forum/viewtopic.php?f=25&t=58004

    ОтветитьУдалить
  5. Если не секрет, то где в коде код FFFFFF....?
    Как мне туда зашить код 14FFFFFFFFFFFFFF, например?
    Заранее спасибо!

    ОтветитьУдалить
    Ответы
    1. Код в этой строчке: for(char i=0;i<32;i++)send_bit(1);
      Больше 32 бит туда зашить нельзя (домофон не прочитает).

      Удалить
    2. то есть, цикл просто отправляет старший бит на все 32 бита?
      я где-то увидел, что код 14FFFFFFFFFFFFFF является чуть ли не универсальным для домофонов метаком и цифрал

      Удалить
    3. > то есть, цикл просто отправляет старший бит на все 32 бита?
      Да.
      Скорей тогда уж 2FFFFFFFFFFFFF01 (откроет только метакомы до примерно 2010г.в.) но это код Даллас а тут эмулятор формата Метаком. 14FFFFFFFFFFFFFF скорей всего вообще не прочитается.

      Удалить
  6. Я тут пытаюсь реализовать универсальный ключ, который сможет открыть дверь в мой подъезд и другие домофоны этой же модели. Интерес спортивный. Идея появилась в тот момент, когда после очередного прихода домофонных дел мастера, у меня отвалился сделанный у умельцев на рынке дубликат. Считал в домашних условиях сигналы с ключей, рабочих и не только. Путём анализа удалось однозначно установить по формату кода, что он соответствует коду микросхемы К1233КТ1, хотя тайминги и потребляемый ток нифига не соответствует даташиту. Впрочем тайминги можно натянуто назвать почти вписывающимися в указанные рамки. А насчёт тока не имею понятия. По даташиту указано напряжение питания 5 вольт, а на деле падение напряжения при втыкании ключа в домофон меньше полутора вольт. Возможно, подразумевается, что при меньшем напряжении потребление тока между низким и высоким уровнями будет иным, не соответствующим даташиту. Нерабочий ключ вообще не соответствует таймингам, они там завышены более чем в два раза по сравнению с рабочими ключами. Кроме того нерабочий ключ при подаче питания сначала отправляет пачку импульсов, не соответствующую даташиту, после чего циклически отправляет правильный код (но с завышенными таймингами, как я уже сказал), правда почему-то не с начала. В общем мне в принципе ясно почему этот ключ не работает, скорее возникает другой вопрос: как он раньше вообще работал? Сначала я попытался сделать эмулятор ключа на ATtiny13, заставив его выдавать код, с таймингами, соответствующими рабочему ключу. Амплитуда импульсов у меня была гораздо выше, чем у настоящих ключей. Схема отличалась от вашей тем, что параллельно питанию был подключен конденсатор, а питание заводилось через диод (всё от того же домофона, без дополнительного источника питания), чтобы микроконтроллер не завис, когда будет подтягивать сигнальную линию к земле. Вариант оказался неработоспособным. Пытался делать некоторые улучшения, но ничего не помогало. Помогло только привести амплитуду импульсов к такой, как у рабочих ключей, и подключить дополнительную батарейку для питания микроконтроллера (потому что в этих рабочих рамках напряжение было сильно ниже минимально необходимых 1.8 вольт). Таким образом у меня получилось открыть дверь при помощи микроконтроллера. Теперь возник вопрос: возможно ли в принципе сделать универсальный ключ путём эмуляции К1233КТ1? Как известно по даташиту, отправить код из 32-ух единиц будет некорректно. Есть ли надежда, что домофон это схавает? Ещё как вариант, можно попробовать отправить после стартового слова восемь слов 0111, что по даташиту соответствует цифре 3 (а это две единицы в бинарном представлении). То есть если домофон переводит код ключа соответственно даташиту, то получится код из 16-ти единиц. Я, конечно, мог бы проверить все варианты, что придут мне на ум, но немного напряжно перепрошивать и бегать к двери, да ещё и опасаться, чтобы местные бабульки меня не спалили и не назвали террористом. Решил обратиться за советом.

    ОтветитьУдалить
    Ответы
    1. Добавлю код программы микроконтроллера: https://pastebin.com/JhbCxmEj

      Удалить
    2. >Теперь возник вопрос: возможно ли в принципе сделать универсальный ключ путём эмуляции К1233КТ1?
      Скорее всего нет. Дело в том что у Цифралов нет этого бага с отправкой FF, там всегда учитывается количество записанных ключей.
      >Как известно по даташиту, отправить код из 32-ух единиц будет некорректно. Есть ли надежда, что домофон это схавает?
      Отправить единицы можно. И да, это будет восемь слов 0111 или 1110 в зависимости от модели домофона, но это не поможет ключу стать универсальным.
      Самый дельный вариант это попытаться собрать переборщик кодов ключей. Из-за избыточного кодирования количество возможных кодов ключей 65535, и в каждом доме по 100 - 150 ключей, в итоге у меня выходило что за 3-7 минут можно ключ подобрать. Я даже начал писать код такого переборщика, но потом забросил, мне то он особо не нужен.

      Удалить
    3. Может пригодится код передачи https://pastebin.com/vB1tQZv0

      Удалить
    4. Спасибо за ответ. Полный переборщик мне не кажется хорошей идеей. Я где-то видел упоминание, что домофон циклически считывает ключ и открывает дверь только если ключ совпал три раза подряд. Судя по моим опытам, дверь открывается вообще только спустя штук 40 корректных циклических посылок. Либо домофон откликается не сразу, либо бракует некоторые посылки. И неужели в домофоне не встроено ничего для защиты от перебора? Может просто переставать принимать код, если ключ держат прислонённым слишком долго (три секунды например). Если же всё таки сделать полный перебор и отправлят для хоть какой-нибудь уверенности каждый код по три раза подряд, то это займёт 25 минут в худшем случае. Но даже если удастся открыть дверь за три минуты или даже за минуту - это нереально долго и рука занемеет ключ держать, я уж не говорю о том, что контакт может быть неустойчивым. Попробую всё таки сделать универсальный ключ несколькими способами. Сообщу о результатах.

      Ваш код понятен, я изначально хотел сделать что-то подобное, чтобы код хранился в uint16_t. Но я тайминги подгонял под существующие рабочие ключи, чтобы график выходного сигнала максимально близко совпадал. А микроконтроллер изначально у меня работал на частоте 0.6 килогерц и выходило так, что код выполнялся слишком медленно и не удавалось обеспечить нужные тайминги. Потом я увеличил частоту до 1.2 мегагерц и сделал алгоритм в таком виде, как я его выше представил. Память там расходуется неоптимально, но её даже в запасе осталось, так что я решил пока так и оставить. Если делать перебор всех ключей, то в любом случае придётся увеличить частоту, либо использовать более вольные тайминги.

      Удалить
    5. Вообще не важно сколько там нужно посылок, можно посылать код ключа пока есть контакт, при отрыве от ключевины ждать нажатия кнопки сохранения. Если кнопка не нажата, а ключ опять поднесли код меняется на следующий. И рука разминается заодно.
      Защита от перебора есть но не на всяком оборудовании. Контроллеры ТС-01, а также домофон CCD-40 защиты от перебора не имеют. В общем ради спортивного интереса попробовать можно. Если будет рабочий код помогу с тестированием, пара контроллеров валяется.

      Удалить
    6. Вот же ж. Я только сейчас заметил одну большую странность. Почему-то у меня все ключи, судя по графику сигнала, отправляют код инвертировано. То есть, например, стартовое слово выглядит не как 0001, а как 1110. Первая мысль: у меня график отображает изменение напряжения, а в даташите измененние тока, то есть мой график нужно мысленно инвертировать. И это правильно. Но проблема не в этом, проблема в таймингах. Попробую "нарисовать" пример графика тока.

      Стартовое слово в даташите:

      /TT\____/TT\____/TT\____/TTTT\__/

      Стартовое слово у моих ключей:

      /TTTT\__/TTTT\__/TTTT\__/TT\____/

      Если в фазе графика я ещё мог ошибиться, то уж тайминги врать не могут. Есть какое-то здравомысленное объяснение происходящему? Может у меня ключи не К1233КТ1, а какой-то извращённый аналог, чтобы бороться с копировальщиками? Таблетки из опозновательных знаков имеют только тиснение на задней стенке из цифр месяца и года выпуска (ну судя по всему: 11.16), на пластиковом держателе таблетки выгравировано CYFRAL.

      Удалить
    7. Всё нормально. В даташите показан график изменения тока, следовательно график изменения напряжения будет инвертирован.

      Удалить
    8. Да нет же, я даже упомянул, что это я учёл. Странность именно в том, что описание логических 0 и 1 перепутаны. Взгляните на псевдографики выше, что я дал.

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

      Удалить
    9. Как я уже говорил, я смог один раз открыть дверь домофона при помощи микроконтроллера, но только с использованием дополнительного питания в виде трёхвольтовой батарейки. Кроме того, я ставил два резистора, чтобы форма сигнала полностью повторяла настоящий ключ, как по интервалам, так и по напряжению (вплоть до сотых долей вольта примерно). И почему-то, как мне кажется, стоит отступить немного от этих параметров, так сразу ничего не работает. Я всё же пытаюсь сделать, чтобы работало без дополнительного питания. Снизил по максимуму энергопотребление, отсылаю код пачками с паузами на сон, чтобы конденсатор, подпитывающий микроконтроллер, успевал зарядиться от домофона. Ничего не получается. Причём при тестировании дома, я чётко вижу сигнал, работает неплохо, но я для теста использую просто подтяжку до +5 вольт резистором. Наверняка схема в домофоне посложнее, и возможно в этом дело, я что-то не учитываю. Я видел примерную схему в даташите на К1233КТ1, но хотелось бы знать нюансы. Можете подсказать, применяются ли какие-то тонкости в схемах домофонах, отвечающих за непосредственное чтение ключа?

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

      Не уверен, стоит ли мне продолжать писать о прогрессе своих экспериментов, это всё таки не мой блог. Если что не так, сообщите.

      Удалить
    11. Пишите, не стесняйтесь, я всегда рад помочь, сейчас просто работы много.
      Кажется я знаю в чем проблема. Вы смотрите на схемку в этой статье, но она будет работать только на Метакоме. В цифралах схема считывания ключей отличается, скорее всего без внешнего питания не получится, потому что цифрал читает код ключа только если напряжение на нем меньше примерно 2.5 вольт. При считывании родного ключа напряжение примерно 1в, а пульсации около 150мв. Если правильно помню хорошо работала схема с резистором 2к включенным постоянно на лузу + 10к на ключевой транзистор, потестирую на контроллере скажу точно.
      Есть вероятность что стоит фильтр, но скорее всего стоит пульт CCD2094.2 у него такое поведение с завода.

      Удалить
    12. Сейчас расскажу, как сделал я на данный момент (но вариант не работает).

      К двум выводам микроконтроллера (далее МК) подключено по резистору, а другими концами они подключены к центральному контакту лузы. К контактам питания МК подключен конденсатор на 100 мкФ. От центрального контакта лузы также подключен диод на контакт VCC МК. Пробовал и без диода, в таком случае питание поступает через два вышеописанных резистора и внутренние диоды в МК (внутренняя схема портов AVR обсуждалась во многих местах, там есть диоды для стравливания лишнего напряжения на шины питания). В домашних условиях оба варианта работоспособны (подключаю к 5 вольтам через резистор 3.2 кОм и считываю изменение напряжения, после чего анализирую график сигнала в программе PowerGraph). Почему я выбрал резистор на 3.2 кОм? Подобрал экспериментально, чтобы примерно соответствовало тому, что находится на выходе домофона. Замерял напряжение на лузе под нагрузкой и один раз даже считывал сигнал с рабочим ключом.

      Вы почти полностью правы, колебания сигнала на рабочем ключе и домофоне находятся от 1 до 1.34 вольт. Поэтому резисторы, подключенные к контактам МК я подобрал таким образом, что когда один из них подтягивается к земле, то напряжение на лузе становится около 1.34 вольта, а когда ещё и второй, то оба резистора становятся подключены параллельно и напряжение падает до 1 вольта. Таким образом я могу формировать импульсы с нужным напряжением сигнала. МК перевёл в самый энергосберегающий режим, какой только смог соорудить, все неиспользуемые выводы переведены на вход с внутренней подтяжкой до VCC, вся неиспользуемая перифирия отключена, контроль питания отключён, частоту понизил до 600 килогерц! При старте программы выдерживаю паузу (пробовал разную вплоть до секунды). Во время паузы контроллер засыпает в самый глубокий сон и энергии можно сказать не потребляет вовсе. В это время конденсатор успевает зарядиться почти до пяти вольт (в домашнем эксперименте я это вижу по полупараболе графика напряжения). После этого контроллер начинает отправлять импульсы. Заряда конденсатора хватает, чтобы отправить нужную посылку раз 100 подряд, а то и больше, это настраивается в прошивке, пробовал разные значения. После этого контроллер снова засыпает на 30-250 милисекунд (тоже настраивается в прошивке), чтобы дать возможность зарядиться питающему конденсатору, после чего просыпается и снова отправляет пачку импульсов. Ну и так в цикле.

      МК уходит в сброс или перестаёт работать, если напряжение падает ниже примерно 1.8 вольт (как в даташите). Я стараюсь этого не допускать путём подбирания задержек для зарядки конденсатора. Возможно в момент первоначальной зарядки конденсатора, когда напряжение сначала проседает и плавно повышается, домофон каким-то образом начинает понимать, что его пытаются обмануть?

      На домофоне вроде написано CCD2094 (к сожалению понимаю, что не помню на 100%, но вроде бы именно так). Как я уже говорил, есть особенность, что после моего эмулятора домофон на какое-то время (в течении полминуты, а может и гораздо дольше) перестаёт принимать любые ключи. Это фильтр? Кроме прочего, что тоже важно, насколько я помню, если поднести к нему рабочий, но чужой ключ, то домофон откликнется криком ERROR (возможно путаю с домофоном на прошлой квартире). Если это так, то полный перебор не должен срабатывать. Я что-то путаю или ошибаюсь?

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

      Спасибо за вашу помощь.

      Удалить