Что можно сделать через разъем OBD в автомобиле

Ни для кого не секрет, что в современных автомобилях все системы под завязку забиты различной электроникой, даже простой стеклоподъемник имеет собственный микроконтроллер и адрес в общей сети. Мне, как интересующемуся владельцу, стало интересно, что же можно сделать имея просто доступ к разъему OBD и ничего более.
Все описанное в статье относится к автомобилю 2008 года (Mitsubishi Lancer), но как показала практика, спустя 10 лет у производителя ничего не изменилось и все функции продолжают использоваться и работать на современных авто.

Строение сети в автомобиле изображено на картинке:

image

В машине имеются 3 CAN шины (скоростная шина двигателя 500kbps, низкоскоростная салонная 83.3 kbps, диагностическая) и одна шина LIN. Связующим звеном между ними является блок ETACS (Electronic Total Automobile Control System), который выступает «шлюзом» и пересылает сообщения из одной шины в другую, по определенным правилам, а также занимается обработкой некоторых из них. Что же можно сделать с CAN шиной? Например, пообщаться с блоками, а может и что-нибудь изменить. Чтобы начать диалог с любым блоком необходимо знать его адрес, а также поддерживаемые функции (PID), которые он сможет обработать и дать ответ.

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

О адресах (запрос-ответ) в CAN сети:

image

PID’ы запросов, полные расшифровки ответов от всех блоков, включая положение байт в ответе (если за один кадр отправляются несколько значений) и множители с единицами измерений:

image

Например, хотим мы узнать угол поворота рулевого колеса. Для этого отправим в блок управления ESP команду 2102. В ответ прилетит сообщение 6102 FFEA000008FFF302

Взглянув в таблицу, узнаем, что нужны байты 2 и 3.

image

Значение в int16. 0xFFEA = -22, умножая на коэффициент 0,04375 получаем угол поворота руля -0,9625 градуса.

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

image


Хорошо, все что хотели мы узнали, а какая от этого польза? Вот если что-нибудь изменить/включить/отключить…

Простой пример. В блоке управления автоматической коробкой передач есть программный счетчик уровня старения масла и при накоплении определенного порогового значения на экране бк появляется сообщение о том, что необходимо произвести обслуживание трансмиссии. Масло поменяли, а сообщение продолжает отображаться на экране, ведь счетчик никто не сбросил и сбросить может только дилерский сканер MUT-III (который стоит около 1000$, не каждый может себе такое позволить) и некоторые программы (тоже не бесплатные). Все в тех же таблицах можно найти команду под говорящим само за себя названием CLEAR_CVT_oil_degradation_level_Start. Можно злобно посмеяться в сторону ОД и самому сбросить этот злополучный счетчик. Отправляем команду 3103 в блок CVT и… получаем в ответ 7F3133.

Небольшое отступление. Почти во всех автомобилях для проведения диагностики и обслуживания используется механизм UDS (он же ISO 14229).

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

В итоге имеем расшифрованный ответ от вариатора: 7F — запрос отклонен, 31 — это PID, который мы отправляли и Negative response code 33, а именно Security Access Denied. То есть, у нас нет прав на изменение или запрос этой функции. У кого же она есть?

Отступление 2. В UDS используется механизм разграничения доступа по нескольким уровням — обычная диагностическая сессия, расширенная сессия, сессия программирования и т.п. В каждой сессии присутствуют уровни допуска, которые решают, что вам можно, а что нет. Чтобы получить доступ к ним, необходимо запросить у блока так называемый Seed, обработать его определенным алгоритмом и отправить обратно в блок (Key). Подробнее можно почитать тут.

Попробуем запросить seed. Отправляем в ECU команду 2701 и получаем в ответ 6701 6A43FD3C.
Отправив в ответ любое 4-байтное значение (27 02 DEADBEEF), получим в ответ 7F2735, где 35 это Invalid Key (неверный ключ), т.к. было отправлено значение «с потолка». Где же искать алгоритм вычисления ключа? В прошивке блока управления, больше негде. Достать его достаточно легко (но не на всех блоках, все зависит от используемого микроконтроллера), сначала находим обработчик приема CAN, затем функцию обработки PID 0×27.

image

Повторив обмен seed-key с алгоритмом из прошивки получим в ответ 6702 34, где 34 это «Доступ разрешен». После этого команда на сброс уровня деградации масла успешно отрабатывает и возвращает не negative response code, а положительный ответ 7103 01 и счетчик успешно сбрасывается.

Таким образом, через OBD разъем можно делать с автомобилем практически все: менять VIN номера в блоках, настраивать кодировку (конфигурацию), менее чем за секунду отключить иммобилайзер, очищать информацию об ошибках, вводить блок в состояние загрузки, когда можно загрузить в RAM контроллера любой код и выполнить его. Система безопасности у японцев слегка хромает.

Пример изменения конфигурации на видео:


Статья написана исключительно в ознакомительных целях. Любое вмешательство в электронные блоки управления автомобиля может стать для них последним. Всем хорошего дня!

© Habrahabr.ru