Робимо універсальний ключ для домофону

Заголовок вийшов дуже гучним і ключ не такий універсальний, і домофон піддасться не будь. Ну да ладно.
Мова піде про домофони, що працюють з 1-wire таблетками DS1990, ось такими:



В інтернеті можна знайти безліч матеріалів про те, як читати з них інформацію. Але ці таблетки бувають не лише read-only. Людині властиво втрачати ключі, і сьогодні ларьок з послугами по клонуванню DS1990 можна знайти в будь-якому підземному переході. Для запису вони використовують болванки, сумісні з оригінальними ключами, але мають додаткові команди. Зараз ми навчимося їх програмувати.

Навіщо це потрібно? Якщо відкинути завідомо нехороші варіанти, то найпростіше — це перепрограмувати зібралися і стали непотрібними клоновані таблетки від старого домофона, заміненого на новий, від під'їзду орендованої квартири, де більше не живете, від роботи, де більше не працюєте, і т.п.



Відразу обмовлюся, що в описі я опущу деякі моменти, очевидні для більшості з тих, хто «в темі», але, можливо, не позволящие простому забредшему сюди з пошуковика людині повторити процедуру. Це зроблено навмисне. Я хоч і за відкритість інформації, і вважаю, що відомості про уязвимостях повинна доводитися до громадськості як можна швидше, але все ж не хочу, щоб будь-який бажаючий міг вільно заходити до мене в під'їзд.

Трохи теорії.

Як відомо, DS1990 характеризується, в загальному випадку, одним параметром — власним ідентифікаційним номером. Він складається з 8 байт і нанесений на поверхню таблетки. І він же видається у відповідь на запит по 1-wire. Насправді один з цих байт — це ідентифікатор типу пристрою, ще один — контрольна сума, але для нас це не принципово. У пам'яті домофона прописані всі відомі йому ключі, змінювати це множина може лише компанія, домофоном, що управляє. Але крім ключів, явно записаних в пам'ять, домофон іноді реагує на так звані майстер-ключі, єдині для домофонів цього виробника, цієї серії, цього установника. Коди майстер-ключів намагаються тримати в секреті, але іноді вони витікають. За п'ять хвилин гугления можна знайти близько 20 майстер-ключів від різних домофонів. У мене стоїть «Візит», тому вибір ліг на ключ 01:BE:40:11:5A:36:00:E1.

Болванки, на які клонуються ключі, бувають різних типів. У нас в місті найпоширеніші — це TM2004. За описом вони підтримують фіналізацію, після якої втрачають можливість перезапису і функціонують як звичайні DS1990. Але з якихось причин умільці, роблять копії, фіналізацію виконують не завжди. Можливо тому, що основна маса програматорів на ринку куплена давно і не має такої функції, можливо тому, що для фіналізації потрібна підвищена (9В) напруга. Не знаю. Але факт залишається фактом, з 4-х ключів, на яких я експериментував, финализирован був тільки один. Решта легко дозволяли змінювати свій код на який душі завгодно.

Практика.



Збирати програматор будемо на Arduino Uno, яка для подібних цілей макетування та складання одноразових виробів підходить ідеально. Найпростіша Схема, 1-Wire на те і 1-Wire.



Час зборки пристрою на бредборде не перевищує п'яти хвилин



Код скетчу. Сам алгоритм запису взято тут — domofon-master2009.narod.ru/publ/rabota_s_kljuchom_tm_2004/1-1-0-5
Там, правда, написано, що можна записувати всі 8 байт поспіль, але у мене так не запрацювало. Тому кожен байт пишеться окремо, через свою команду 0x3C.

#include <OneWire.h>

#define pin 10

byte key_to_write[] = { 0x01, 0xBE, 0x40, 0x11, 0x5A, 0x36, 0x00, 0xE1 };

OneWire ds(pin); // pin 10 is 1-Wire interface pin now

void setup(void) {
Serial.begin(9600);
}

