Это просто история о том, как реверс мне помог решить производственную задачу. Здесь не будет полезных рекомендаций или фрагментов кода, это лишь рассказ о проблеме и решении.
2010 год: Я работал на одном промышленном предприятии. За пару лет до моего прихода они закупили комплект автоматики у другого подобного предприятия. Как это часто бывает, сначала какая-то организация делает автоматику для решения своих задач, а затем, видя успешность своего решения, начинает продавать это решение себе подобным.
Так вот, автоматика закуплена, настроена и все работает. Это программно-аппаратный комплекс. Контроллеры, управляющие силовыми установками, и программа, со SCADA-подобным интерфейсом, которая схематично отражает производственный процесс на экране. Контроллеры общались со штатным ПО по modbus. У контроллеров есть небольшой экран и несколько кнопок. Контроллером можно управлять с его собственной панели управления, можно с пульта оператора или через modbus. У контроллера есть отдельный разъем для вывода его кнопок на обычный пульт оператора.
В чем основной смысл штатного ПО, помимо SCADA интерфейса. Оно позволяло отправить на контроллер последовательность операций, типа сделай "это", "это" и вот "это" и сказать "приступай". И контроллер начинал исполнять операции последовательно.
Руководство предприятия не устраивала та логика, которая была в коробочном ПО. Они хотели вкрутить свой процесс. Надо отметить, что в лучших традициях СССР вместе с контроллерами поставлялась подробная документация. Описание протокола, схемы подключения, команды, регистры.
Полистав документацию, я решил, что мы сможем реализовать дополнительную логику, о которой просило руководство. Правда, с modbus на тот момент я не был знаком.
Нашел спецификацию, почитал. Понял, как это работает. Чтобы не тратить время на написание своего экспериментального кода, я решил для пробы скачать готовую программу, чтобы просто отправить сообщение в порт. В доке было сказано, что устройство использует режим ASCII.
Сформировал запрос ручками, рассчитал контрольную сумму, отправляю.
:1103006B00037E<CR><LF>
Устройство мне не отвечает. Хм..
Я скачал другую программу, итог тот же самый - нет ответа.
При этом штатная программа прямо в этот момент с того же компа общается без проблем.
Запустил снифер, стал смотреть, как они общаются. Ага, пакеты бегают. Запускаю из штатного ПО такую же операцию, которую собирал руками и вижу, что все значения как у меня - адрес, функция, регистр, но контрольная сумма отличается - 18 вместо 7E.
:1103006B000318<CR><LF>
Если просто копирую это штатные сообщения из снифера и отправляю в порт, ответ от устройства приходит.
Странное дело. Еще раз перечитал спецификацию протокола, перепроверил свою LRC - ну у меня все правильно! Откуда у контроллера получается 18?
Поискал в интернетах. Нашел готовую софтину именно для modbus, там через выпадающие списки выбираются адрес, функция, регистр, а контрольная сумма вычисляется автоматически и она - такая же 7E, как у меня! WTF?
Я пробовал разные варианты расчета, пытался подобрать принцип, но безуспешно.
Руководство жмет - ты же сказал, что там особых проблем не будет!
Выбора не было, запустил отладку в дизассемблере. Тогда опыта работы с ним тоже не было, максимум пробовал в студенческие годы менять je на jne, когда читал статейки про то, как ломают софт.
В общем, разобравшись с отладчиком, нашел в штатном ПО место обработки пакета и начал пошагово смотреть, что происходит.
О боги! Вот оно что!
Сообщение для отправки
11 03 00 6B 00 03
По спецификации вычислять надо просто
11 + 03 + 00 + 6B + 00 + 03 = 82
FF - 82 = 7D
7D + 01 = 7E
Ведь в сообщении уже HEX
А разработчики зачем-то сначала преобразовывали символы в их коды, то есть 1 в код символа 31 и суммировали преобразованные значения
31 + 31 + 30 + 33 + 30 + 30 + 36 + 42 + 30 + 30 + 30 + 33 = 2E8
После этого открытия обмен сообщениями пошел как надо. Моему счастью не было предела.
Если бы modbus завелся с полпинка, то это не принесло бы мне столько положительных эмоций. А при сложившихся обстоятельствах я эти эмоции получил :-)
Наверняка у вас тоже бывало нечто подобное - расскажите в коментах.
Комментарии (5)

DanilinS
16.10.2025 14:50Странно, что на всех этапах разработки отсутствовали попытки взаимодействовать с устройством при помощи любого "Modbus-терминала" или стандартной библиотеки.

DanilinS
16.10.2025 14:50Это напоминает мне опрос одних терминалов защиты по IEC 60870-5-101. Обвязываю, телемеханики, прописываю опрос. Канал поднялся, данные в канале пошли. В сервере - пусто. Не видит данные. Что-то идет, но данных нет.
Сажусь на сервер, включаю просмотр "сырых" данных, пытаюсь разобраться с обменом. И с удивлением вижу криво реализованный протокол. При этом с своей заводской утилитой обмен нормальный.
Или заводские приколы с ЭНИП-2. Приехали, смонтировали, включили. Пытаюсь подключиться конфигуратором - "прибор не найден". Даже если через USB подключиться.
3 дня поиска своих косяков - не найдено. Проверка версии конфигуратора - самая свежая на сайте.
Звоню на завод: "Конфигурирование возможно только самой свежей версией конфигуратора. Но на сайте ее нет - мы обнаружили там сбои и временно убрали версию на доработку. Через 2-3 недели выложим". Ага. Ая сижу в мордовских лесах на объекте.
Еле уговорил скинуть мне на почту сырую версию под мою ответственность. Только так и сконфигурировал.
DanilinS
Фактически это уже не Modbus.
При большом желании можно сильно наехать на производителя, что под видом стандартного протокола Modbus производиться что-то проприетарное.
rt001 Автор
Не думаю, что они сделали это специально. Просто сами немного недопоняли алгоритм, поэтому он у них такой получился. Они шли на контакт без проблем. Я разговаривал с ними по телефону (еще до дизассемблера), пытаясь выяснить алгоритм контрольной суммы. Они искренне не понимали моего вопроса, ссылаясь на спецификацию modbus, что у них все сделано ровно как там написано. Документация к устройствам была подробная, к ней вопросов не было. Кроме того они предоставили испытательный стенд, который сами использовали - коробочка с разъемами, которая подключалась к контроллеру и эмулировала тензодатчики, концевики и силовые установки. Понятно, что внутри там пара конденсаторов с сопротивлениями и реле. Но это готовое устройство. Подключил и работай. Цена там какая-то смешная была, в районе 5к. Адамовские I/O модули стоили дороже.