07.05.2015

Управление датчиками транспортного средства через шину CANBus – Часть 2

image

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

Автор: Corey Thuen

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

Во-первых, необходимо выяснить, какой идентификатор в Тойоте отвечает за обороты двигателя. Производитель не раскрывает данные идентификаторы, и мы будем выяснять эти сведения самостоятельно. Я использовал собственную утилиту beaglebone canbus tool (вы можете собрать свой вариант, следуя инструкциям). Затем я завел свой автомобиль, подождал 15 секунд и выключил двигатель. В процессе работы транспортного средства выгрузились все сообщения, переданные по шине (огромное количество и, на первый взгляд, трудно понять, что к чему). Мы будем использовать утилиту unique_ids, входящую в состав пакета canbus-utils. Перечень всех идентификаторов:

020,022,025,0B0,0B2,0B4,0BA,1E3,223,224,2C1,2C4,2C6,2D0,2E1,320,340,351,361,380,38A,394,

398,399,39E,3A0,3B0,3B1,3B3,3B4,3B7,3BC,3F8,423,440,442,484,4C1,4C3,4C4,4C6,4DC,4DD,4F1,

610,611,617,620,621,622,630,638

Чтобы найти нужные информационные байты, необходимо провести предварительную фильтрацию и идентификацию нужных сведений при помощи утилиты watch_id. Начнем с анализа идентификатора 0x2C4 (на самом деле, до написания статьи уже был проведен анализ, поэтому мы сразу же нашли правильный идентификатор). Измененные байты отобразятся красным цветом. Некоторые поля могут содержать единичный байт, другие – несколько байт или множественные значения, закодированные в битовой маске.

$ node watch_id.js –id 0x2c4

Результаты работы утилиты watch_id:


Рисунок 1: Измененные байты идентификатора 0x2c4

Из полученных результатов мы видим, что первые два байта сначала были нулевыми, а потом стали увеличиваться примерно до отметки 0x08CC (2252 в десятичной системе). 5-й байт увеличивается с 0 до 08 и потом не меняется. Последний байт постоянно изменяется. 4-й байт изменяется от 0x10 до 0x0F.

Можно предположить, что первые два байта хранят 16-ти битное целое число. 4-й байт хранит битовую маску (целое однобайтовое значение). 5-й байт, вероятно, содержит битовую маску или флаг. Если сконвертировать первые два байта в десятичный формат, получим число, очень напоминающее количество оборотов двигателя. Все начинается с 0, затем увеличивается, потом опять уменьшается до 0. Если сравнить эти значения с тем, что показывает тахометр, нетрудно догадаться, что первые два байта хранят обороты двигателя.

В случае с Тойотой в первых двух байтах хранится непосредственно количество оборотов. В других случаях значение может высчитываться по определенной формуле (например, количество оборотов = байт 1 & 2 + 1k). Теперь, когда мы знаем идентификатор и формулу расчета оборотов, можно написать простенькую утилиту для заполнения шины мусорными сообщениями, чтобы тахометр отображал некорректное значение.