ESP 8266 + RFID MFRC522
История другого копировальщика
Пару лет назад переехал в новый жилой комплекс. Оказывается, домофонная служба продает ключи от подъезда по 300 рублей. Непорядок. Внутренний еврей заставил внутреннего ардуинщика собрать копировальщик самостоятельно.
Причем, это была уже не первая версия.
Спустя какое то время, решил переделать.
Потом еще раз.
В один прекрасный момент катушка/антенна просто отвалилась. Значит все по новой.
Заказал платы на заводе.
Программа и прошивка честно взяты у товарища с хабра. От меня небольшие доработки и плата.
Устройство в посте - копировальщик/сниффер ключей от домофона mifare 1k(метаком и прочие). Собрать предыдущую версию можно самостоятельно.
Другие посты про rfid можно почитать в профиле или по тегу. Мой контакт если что, есть в профиле.
Отдельное спасибо товарищу @imaximus5 за первый и единственный донат.
Сегодня отправил две платы из предыдущего поста пикабушникам из Тамбова и Гомеля...
... и решил раздать два набора для самостоятельной сборки усилителей от Мастеркит. Мне они ни к чему, а разбирать на детали рука не поднимается.
Это в следующем посте)
p.s. Не забывайте, что ваш плюс позволяет посту выйти в горячее и мотивирует писать еще) Спасибо тем, кто дочитал.
История одного копировальщика
Вернемся на полтора года назад:
Спустя пару месяцев:
Следующая версия:
Можно собрать самостоятельно.
JLC вернул оплату картой мир. Значит пора заказывать заводскую плату.
На мой скромный взгляд - получилось неплохо.
Если кому интересно, это копировальщик ключей домофона em-marine и ibutton. С функциями памяти, эмуляции и финализации. 70% кода честно спызжины у Мехатрона.
Не стесняйтесь плюсовать(или минусить). Спасибо за просмотр.
P.s. Для понимания габаритов.
Копирование домофонных ключей mifare 1k
За последние пару месяцев собрал на заказ более 6 копировальщиков/снифферов. Ознакомиться можно по ссылке.
Казалось, что тема расписана вдоль и поперек (в том числе мной). Но у заказчиков по прежнему возникают детские вопросы. Попробую разжевать. Пост будет полезен тем, кто решил заняться копированием домофонных ключей, но тратить 30к+ на smkey не желает.
Речь пойдет о самых популярных mifare 1k, которые UID 4 байта.
Что нужно:
-телефон на андроид с приложением MCT
-сниффер/копировальщик mifare
-proxmark3
-заготовки
Нам принесли исходную метку и для начала нужно понять, что она из себя представляет.
Открываем приожение MCT, прикладываем и считываем TagInfo. Там увидим такую картинку.
Значит пациент наш. Далее попробуем прочитать метку со стандартными ключами этим же приложением.
Простой вариант, стандартные ключи. На скрине видно информацию, которая записана в сектор ноль. Он состоит из четырех блоков. Первые четыре байта нулевого блока - UID. Первые и последние шесть байт последнего блока - ключи А и Б. Между ними биты отвечающие за условия доступа. Подробнее читать здесь.
Если используются стандартные ключи как на скрине выше, то можно запросто считать, сохранить и записать на болванку этим же приложением. Можно использовать проксмарк или копировальщик/сниффер в режиме записи UID.
Возможно, что ключи будут стандартные, но другие. Можно встретить при попытке прочитать карту тройка. Впрочем, некоторые легко найти и дополнить словарь.
Приложение MCT пишет только на заготовки CUID, если нужно внести изменения в нулевой блок нулевого сектора. Для записи заготовок зеро используйте копировальщик или проксмарк. Последний умеет финализировать заготовки UFUID.
Средний вариант, нестандартные ключи. При попытке прочитать выдает такое.
Ну или как то так. Если просто скопировать UID, заготовка может не сработать. Нужно узнать ключ А нулевого сектора. Для этого можно включить проксмарк и попробовать атаки nested, hadrnested и darkside. Они позволяют получить ключи от секторов. Во многих случаях этого достаточно, чтобы сделать полный дамп ключа. Осталось записать на подходящую заготовку. Если считыватель (например iron logic) имеет фильтр, то стоит использовать cuid(mf3).
Сложный вариант, нестандартные ключи, атаки не работают. Достаем копировальщик/сниффер и отправляемся к домофону. Используем функцию захват криптоключа и забиваем их в приложение MCT. Считываем дамп и записываем на болванку CUID или CUID(MF3).
Домофоны вроде метаком со считывателем iron logic часто используют 14 сектор. Его тоже нужно скопировать.
Если 14 сектор не нужен и тот же метаком со старой прошивкой, можно использовать функцию "копирование сектора" или "запись на классик" на сниффере. В этом случае подойдут любые заготовки. Сравнить исходный и записанный ключ можно в приложении MCT. Вообще, рекомендую освоить его функционал - очень полезно.
Другой вариант, ключ не читается или TagInfo выдает что то другое. Попробуйте считать дамп приложением MCT, найдите подходящую заготовку и попробуйте записать. Но в этом случае, лучше использовать проксмарк как максимально функциональный инструмент. Но не факт, что у вас получится.
Возможно исходная метка низкочастотная em-marine. Можно опять же скопировать проксмарком или любым другим совместимым копировальщиком. Например.
Немного о копировальщике/сниффере.
Фнкционал:
-работа с mifare 1k 4 byte
-захват криптоключа(не все считыватели)
-запись на классик(работает с не самыми свежими метакомами, в том числе защищенные)
-запись uid(отличная функция для домофонов домру, beware и похожих - где авторизация по uid)
-копирование сектора целиком
-сброс испорченных заготовок zero и криптоколючей
-база меток(работает криво)
-эмуляция(работает криво)
Отлично дополняет приложение MCT и proxmark. Для простых ключей вполне самостоятельное устройство. Работает с андроид. Внешняя антенна нужна для перехвата и эмуляции.
Пост в том числе для определенных людей. Но в целом, информация будет полезна всем, кто не хочет покупать копировальщик по цене золотого слитка. И напротив, хочет разобраться - как оно работает. Получилось сумбурно. Если есть вопросы, пишите. В течении суток смогу дополнить информацию и ответить на интересующие вопросы. Все актуально для вполне серьезных СКУД работающих с тем же дырявым стандартом.
Мой по прежнему пустой сайт http://safboard.ru/
Моя телега https://t.me/bb773301
Вопросы в комментарии.
p.s. не планировал больше писать на эту тему. Пикабу это все же про сисечки и котиков. Но если вам вдруг интересно что то другое, можете поставить плюс. Пост увидит больше людей и мне будет приятно.
Mifare 1k - самый странный копировальщик на ардуино
Ничего не предвещало беды и вдруг приходит предложение.
Странное тех задание. Но задача крайне простая, решил взяться. В процессе изготовления заказчик попросил добавить функцию записи определенной информации в определенные блоки. А я решил, что неплохо бы помимо смены идентификатора добавить возможность хотя бы копировать его. Иначе копировальщик получился бы совсем странным, без функции копирования. В общем сам навесил на себя доп задач.
В качестве мозгов использовал arduino pro mini. Для работы с mifare модуль RC522. И по мелочи, пищалка, контроллер заряда tp4056 и rbg светодиод для обозначения режимов работы.
Нарисовал плату. Схемы не будет - она стандартная.
Подготовил кусок фольгированного стеклотекстолита. Зачистил наждаком.
Распечатал рисунок дорожек и с помощью тепла, нажима и какой-то там матери перевел на заготовку.
Пора резать и очищать от тонера.
Залудил - покрыл слоем припоя олово-свинец.
Магия монтажа и все компоненты на своих местах.
Припаял АКБ из электронной сигареты.
Осталось подключить модуль RC522 и подклеить, чтобы бутерброд не развалился раньше времени.
Допилил прошивку. Логика работы такая. При включении устройства по умолчанию режим записи случайного UID. Черт бы его знал, зачем это нужно. Будем считать главной функцией и цвет настроения светодиода синий. При коротком нажатии на кнопку, переходим в режим записи заранее(в прошивке) выбранных блоков. Цвет меняется на зеленый. Успешная запись сигнализируется двойным сигналом.
Если сделать длительное нажатие, то перейдем из режимов random uid и write block в режимы чтения и записи uid. В первом светодиод горит фиолетовым. Подносим исходный ключ, а устройство издает сигнал и запоминает uid. Далее переходим в режим записи. Загорается красный и можно любое количество раз записать тот самый uid на заготовку zero. Очень удобно, если нужно сделать много копий для домофона домру или подобных, где авторизация идет по идентификатору. Плюсом можно посмотреть служебную информацию в ком порте.
Заказчик доволен. ТЗ перевыполнено. Завтра плата уезжает в город поребриков и шаверм.
Мой пустой сайт http://safboard.ru/
Телеграм для связи https://t.me/bb773301
Если будет отклик и кто то захочет повторить, пишите в комментарии. Выложу прошивку и плату(если не забуду).
upd. Я таки заказал ещё раз proxmark3 и заготовки cuid от разных поставщиков, fuid и ufuid. Будут обзоры и инструкция по интерфейсу под виндовс для proxmark. О нем почему то знают не только лишь все. Попробую найти в Китае удачные cuid, которые mf3. И посмотрим, обходят ли защиту iron logic заготовки fuid и ufuid. Это кому нибудь интересно?
Ответ на пост «Эмулятор RFID на Arduino»
По просьбам трудящихся @Anonymous2000, @Solutiored выкладываю инструкции по копированию rfid и nfc меток 1k.
Предупреждение: чукча ни разу не писатель, принимайте как есть.
rfid чаще всего используется в качестве пропуска или электронного ключа на различных объектах (школы, универы, турникеты в организациях, шлагбаумы и т.п.) Для их копирования подойдёт обычный китайский копир за +-500р. Рабочие частоты данного копира 125, 250, 375 и 500 кГц. В моём случае подойдёт 125.
Собственно сам процесс копирования выглядит максимально просто - подносим донора, зажимаем левую кнопку до характерного сигнала, затем подносим болванку и записываем дамп в неё.
Копируем NFC
Способов много и самый дешевый из них это обратиться к специалисту. Если ближайший специалист находится в соседнем городе или вам сильно надо сделать всё своими руками - самым простым способом будет купить у китайца ACR122U. В комплекте вы получите диск с драйверами и простенькой китайской программкой (если не получите, ссылки под постом).
Чтобы скопировать пропуск кладём его на считыватель и открываем Mifare decryption, проверяем что устройство обнаружено, тыкаем большую кнопку с кракозябрами и ждём секунд 30 пока не получим *******! в левом нижнем углу
После этого открываем соседнюю Mifare card programming, кладём болванку на считыватель и тыкаем Initialize -> Connect -> Browse - > выбираем наш дамп -> CopyCard
В ролях:
CR66 https://aliexpress.ru/item/1005001617889159.html
ACR122U https://aliexpress.ru/item/1005001780805712.html
Jakcom R3 https://aliexpress.ru/item/32970253877.html
rfid метка пропуска
nfc карта формата 1k
ключ домофона dom.ru
софт Mifare https://dropmefiles.com/yNhdF
(али ссылки указаны для примера, те у кого покупал уже не продают, за этих не ручаюсь)
Эмулятор RFID на Arduino
Мне нравится технология RFID, но карты типа EM Marine совершенно не защищены. Ранее на других ресурсах у меня были публикации как сделать эмулятор буквально на трёх деталях. Но, на деле, этот эмулятор оказался достаточно сложным для повторения.
Поэтому я принял решение сделать такой эмулятор, который может повторить даже ребёнок. Все компоненты продаются чуть ли не в каждой деревне. При этом его функциональность может быть даже расширена. Например, можно сохранять в нём несколько карт или можно добавить ещё считыватель, и сохранять все карты в одном устройстве, или же использовать его для… В общем, поехали.
Аппаратное обеспечение
Как я уже сказал, эмулятор должен быть собран на доступных комплектующих, которые можно легко достать. Для начала рассмотрим схему эмулятора.
У нас есть колебательный контур, который мы будем замыкать в определённое время транзистором и таким образом в считывателе будет изменяться ток, и он будет получать передаваемые данные.
Самым сложным для нас в этой связке остаётся настроенные на частоту 125 кГц колебательный контур. И есть очень простое решение, откуда его можно взять. В продаже существует считыватель RFID-меток для Arduino RDM6300. Считыватель стоит сущие копейки, а у него в комплекте уже идёт антенна, а резонансный конденсатор уже распаян на плате. Таким образом, по сути считыватель нам нужен только для двух деталей: катушки и резонанстного конденсатора.
Считыватель RDM6300 и расположение резонансного конденсатора.
Я купил этот считыватель за какие-то копейки, которые несоизмеримы с трудами по намотке и настройке антенны. Самая сложная операция у нас — это отпаять данный конденсатор и припаять его на монтажную плату. Верю, что с ней справиться даже школьник младших классов.
В результате собираем всё на макетной плате. У меня два резистора в параллели стоит только лишь потому, что на 10кОм резисторов у меня не было под рукой, а были только на 20кОм.
Схема в сборе.
Ну и посмотрим крупным планом, как это всё выглядит. Я специально под конденсатор выделил отдельную платку, там он припаян прямо на монтажные иголки, которые вставлены в этот матрац.
Для того, чтобы проверять работу эмулятора, изначально я думал использовать тот же RDM6300 (купил их два). И даже по началу так и делал, но потом решил, что это как-то не серьёзно, одной Ардуиной отлаживать другую, и разорился на заводской считыватель.
Заводской считыватель.
Взводим таймер
Наиболее полно всю физику процесса и принцип работы я рассказал в своей предыдущей статье, поэтому настоятельно рекомендую с ней ознакомиться. Однако для понимания того, что я делаю немного освежу некоторые моменты.
Напомню, что у EM4102 используется схема Манчестерского кодирования. Когда идёт модуляция EM4102 протокола, время передачи одного бита может составлять 64, 32 или 16 периодов несущей частоты (125 кГц).
Проще говоря, при передаче одного бита, у нас меняется значение либо единицы на нуль (при передаче нуля), либо с нуля на единицу (при передаче единицы). Соответственно, если мы выбираем для передаче одного бита информации 64 периода несущей частоты, то для передачи “полубита” нам нужно будет 32 периода несущей частоты. Таким образом каждый полубит должен меняться с частотой:
f=125000/32 = 3906,25 Гц
ериод этого “полубита” будет равен 256 мкс.
Теперь нам нужно посчитать таймер, чтобы он нам дёргал ногу с данной частотой. Но я стал так ленив, что открыв даташит и начав зевать, решил найти какое-то готовое решение. И оказалось, что есть готовые расчёты таймеров, только вбивай свои данные. Встречайте: калькулятор таймера для Ардуино.
Нам необходимо только забить частоту таймера 3906 Гц, и нам сразу сгенерируют готовый к использованию код. Ну не чудо ли!
Обратите внимание, что частоту я вводил целыми, а он её посчитал дробными и именно ту, которая нам и нужна. Код инициализации таймера у меня получился следующий:
void setupTimer1() {
noInterrupts();
// Clear registers
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// 3906.25 Hz (16000000/((4095+1)*1))
OCR1A = 4095;
// Prescaler 1
TCCR1B |= (1 << CS10);
// Output Compare Match A Interrupt Enable
TIMSK1 |= (1 << OCIE1A);
interrupts();
}
Гениально, просто, лаконично.
Вектор прерывания для вывода устроен тоже очень просто. Напоминаю, что нам необходимо делать переход с единицы на нуль в случае передачи нуля, и с нуля на единицу, в случае передачи единицы (смотрите рисунок для понимания). Поэтому смотрим, что мы сейчас передаём и в каком месте “полубита” находимся, постепенно считывая из массива data все данные.
ISR(TIMER1_COMPA_vect) {
TCNT1=0;
if (((data[byte_counter] << bit_counter)&0x80)==0x00) {
if (half==0) digitalWrite(ANTENNA, LOW);
if (half==1) digitalWrite(ANTENNA, HIGH);
}
else {
if (half==0) digitalWrite(ANTENNA, HIGH);
if (half==1) digitalWrite(ANTENNA, LOW);
}
half++;
if (half==2) {
half=0;
bit_counter++;
if (bit_counter==8) {
bit_counter=0;
byte_counter=(byte_counter+1)%8;
}
}
}
Сорян, код тут плохо вставляется, но вы всегда можете посмотреть исходники на гитхабе.
Перевод данных для передачи
Тут тоже следует освежить в памяти форматы данных, хранимые на карте. То, в каком виде они записаны. Давайте на живом примере.
Предположим у нас есть карта, но нет ридера. На карте написан номер 010,48351.
Реальная карта с номером 010, 48351.
Как этот номер нам перевести в тот серийный номер, который записан на карте? Достаточно просто. Вспоминаем формулу: переводим две части числа отдельно:
010d = 0xA
48351d = 0xBCDF
Итого, серийный номер у нас получается: 0xABCDF. Проверим его, считываем карточку считывателем (он читает в десятичном формате), получаем число:
0000703711
Переводим его любым калькулятором в хекс-формат и получаем снова: 0xABCDF.
Вроде пока просто, погодите, сейчас мозги придётся поднапрячь. Напомню формат данных, которые лежат на самой карте.
Проговорю словами:
1.Вначале идут девять единиц заголовка.
2.Младшие пол байта ID клиента.
3.В конце бит чётности.
4.Вторые пол байта ID клиента.
5.Бит чётности.
6.Младшие пол байта нулевого байта серийного номера.
7.Бит чётности
8.Старшие пол байта данных байта нулевого байта серийного номера.
9.Точно так же все остальные данные, передаются ниблами и оканчиваются битом чётности
10.Самое сложное. Теперь все эти 10 нибблов по вертикали точно так же вычисляется бит чётности (прямо как в таблице).
11.Завершает всё это безобразие стоп бит, который равен всегда нулю.
Итого у нас получается 64 бита данных (это из пяти байт!). В качестве ремарки, мой считыватель не читает ID-клиента, и я его принимаю равным нулю.
Что такое бит чётности? Это количество единиц в посылке: если оно чётное, то бит чётности равен нулю, если нет, то единице. Проще всего рассчитать его, просто обычным XOR.
На самом деле я долго думал, как элегантнее сделать пересчёт серийного номера в посылку, да так чтобы это занимало меньше места в микроконтроллере. Поэтому набросал небольшую программку, которая это делает и на ней оттестировался.
Самое важное для нас, это то как будет выглядеть биты чётности. Для удобства я сделал вывод на экран точно так же, как в этой табличке. В результате получилось вот так.
card_id — это серийный номер карты (о котором мы говорили выше).
Первый столбец — это ниблы, второй — их битовое представление, третий — это бит чётности. Третья строка снизу — это биты чётности всех ниблов. Как я уже сказал, они рассчитываются просто операцией XOR.
Протестировав расчёты, сверив из визуально, я проверил получившиеся данные в программе на Arduino (последняя строка специально для вставки в код). Всё отработало отлично. В результате наброска этой программы, я получил готовую функцию пересчёта. Раньше, расчёты битов были чужими программами на компе и мне не нравилась их монструозная реализация. Таким образом функция пересчёта серийного номера в формат передачи выглядит так:
#define CARD_ID 0xABCDF
uint8_t data[8];
void data_card_ul() {
uint64_t card_id = (uint64_t)CARD_ID;
uint64_t data_card_ul = (uint64_t)0x1FFF; //first 9 bit as 1
int32_t i;
uint8_t tmp_nybble;
uint8_t column_parity_bits = 0;
for (i = 9; i >= 0; i--) { //5 bytes = 10 nybbles
tmp_nybble = (uint8_t) (0x0f & (card_id >> i*4));
data_card_ul = (data_card_ul << 4) | tmp_nybble;
data_card_ul = (data_card_ul << 1) | ((tmp_nybble >> 3 & 0x01) ^ (tmp_nybble >> 2 & 0x01) ^\
(tmp_nybble >> 1 & 0x01) ^ (tmp_nybble & 0x01));
column_parity_bits ^= tmp_nybble;
}
data_card_ul = (data_card_ul << 4) | column_parity_bits;
data_card_ul = (data_card_ul << 1); //1 stop bit = 0
for (i = 0; i < 8; i++) {
data[i] = (uint8_t)(0xFF & (data_card_ul >> (7 - i) * 8));
}
}
Всё, можно переходить к полевым испытаниям. Исходный код проекта обитает тут.
Испытания
Как говориться, лучше один раз увидеть, чем тысячу раз прочитать. Специально для вас записал кино о работе этого эмулятора. Хотел его протестировать на реальном железе, и попробовать пробраться в офис с помощью Arduino, но с проклятой пандемией туда не пускают. Поэтому натурные испытания придётся смотреть на столе, в лабораторных условиях.
Выводы
Очень надеюсь, что подобные статьи подстегнуть новичков изучать программирование и электронику. А так же они поспособствуют уходу с рынка такого типа карт, как самых незащищённых и небезопасных, поскольку теперь их может скопировать и эмулировать даже ребёнок.
Выражаю благодарность Michal Krumnikl за его терпение много-много лет назад, когда он мне по icq разъяснял работу подобного эмулятора, а так же помощь с разработкой кода. В некотором смысле это его идеи и наработки 13-ти летней давности.
Ссылки
* Unique (EM4001) RFID Emulator
З.Ы. Ранее эта статья была опубликована мной на хабре.
Хорошо разбираетесь в звездах и юморе?
Тогда этот вызов для вас! Мы зашифровали звездных капитанов команд нового юмористического шоу, ваша задача — угадать, кто возглавил каждую из них.
Переходите по ссылке и проверьте свою юмористическую интуицию!