Рубрика развивается при поддержке
Advertisement

Промышленный реверс-инжиниринг

Рассказ о процессе заимствования при разработке электроники на наглядном примере.

Запись лога работы лифта самодельным сниффером

Однажды мне понадобилось скопировать довольно простое устройство. Компания-производитель перестала существовать, но по всей стране ещё был спрос на замену сломанных или отработавших свой ресурс девайсов.

Само устройство — кнопка вызова лифта на фото слева. Для опытов мне дали два экземпляра, один из которых можно было полностью разобрать.

Общий план работы выглядел примерно так:

  1. Изучение схемы подключения платы;
  2. Изучение элементной базы самой платы;
  3. Срисовывание её электрической схемы;
  4. Попытка считывания файла прошивки из микроконтроллера;
  5. Дизассемблирование прошивки;
  6. Извлечение алгоритма работы;
  7. Разработка новой платы;
  8. Написание новой прошивки.

При неудаче пункта 4, дальнейший план выглядел бы сложнее, но мне повезло.

Изучаем подопытного

Плата собрана на микроконтроллере 1997 года выпуска AT89C2051, в основе которого лежит архитектура Intel MCS-51. В 2020 году она празднует свой 40-летний юбилей на рынке встраиваемых систем.

Небольшое пояснение: микроконтроллер — это такая микросхема, содержащая вычислительное ядро и набор периферии для управления внешними устройствами. Например, в современной стиральной машине микроконтроллер опрашивает кнопки управления, датчики, выводит информацию на экран и управляет насосами, нагревателем, клапанами и приводом барабана. Для большинства перечисленных функций ему не требуются промежуточные устройства, только набор пассивных электронных компонентов.

Разбираем плату для срисовывания электросхемы

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

Оригинальное устройство разработано китайской компанией, а потому его схема крайне запутана и со множеством лишних компонентов. Например, включение реле производилось через тройной каскад из биполярного транзистора, оптопары и полевика (именно в таком порядке).

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

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

Схема срисована, загадочные места смоделированы в мультисиме, берёмся за прошивку.

Пытаемся считать прошивку

Мне очень повезло, что на обоих платах в контроллерах не включена защита от чтения, поэтому я успешно слил два варианта прошивки подобной порнографией:

Фото из личного блога американского энтузиаста

Дизассемблирование прошивки

Следующим этапом нам нужно преобразовать этот машинный код во что-то более читаемое:

Берём известный инструмент IDA Pro, в котором уже есть наш контроллер со всеми регистрами периферии, и открываем HEX файл прошивки:

После этого идёт довольно нудный процесс изучения набора команд нашего вычислительного ядра, комментирование и расшифровка ассемблерного кода.

По адресам таблицы векторов прерываний нашлись сами обработчики прерываний, записи в регистры периферии дали информацию о конфигурации интерфейса связи. Шаг за шагом безымянный ассемблерный код превратился в то, что можно читать.

Извлечение алгоритма работы

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

Та же самая обработка принимаемых данных на языке Си

Кому интересен протокол передачи:

Станция управления лифтом общалась с платами кнопок вызовов по полнодуплексному 24-вольтовому интерфейсу. В обычном режиме платы кнопок слушали линию, ожидая 9-битный пакет данных. Если в этом пакете приходил адрес нашей платы (задавался DIP-переключателем на плате), то плата переключалась на 8-битный режим приёма, и все последующие пакеты аппаратно игнорировались остальными платами.

Первым после адреса шёл пакет с кодом команды управления. Конкретно эта плата принимала всего 3 команды:

1. Запись в регистры данных. Например частота и длительность мигания кнопки при вызове;

2. Включение подсветки кнопок;

3. Запрос состояния кнопок (нажаты или нет).

Последним байтом шла контрольная сумма, которая представляет собой простой XOR всех байт после адреса.

После контрольной суммы плата опять переходила в режим ожидания своего адреса.

Разработка новой платы

Для этапа разработки новой электросхемы и печатной платы у меня нет картинок, но всё было примерно так:

Составление электросхемы и разводка платы делались в Altium Designer. Изготовление печатной платы заказывалось в зеленоградском «Резоните».

Написание новой прошивки

Пока наша новая плата на изготовлении, едем на объект, где установлены такие кнопки вызова, и проверяем правильность разобранного протокола передачи с помощью собранного на ардуине сниффера:

Дальше нужно было действовать крайне аккуратно, чтобы не спалить ничего в лифте и не допустить его остановки.

Проверяем, что всё работает как надо, исправляем косяки и пишем новую прошивку под наше устройство:

Код на Си для новой платы на основе микроконтроллера AVR ATmega328P

Простоту устройства и прошивки можно оценить по объёму кода, он содержит всего лишь около 600 строк на языке Си.

Процесс сборки выглядел так:

Да, плата другая, но станок тот же

Фотографию готового устройства приложить не могу, просто поверьте, что оно до сих пор производится и продаётся.

Лирическое заключение

