Все описанное в статье относится к автомобилю 2008 года (Mitsubishi Lancer), но как показала практика, спустя 10 лет у производителя ничего не изменилось и все функции продолжают использоваться и работать на современных авто.
Строение сети в автомобиле изображено на картинке:
В машине имеются 3 CAN шины (скоростная шина двигателя 500kbps, низкоскоростная салонная 83.3 kbps, диагностическая) и одна шина LIN. Связующим звеном между ними является блок ETACS (Electronic Total Automobile Control System), который выступает «шлюзом» и пересылает сообщения из одной шины в другую, по определенным правилам, а также занимается обработкой некоторых из них. Что же можно сделать с CAN шиной? Например, пообщаться с блоками, а может и что-нибудь изменить. Чтобы начать диалог с любым блоком необходимо знать его адрес, а также поддерживаемые функции (PID), которые он сможет обработать и дать ответ.
В открытом доступе лежит ПО для дилерских центров под названием MUT III. Изучив базы данных из него, можно найти всю интересующую нас информацию.
О адресах (запрос-ответ) в CAN сети:
PID'ы запросов, полные расшифровки ответов от всех блоков, включая положение байт в ответе (если за один кадр отправляются несколько значений) и множители с единицами измерений:
Например, хотим мы узнать угол поворота рулевого колеса. Для этого отправим в блок управления ESP команду 2102. В ответ прилетит сообщение 6102 FFEA000008FFF302
Взглянув в таблицу, узнаем, что нужны байты 2 и 3.
Значение в int16. 0xFFEA = -22, умножая на коэффициент 0,04375 получаем угол поворота руля -0,9625 градуса.
Таким образом можно запросить из блоков управления очень много информации, вплоть до того, сколько часов играло радио и сколько дисков было загружено в магнитолу, а также запускать диагностические проверки на всех узлах (можно на приборной панели включать разные лампочки и дергать стрелки, например).
Хорошо, все что хотели мы узнали, а какая от этого польза? Вот если что-нибудь изменить/включить/отключить…
Простой пример. В блоке управления автоматической коробкой передач есть программный счетчик уровня старения масла и при накоплении определенного порогового значения на экране бк появляется сообщение о том, что необходимо произвести обслуживание трансмиссии. Масло поменяли, а сообщение продолжает отображаться на экране, ведь счетчик никто не сбросил и сбросить может только дилерский сканер 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 0x27.
Повторив обмен seed-key с алгоритмом из прошивки получим в ответ 6702 34, где 34 это «Доступ разрешен». После этого команда на сброс уровня деградации масла успешно отрабатывает и возвращает не negative response code, а положительный ответ 7103 01 и счетчик успешно сбрасывается.
Таким образом, через OBD разъем можно делать с автомобилем практически все: менять VIN номера в блоках, настраивать кодировку (конфигурацию), менее чем за секунду отключить иммобилайзер, очищать информацию об ошибках, вводить блок в состояние загрузки, когда можно загрузить в RAM контроллера любой код и выполнить его. Система безопасности у японцев слегка хромает.
Пример изменения конфигурации на видео:
Статья написана исключительно в ознакомительных целях. Любое вмешательство в электронные блоки управления автомобиля может стать для них последним. Всем хорошего дня!
Комментарии (58)
Unkn0wnUserName
19.04.2019 11:19главное — не послать не туда не ту команду…
кое-кто имел опыт убивания блока управления ЦВТ :)
Unkn0wnUserName
19.04.2019 11:28Повторив обмен seed-key с алгоритмом из прошивки получим в ответ 6702 34, где 34 это «Доступ разрешен».
А можно поинтересоваться алгоритмом?emmibox
19.04.2019 14:03так он есть же на картинке статье…
esaulenka
22.04.2019 17:31Там константы замазаны.
Впрочем, можно поснимать штук н-цать логов с родного MUT-3 и попробовать перебрать значения. Там, насколько я понимаю, 16 (начальное значение) + 8 (множитель 1) + 8 (множитель 2) бит перебирать, по современным меркам — любой калькулятор справится.
Автору в любом случае спасибо, занятная информация.esaulenka
22.04.2019 19:18Получилось даже смешнее. Смотрим видео в этой статье, ищем мануал на ассемблер этого странного процессора (lsr2, lsl2 я никогда раньше не встречал), и… оп! готово! Прямо не вставая с дивана.
PS остался главный вопрос. Зачем я этим занимался?.. Оно ж мне нафиг не надо…
Buzzzzer
19.04.2019 12:18Когда у меня был Lancer X, я его настраивал через Lexia 3, купленную у китайцев.
Еще по такому же протоколу работает ряд французов.
С одним пареньком, который написал свою софтинку под Windows даже хотели написать Android-программу для Lexia через usb-otg.
Я научился обмениваться «приветствием» с Lexia, определять машину.
Но дальше, по некоторым причинам, всё заглохло и я передал исходники.
Не знаю, чем закончилось дело…kolyandex Автор
19.04.2019 12:24Еще по такому же протоколу работает ряд французов.
А именно Peugeot 4007/4008 и Citroen C-crosser (это те же аутлендеры, только со своим шильдиком)Unkn0wnUserName
19.04.2019 12:49Есть еще Dodge caliber и Jeep Compass, построенные на той же базе. Но там есть некоторые отличия… иногда неприятные.
VioletGiraffe
19.04.2019 13:12Пользуясь случаем, хочу спросить: кто-то пытался программно реализовывать на микроконтроллере LIN slave через GPIO, без хардварных трансиверов? Встала сейчас такая задача с целью ремонта сдохшего электронного блока, но очень мало инфы по этой теме. Обычно под Ардуино для любой ерунды есть готовая библиотека, а для LIN нет, хотя это же очень интересно и потенциально открывает возможности интересных доработок.
JerleShannara
19.04.2019 16:35А зачем оно надо? Берем нормальный микроконтроллер, берем RS232-LIN преобразователь и спокойно работаем по USART
VioletGiraffe
19.04.2019 16:45Преобразователь — лишняя железка, которую нужно искать, заказывать, ждать, осваивать программирование, ещё и лишняя точка отказа. Хотелось избежать. Там 20 кбит/с, не понимаю, в чём проблема сэмплировать линию через GPIO. Единственное, что — посылать данные неудобно, надо какой-то ключевой транзистор изобретать.
JerleShannara
19.04.2019 17:39+1Преобразователь это железка, которую надо тупо подключить, и ничего осваивать не надо, т.к. далее идёт просто преобразование RS232 в LIN. Кроме того у МК спокойно бывают UARTы, которые из коробки могут работать в UART/USART/LIN/ISO7816 и т.д.
А если так беспокоит надежность, то возникает вопрос: а почему вообще взгляд был на ардуино, там и код и железо весьма паршивого качества.
Dima_Sharihin
19.04.2019 16:52Хардварный трансивер стоит копейки, геморроя не в пример меньше, зачем оно вам.
VioletGiraffe
19.04.2019 17:12Большое спасибо, изучу даташит. Беглый запрос в гугле показал, что купить их у нас похоже, негде; может, какой-то другой аналог меня спасёт.
GloooM
19.04.2019 21:35+1Можете искать трансиверы для k-line, физически это тоже самое что и LIN шина, ISO 9141 интерфейс. TJA1020 или L9637 из популярных.
esaulenka
22.04.2019 17:42Вот да, TJA1020 продают в чип-дипе.
www.chipdip.ru/product/tja1020t-cm.118
Если не хочется заморочек с ЛУТом, можно поискать LIN Shield у китайцев. Кажется, я что-то подобное видел.
Dima_Sharihin
20.04.2019 10:31Если проявите минимальную активность на сайте e2e.ti.com (а именно: зададите вопрос по существу, вам на него ответят и вы пометите ответ, как полезный и так несколько раз), то для TI Store дают купон на бесплатную доставку (доставляют они обычно FedEx'ом, а это не в пример молниеносно быстрее, чем покупать что либо на алиэкспрессе, обычно за неделю из штатов до стола доезжает)
GloooM
19.04.2019 21:30+1Трансивер это штука которая просто преобразует уровни +12 вольт LIN шины в rx/tx на 3-5 вольт пригодные для подключения к МК. Собрать трансивер можно хоть из рассыпухи на одном транзисторе и нескольких резисторах.
А вот именно реализация протокола уже другое дело, в LIN используется по сути тот же уарт, только чутка изменен, можно использовать железный уарт в МК, можно софтварное все изобразить. Во многих современных МК штатный уарт даже поддерживает break и синхронизацию по sync, но в целом если не стоит задачи сделать все по феншую, то можно и обычный уарт из ардуины просто игнорировать битые кадры из-за brake.
esaulenka
22.04.2019 17:48Вы точно пробовали что-то искать по теме?
Вот, например: github.com/zapta/linbus (сходу, кстати, не вызывает приступов отвращения, в отличие от большей части ардуино-кода).VioletGiraffe
22.04.2019 20:36Точно пробовал искать, зуб даю. Кажется, я видел этот проект, но здесь же целая кастомная железка. Я искал реализацию для голой стоковой Ардуино, ведь явно же 20 кбит/с по единственному проводу можно легко обрабатывать одной ногой GPIO!
P. S. Если бы железку можно было заказать готовой, я бы заказал и не морочил голову. но за вменяемые деньги и любительского уровня я подобного не видел, видел более индустриальные анализаторы от $100.
P. P. S. Вот это представляет интерес, попытаюсь выяснить, сколько будет стоить доставка.esaulenka
22.04.2019 20:56Это необязательно кастомная железка. Внутри там такая же атмега, как у всех остальных ардуин. Ищете где-то модуль с трансивером (или делаете самостоятельно), курите код товарища zapta, и всё — устройство готово.
При любви к нетрадиционным занятиям в гамаке, можно, конечно, и на GPIO сделать (откуда, кстати, цифра 20 кбит/с? я видел 4800, 9600 и 19200. Ещё 10400 есть, но это не LIN), но очень советую пользоваться по возможности аппаратными модулями. Особенно если хоть о какой-то надёжности говорить.VioletGiraffe
22.04.2019 22:5520 — потолок по спецификации LIN. У товарища zapta, к сожалению, использован экзотический трансивер. Хочу попробовать ширпотребный TJA1021, но смущает, что кроме упомянутого zapta практически ничего и не находится по теме LIN + Arduino, а именно с TJA1021 так и вовсе ничего, хотя сама микруха довольно известна. Чувствую себя первопроходцем, а это верный признак, что ступаю на поле граблей.
esaulenka
22.04.2019 23:47Предлагаю всё-таки получше разобраться в теме, благо даташиты в свободном доступе, спецификация на LIN тоже (повторю, кстати, вопрос: Вам точно LIN нужен?).
Потому что сразу выяснится, что LIN — это такой однопроводный UART (со специфичным признаком «начало пакета», правда), а все трансиверы — суть трансляторы уровня с процессорных 3/5 вольт до автомобильных 12+. Ну ещё там есть всякие плюшки, типа защиты от КЗ, переполюсовки, статики. Иногда бывает ещё встроенный стабилизатор (для питания того самого контроллера) и защита от подвисания контроллера (в виде ограничения на макс. длительность dominant level, чтоб шину напрочь не завесить).VioletGiraffe
22.04.2019 23:56Я понимаю всё, что вы написали, спецификацию LIN читал (правда, по диагонали). Мораль в том, что все трансиверы должны быть с логически-цифровой точки зрения одинаковы?
Я не нашёл достоверной информации, что нужен именно LIN, но есть косвенные на то указания, например, какой-то training мануал моего автопроизводителя примерно тех же времён, что и моя машина, где сказано именно LIN, и приводится довольно детальная схема работы протокола и шины.esaulenka
23.04.2019 11:24Я понимаю всё, что вы написали, спецификацию LIN читал
Тогда откуда идеи «GPIO без трансиверов»?
Ну и вообще, как мне кажется, для человека, который умеет «программировать на С++ за деньги», набросать реализацию этого примитивного протокола особых проблем составить не должно. Просто джаст фо фан.
все трансиверы должны быть с логически-цифровой точки зрения одинаковы
Я вам не скажу за всю Одессу, но тексасовские SN65HVDA195, nxp-шные TJA1020, микрочиповские MCP200x и ATA6631 с точностью до методики включения (из спящего режима) и поведения в этом спящем режиме совершенно одинаковы.
Я не нашёл достоверной информации, что нужен именно LIN,
Самое достоверное — взять трансивер, подоткнуть его в живую шину с одной стороны и в логический анализатор — с другой. Транспортный уровень — как на ладони.VioletGiraffe
23.04.2019 11:37Тогда откуда идеи «GPIO без трансиверов»?
Кроме вопросов надёжности и сертификации automotive (устойчивости к transients и load dump), я по-прежнему не понимаю, почему это нельзя сделать на GPIO + 1 полевой транзистор с изолированным затвором вместо целого трансивера. Я только не умею выбрать правильный тип и модель транзистора.
набросать реализацию этого примитивного протокола особых проблем составить не должно.
Грабли, не люблю по граблям ходить, особенно там, где это касается физического железа, которое под отладчиком на паузу не поставишь и значения переменных / регистров не посмотришь. С софтом всё намного проще. Было бы LIN-master устройство, работающее на столе, я бы уже начал экспериментировать, но сидя в багажнике авто с ноутбуком этим заниматься не очень весело. Хочется просто, чтобы работало, поэтому уже заказал трансивер на Алиэкспресс, осталось дождаться. Спасибо за помощь / ликбез.esaulenka
23.04.2019 12:54устойчивости к transients и load dump
В первую очередь нужна устойчивость к перегрузке и переполюсовке.
Отваливание незаряженного аккумулятора на полном ходу встречается редко, а криворукие прикручиватели проводов не туда — часто.
сделать на GPIO
Можно. Но первым же вопросом будет «как мне сформировать биты?». Вторым — «как мне прочитать биты и сложить их в байты?». И я ещё раз спрашиваю, зачем их героически решать, если в контроллере есть готовый модуль UART?
+ 1 полевой транзистор с изолированным затвором
Не нужен там никакой изолированный затвор.
Берите любой NPN, базу через резистор на ногу контроллера, эмиттер на землю, коллектор в линию. Для определённости, скажем, www.chipdip.ru/product/bc635pbf и килоомный резистор. Всё как по заказу — без защит и сертификаций. Для хоть какой-то защиты можно резистор воткнуть www.chipdip.ru/product0/18265 (физический размер имеет значение!)
Ну и да, приём чего-либо мы ещё не обсудили. Ардуины от 12 вольт горят.
Было бы LIN-master устройство, работающее на столе
Берём Saleae logic (must have!), паяем из двух резисторов делитель 12 -> 3.3, лезем в багажник, снимаем протокол. Возвращаемся на диван, берём отдельную ардуину, и тупо в цикле с ногодрыгом и sleep'ом повторяем услышанное.VioletGiraffe
23.04.2019 13:04Хороший вариант с тупым копированием услышанного, спасибо за наводку, я не догадался. Как раз колега пообещал одолжить Saleae.
Насчёт приёма 12 вольт Ардуиной — думал о резистивном делителе. Только не знаю, нужно ли в таком варианте использовать АЦП, чтобы правильно обработать уровни 0/1, не надеясь, что они магически совпадут с логическими уровнями выбранного МК. Но это всё умозрительно, потому что я уже послушал вас и других комментаторов — заказал TJA1021.
esaulenka
22.04.2019 17:52Кстати, пользуясь случаем, хочу напомнить, что UART-подобных однопроводных интерфейсов автопромышленность изобрела больше одного. LIN — только один из них. Ещё существуют ISO 14230 и куча всякого вендор-специфик (с документацией, в лучшем случае, на фанатских форумах).
DMGarikk
19.04.2019 13:40Оч жалею что у меня авто крайне жмотского производителя — Крайслер (jeep, dodge)… и соответственно все протоколы наглухо закрыты и недоступны и софта нет, даже стандартный odb2 обрезан по минимуму
p.s. у крайслера есть авто построенные на чужой базе, у них таких проблем нет, а вот «родные»… печаль
acodered
19.04.2019 16:50Предупреждение в конце должно звучать немного по-другому:
Любая поддержка протокола, которую вы реализуете в своей железке или программе, будет специально сломана производителем авто в следующей версии, а если ему это не удастся, то он просто подаст на вас в суд.
CAN-шина прекрасный, открытый стандарт. И посмотрите во что он превратился в автомобилях. Дилеры постоянно оказывают давление на автопроизводителя — дайте нам заработать! Мы купили у вас этот стенд за 20К, мы покупаем у вас программы, запретите это делать пользователям. И разумеется, автопроизводитель идет им навстречу, ведь он так же зависит от продаж через дилеров.
Open Ford (сейчас OpenXC) была прекрасная инициатива, очень смелая. Ну и где сейчас Форд? Ну и кто из читателей Хабра купил себе Форд, потому что там есть открытый стандарт?
novice2001
19.04.2019 17:55+1Машины вообще редко покупают по идеологическим соображениям такого характера.
GloooM
19.04.2019 22:25+4Строго говоря сам стандарт CAN шины не регламентирует что по нему будет передаваться, он про физические уровни, арбитраж и прочий низкий уровень.
Это как сказать что Ethernet открытый стандарт, а посмотрите злой скайп закрыл протокол и не дает нам.
Тут ситуация двоякая еще, не дает производитель доков по работе со своей электроникой, залочил везде прошивки, все пошифровал — плохо, мы же за свободу и все такое.
Гоняет все в открытую — опять плохо, теперь любой злодей может переписать прошивку и т.д.
Ctacfs
20.04.2019 03:00+4Кто из читателей хабра знал об инициативе форда до того, как прочел этот коммент?
Форд мог бы влить денег в пиар, в организацию комьюнити вокруг этой инициативы.
stavinsky
19.04.2019 17:02Пытался найти данные для Ford Focus 2007 и облом ничего толком не нашлось. Есть кто-то кто опытным путем собирал данные и потом пытался их интерпретировать. Но было интересно. Собирал свой can модуль на stm32. Все подключается и работает. Интересно и куча непонятных данных. (ловил все что прилетает)
kolyandex Автор
19.04.2019 17:48Есть программа ForScan, может там есть что интересное?
stavinsky
19.04.2019 18:33Да есть и даже вроде куплена(не помню что-то из них было за деньги)
Я наивно думал когда начинал что документацию я найду. Ford для следующих моделей даже свой DIY девайс какой-то сделал. И доки выложил.
В целом не подумал что оттуда можно было заснифать трафик. Сейчас уже все равно забросил все это.
sergzah
19.04.2019 18:46+1Давно пользую can-адаптер для VW – «вася диагност». Позволил активировать много функций комфорта, которые по неведомым причинам не выведены в настройки, нигде в официальной доке не описаны, но зато дилер пытался мне их продать. Но самое главное – это чтение кодов ошибок, ведь не знаю как у Mitsubishi, но у VW отображаемые на панели ошибки это какая-то жесть: мало чего понятно, всегда все фатально и возникает ощущение что без поездки в сервис вообще никак. А подключаешь, и понимаешь что всего-то перегорела одна из лампочек.
Смело могу рекомендовать для VAG, хотя за рекламу мне не платят. Но давайте откровенно: даже в продукте, который существует ни один год и заточен под определенный автоконцерн, даже там не все очевидно: не все значения регистров описаны, у разных модельных годов одной и той же модели есть отличия, при работе есть вероятность накосячить. Поэтому автору большой респект за ликбез, но от меня лично огромный дисклеймер: читать автофорумы, бекапить каждый update, следить за контактом шнурка, зарядкой АКБ и ноута и… верить!
aivs
19.04.2019 18:50У VAG есть утилита VCDS, в народе ВАСЯ, через которую можно посмотреть любой датчик, настроить любой блок и поуправлять чем хочешь, сниффером вытаскиваются любые команды.
apple01
19.04.2019 19:34В свободном доступе есть VCDS lite, работает с китайским адаптером за $5. Возможности урезаны но тем не менее для поиска неисправного сенсора чего-либо (например ABS в моем случае) или чтения кода ошибки незаменимо.
aivs
19.04.2019 19:39У меня китайский аналог шнурка и крякнутая VCDS. Поддерживаются все функции оригинального, кроме обновления.
Bronx
20.04.2019 00:31+1Статья интересная, только сомнительно, что для сброса maintenance lamp обязательно нужен OBD-сканер. У Хонды, например, этот сигнал легко сбрасывается комбинацией «повернуть ключ зажигания, удерживая кнопку сброса пробега (trip reset) 10 секунд». А, скажем, check engine сбрасывается комбо «повернуть ключ зажигания (не заводить) -> нажать педаль газа на 5 секунд -> выключить зажигание --> отпустить педаль, выждать 2 минуты до включения».
kolyandex Автор
20.04.2019 10:11На моем пепелаце таким образом сбрасывается только напоминание о ТО.
samponet
20.04.2019 00:54В конце статьи должна была быть ссылка на СЦ, где делают всё кучеряво, ибо зачем так поверхностно статью писать? Из примеров я не смог сопоставить PIDы, блоки и ответы, хотя и очень тема интересна.Так то можно и канхакером посоветовать проводить анализ данных в свое удовольствие и свободное время.
Merkat0r
20.04.2019 04:00+2В конце статьи должна была быть ссылка на
ИМХО
Там таки должна быть отсылка к тому, что: это вам не ардуинка для экспериментов — 1 неверное значение, например, в блоке АБС\курсовой стабилизации\ГУР(ЭУР) и почти наверняка вы в скором времени трупemmibox
23.04.2019 11:45Вы представляете эту цивилизацию как то, что может разрушить любой случайно залетевший дятел… В то время как в блоке АБС кодируется лишь размер колес и выбор там из малого N значений. В стабилизации можно еще ноль руля закодировать. А в ГУР-е вообще нет никакой электроники.
DMGarikk
23.04.2019 12:27А в ГУР-е вообще нет никакой электроники.
бывает клапан регулировки усилия, которым эбу рулит в зависимости от скорости авто
грубо говоря можно взять и отключить гур на низкой скорости, что в некоторых авто может быть крайне неприятно
telobezumnoe
20.04.2019 10:03любопытно, с помощью чего подключались к кан шине?? это какой то кан юсб адаптер? видел в продаже MCP2515 я так понимаю это can spi, затем нужен spi-usb конвертер?? или на микроконтроллере с поддержкой can выполнен мост??
kolyandex Автор
20.04.2019 10:07Для опытов использовался Lawicel (CAN hacker) протокол на stm32 + tja1051.
Софт на видео работает с J2534 Pass-thru адаптерами и всеми разновидностями ELM327.
slashd
А где можно получить эту самую прошивку для анализа?
kolyandex Автор
Слить с блока программатором. Защиты от чтения там нет.