void loop(void) {
byte i;
byte data[8];

delay(1000); // 1 sec

ds.reset();
delay(50);
ds.write(0x33); // "READ" command

ds.read_bytes(data, 8);

Serial.print("KEY ");
for( i = 0; i < 8; i++) {
Serial.print(data[i], HEX);
if (i != 7) Serial.print(":");
}

// Check if FF:FF:FF:FF:FF:FF:FF:FF
// If your button is really programmed with FF:FF:FF:FF:FF:FF:FF:FF, then remove this check
if (data[0] & data[1] & data[2] & data[3] & data[4] & data[5] & data[6] & data[7] == 0xFF)
{
Serial.println("...nothing found!"); 
return;
}

return; // remove when ready to programm

// Check if read key is equal to the one to be programmed
for (i = 0; i < 8; i++)
if (data[i] != key_to_write[i])
break;
else
if (i == 7)
{
Serial.println("...already programmed!");
return;
}

Serial.println();
Serial.print("Programming new key...");

for (uint8_t i = 0; i < 8; i++)
{
ds.reset();
data[0] = 0x3C; // "WRITE" command
data[1] = i; // programming i-th byte
data[2] = 0;
data[3] = key_to_write[i];
ds.write_bytes(data, 4);
Serial.print(".");

uint8_t crc = ds.read();

if (OneWire::crc8(data, 4) != crc) {
Serial.print("error!\r\n");
return;
}
else
Serial.print(".");

send_programming_impulse();
}

Serial.println("done!");
}

void send_programming_impulse()
{
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH); 
delay(60);
digitalWrite(pin, LOW); 
delay(5);
digitalWrite(pin, HIGH); 
delay(50); 
}


Після запуску програма разів в секунду опитує 1-Wire інтерфейс і видає на последовательнй порт зчитаний з нього код. Якщо це FF:FF:FF:FF:FF:FF:FF:FF, то вважаємо, що нічого не підключено. У загальному випадку це, звичайно, неправильно, так як деякі болванки, наприклад, TM2004, дозволяють записати 8 0xFF в ід ключа, тому якщо у ваша таблетка прошита таким кодом, то перевірку потрібно прибрати.

Порядок роботи: запускаємо, підключаємо ключ, чий код хочемо дізнатися, і отримане значення хардкодим в масив key_to_write. Прибираємо позначений коментарем return. Знову запускаємо і підключаємо болванку, вона повинна прошу новим ключем. Природно, що для запису вже відомого коду (скажімо, майстер-ключа), перший крок виконувати не потрібно.

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

Успішний лог запису виглядає якось так:
KEY FF:FF:FF:FF:FF:FF:FF:FF...nothing found!
KEY FF:FF:FF:FF:FF:FF:FF:FF...nothing found!
KEY FF:FF:FF:FF:FF:FF:FF:FF...nothing found!
KEY 1:98:2C:CD C:0:0:EB
Programming new key...................done!
KEY 1:BE:40:11:5A:36:0:E1...already programmed!


Спускаємося на вулицю, намагаємося відкрити сусідній під'їзд. Працює!

Морально-етичні питання.

А варто було таке викладати? Раптом у мій під'їзд зможе зайти бомж і стане там жити?

Ну, по-перше, давайте дивитися правді в очі — майстер-ключ вам запрограмують в будь-якому переході за дуже невеликі гроші. Та й в інтернеті маса пропозицій. В цьому плані півтора хаброжителя, повторивших мій досвід — це крапля в морі.
По-друге, я все-таки навмисно пропустив кілька досить принципових питань, які завадять новачкові запустити пристрій. Ну а просунута людина навряд чи прийде в ваш під'їзд, щоб там спати чи творити неподобне.
Ну і по-третє, мені боляче дивитися на те, у що перетворюється моє місто. Кожен будинок мріє огородиться від сусідів. Паркани буквально всюди. Величезна кількість маршрутів, за якими я ходив все життя, сьогодні на пів-шляху впирається у хвіртку з домофоном. І це при тому, що ніхто не вправі обмежувати людину у відвідуванні муніципальної власності, якою прибудинкова територія і є. Без ключа-«всюдихода» (а краще цілої зв'язки з різними кодами) вже просто нікуди.

Тому і публікую без найменших сумнівів. Користуйтеся!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.