По поводу кнопок лифта «вверх» и «вниз» на этаже. Я заметил, что многие люди совершенно не понимают их назначение и жмут обе сразу.

У лифта есть два набора кнопок: в кабине — панель приказов, и на этаже — панель вызова. Уже по названию можно догадаться, что панель приказов имеет более высокий приоритет управления.

Все лифты, имеющие панели вызовов с кнопками «вверх» и «вниз», работают с каким-то из вариантов алгоритма оптимизации поездок, целью которых является перевозка максимального числа пассажиров за минимальное время и отдельное условие максимального времени ожидания на этаже (регулируется госстандартом).

Такой алгоритм обычно предполагает подбор пассажиров на этажах, если они едут в том же направлении, которое указывают нажатием кнопки вызова «вверх» или «вниз».

Представим ситуацию, что лифт с пассажирами едет вниз и по пути получает с этажа ниже вызов «вниз». Лифт остановится для подбора пассажира (да, есть ещё учёт загрузки кабины по весовому датчику, но его мы опустим).

Лифт едет дальше и получает с этажа ниже вызов «вверх». Логично, что лифт не остановится для подбора пассажира, так как не будет менять направление движения (это тоже регулируется стандартом), а подбирать пассажира, чтобы поехать вниз, а затем вверх — бесполезный расход энергии и места в лифте.

Лифт едет дальше и получает с этажа ниже сразу два вызова «вверх и «вниз», которые нажал какой-то нетерпеливый пассажир, которому нужно ехать вверх. Логично, что лифт остановится на этом этаже, но пассажир в него не войдёт, зато потратит время людей в кабине на замедление и остановку лифта, открытие дверей, ожидание, закрытие дверей и разгон до номинальной скорости.

Если у лифта только одна кнопка на этаже, то в 99% случаев он работает по алгоритму «собирательный вниз», и при наличии приказов в кабине останавливается только при движении вниз.

Если у вас есть навыки программирования на JS, то можете попробовать реализовать подобный алгоритм управления в онлайновой игре Elevator Saga. В ней есть все аспекты оптимизации поездок без углубления в хардкор вроде работы цепей безопасности лифта.

Я завёл себе телеграм-канал, где буду выкладывать подобные материалы. Прямо сейчас там можно следить за разработкой очередного устройства.

Отдельное спасибо Роману Персианинову, который помог это всё прилично оформить.

0
101 комментарий
Популярные
По порядку
Написать комментарий...
Террористический месяц

Крутой материал

61

Если вам реально интересна тематика реверс-инжиниринга, заходите к нам в блог, мы там вообще делаем самодельный жёсткий диск (за исключением пластин, головок и подобного, разумеется) с подробным описанием процесса:

https://blog.rlab.ru/tags/reverse-engineering

Также тэг "Сделай сам" (/diy) посмотрите.

1
Террористический месяц

Такое лучше в твиттер писать, как раз каждый пост в 140 символов уместится.

0

Почти нихера не понял, но круто!

23

Материал хороший, но на хабре же больше ЦА

9
Террористический месяц

Не пользуюсь хабром и не люблю тамошнюю публику.

38

Хозяин — барин!

Просто достаточно странный выбор площадки для такого контента. Тут как-то лучше заходят тренды (особенно тренды двухлетний давности), прямые эфиры из психиатрических лечебниц, мэмы с котами, ЛГБТ (даже если новость совершенно не о ЛГБТ, кого ебёт?), православие и т.д. Но такое... ¯\_(ツ)_/¯

11

Поддержу. Если и захожу туда, то ни в коем случае не читаю комменты. Такого сборища напыщенных, пытающихся унизить друг друга пидоров больше нет нигде.

Материал топ.

10

Комментарий удален по просьбе пользователя

14

Если в торговом центре все едут с первого этажа на третий и выше, а ты на втором и тебе нужно вверх, то есть смысл нажать обе кнопки. Так я попаду в лифт на пути вниз и гарантированно уеду наверх. В противном случае, лифт может заполниться пассажирами на первом этаже и не остановится на моем этаже на пути вверх.

0
Террористический месяц

Люблю таких задротов! Храни вас господь!

12

перенесите в /dev

6

чё вы минусуете? нахуя тогда этот подсайт? ред.

4
Террористический месяц

dev 2 975 подписчиков
flood 247 998 подписчиков

12
Террористический месяц

Педрильный клуб любителей пощекотать очко

11

Ты не туда воюешь

3

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

Еще вопросы?

2

Комментарий удален по просьбе пользователя

10
Террористический месяц

t.me/govnokoder

Козуля, ТЫ?

6
Террористический месяц

Я за него!

5

Ну нахер. Я лучше по лестнице пойду

3
Террористический месяц

Тут поддержу, это всегда безопаснее.

13
Террористический месяц

Интересно, а есть ли какая-то реализация вызова в приоритете грузового лифта над пассажирским. Допустим через зажатие кнопки или двойное нажатие.

3
Террористический месяц

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

10
Террористический месяц

Было бы совсем замечательно, встроить слабый электрошок в кнопку, который срабатывает от нажатия 3 раз и более (если уже вызвали).

9

Комментарий удален по просьбе пользователя

4

Комментарий удален по просьбе пользователя

8

Комментарий удален по просьбе пользователя

3

Первый текст, который я сегодня прочитал от начала до конца.

6

Комментарий удален по просьбе пользователя

2
Террористический месяц

Там с каждой кнопки непосредственно выведены провода в станцию управления, а сама станция собрана на релейной логике.

8

Комментарий удален по просьбе пользователя

4

Всегда мечтал сделать в лифте бэкдор, чтобы можно было зажать кнопку и без остановки опуститься/подняться на нужный этаж. ред.

3
Террористический месяц

Почти во всех кабинах есть место для пожарного ключа. Оно это делает.
Поворачиваешь ключ и нажимаешь кнопку, например, первого этажа — лифт едет вниз и после отпускания кнопки останавливается на ближайшем этаже. Так же и вверх по кнопке второго этажа. ред.

2

А лифт не сообщает куда-нибудь, что ключ был использован? И продаются ли такие ключи?

3

Сколько ты заработал на этом реинжиниринге?

1
Террористический месяц

Я тогда за зарплату работал. С изготовлением платы всё заняло около 3 недель.

2

А если бы ты был на фрилансе и тебе поступил такой заказ, какая вилка примерно будет на такую работу сейчас?

0

Ну нахер, прям на лифт с кнопками то присесть и послушать было бы поприятнее. Тем более, что по описанию протокол похож на модбас.

1

Ну раз ты такой любитель асма, зацени тему, читал вместо детектива недавно - https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=152092

1
Террористический месяц

Великолепная история, но там сразу предположили контрольную сумму прошивки.

0

Выглядит, как большой геморрой. Разве нельзя найти готовую плату в том же Китае и прошить?

0
Террористический месяц

Это очень узкая область автоматизации и потому такое оборудование только от производителя.

3

Интересуюсь, интересно. Полезно. 😌

1

Это тебе по работе надо было, или в доме лифт сломался?

1
Террористический месяц

Работа.

0

Комментарий удален по просьбе пользователя

1
Террористический месяц

Чтобы сократить число проводов. Так на все кнопки для подсветки и получения состояния кнопок нужно два провода питания и два провода шины связи.

0

Супер познавательно и круто! Благодарю.

1
Террористический месяц
1

Логично, что лифт остановится на этом этаже, но пассажир в него не войдёт, зато потратит время людей в кабине на замедление и остановку лифта, открытие дверей, ожидание, закрытие дверей и разгон до номинальной скорости.

Я работаю в здании именно с такими кнопками, и это настоящая боль.
но пассажир в него не войдёт

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

1
Террористический месяц

Просто студенты тупые. Сам таким был.

0

А если б она была защищена от чтения?

0
Террористический месяц

Тогда в зубы логический анализатор и снифать сигналы прямо с ног микросхемы. Это всё становится сложнее, когда узнаёшь, что пины контроллера мультиплексированы не только на несколько функций, но и по назначению «вход» и «выход».

0

Хах! Ещё как!)
(Я и остальные случайные читатели с заумным видом киваем головами, ничего не понимая:)

3

В видосе типа домашний станок? Как он захватывает элементы - присосом? А пайка как происходит? Сколько такой стоит?

0
Террористический месяц

Нет, это промышленный на моей старой работе. http://www.mechatronika.com.pl/content/view/20/4/lang,en/

Если не ошибаюсь, тогда он стоил около 4 миллионов рублей. +Питатели.

1

В детстве из лифтерской катали народ вверх вниз в лифтах, там панель управления приоритет имела видимо над лифтовой, бывало и по 15 минут туда/сюда ездили люди xD

0
Террористический месяц

Да, от самой станции есть возможность управления для аварийной эвакуации.

0

А как реализуются упомянутые в материале алгоритмы безопасности, особенно в современных высотках. Меняется ли скорость движения, допустимый вес и прочее?
Пардон если вопрос скомкан

0
Террористический месяц

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

0
Террористический месяц

У лифта обычно одна номинальная скорость и скорость «дотягивания», которая используется при приближении к месту остановки или при поездке на соседний этаж. Так и на двухскоростных лифтах и на лифтах с регулируемым приводом.

0

Я завёл себе телеграм-канал

Я должен был догадаться...

0
Террористический месяц

Молодец. Ты кто?

0

пользователь сайта tjournal. а ты?

0

Комментарий удален по просьбе пользователя

0

Хм, а есть ли схема, чтобы тех, кто нажимает сразу обе кнопки било 220в? Можно без заземления. Буду благодарен.

0

Первую фотку я бы назвал "Пингуем лифтовую кнопку"

0

Откуда в дизассембле отладочные символы? Вы же не ELF туда загружали

0
Террористический месяц

Это уже с моими комментариями и именованиями. Ещё для конкретного контроллера в IDA есть сразу разбор регистров и имён прерываний.

0
Террористический месяц

перенесите в хабр

–6
Читать все 101 комментарий
null