Цель этой статьи - научить вас взламывать автомобили - быстро, дешево и легко. Для этого мы, в качестве примера, подделаем датчик числа оборотов в минуту.
Следующее ни в коем случае не является исчерпывающим руководством. Вместо этого он направлен на то, чтобы предоставить достаточно информации, чтобы вы могли начать работу. Если вы хотите копнуть глубже, вы можете проверить, что нужно прочитать в конце.
Если вы решите выполнить это руководство в реальной жизни, вам понадобится компьютер с Linux (или виртуальная машина с Linux) и устройство CAN-USB (которое мы рассмотрим позже).
Автомобиль - это сеть
Автомобиль состоит из нескольких компьютеров для управления двигателем, трансмиссией, окнами, замками, фарами и т. Д. Эти компьютеры называются электронными блоками управления (ЭБУ) и обмениваются данными друг с другом по сети.
Например, когда вы нажимаете кнопку на рулевом колесе, чтобы увеличить громкость радио, ЭБУ на рулевом колесе отправляет команду на увеличение громкости в сеть, затем ЭБУ радио видит эту команду и действует соответствующим образом.
В машине несколько сетей, обычно как минимум две:
- Один для важных данных, таких как сообщения о двигателе и трансмиссии.
- И еще один для менее важных данных, таких как радио и дверные замки.
Критическая сеть использует быстрый и надежный протокол, тогда как некритическая сеть использует более медленный, менее надежный, но более дешевый протокол. Количество сетей, а также то, какие ЭБУ объединены в сеть, зависит от марки, модели и года выпуска автомобиля. ЭБУ также может быть подключен к нескольким сетям.
Подключение к сети
К некоторым сетям можно получить доступ через порт OBD-II. OBD-II является обязательным для всех автомобилей и легких грузовиков, построенных в США после 1996 года и в Европе после 2004 года.
Разъем находится в зоне досягаемости водительского сиденья. Возможно, вам придется снять пластиковую крышку, но она всегда доступна без инструментов.
Стандарт OBD-II допускает пять протоколов сигнализации. Производитель должен решить, какой из них использовать. CAN - самый популярный, о нем мы и поговорим. Доступ к нему осуществляется через контакты 6 и 14 разъема OBD-II. Если в вашем автомобиле есть шина CAN, вы увидите металлические выводы на контактах, как на изображении выше.
Шина CAN - это надежная высокоскоростная шина, которая используется для отправки важных данных. К сожалению, пакеты данных на шине не стандартизированы, поэтому вам нужно будет их перевернуть, чтобы понять, что они означают. Стандарт OBD-II также оставляет место для специальных контактов производителя, которые могут использоваться для конкретных протоколов поставщика. Это облегчает дилеру диагностику проблем.
В моей машине (GM) у меня есть стандартная шина CAN на контактах 6 и 14, а однопроводная шина CAN на контакте 1. Стандартная шина CAN - это надежный высокоскоростной (500 кбит / с) протокол, также называемый высокоскоростной CAN (HS-CAN). Он используется для критических данных. Однопроводная шина CAN (SW-CAN) или GMLAN медленнее (33,3 кбит / с) и менее надежна, но дешевле, поскольку использует только один провод. Эта шина используется для некритических данных.
Если вы видите пин-код производителя и не знаете, какой протокол используется, Google «‹make› OBD pinout». Существует также низкоскоростной CAN (LS-CAN) и среднескоростной CAN (MS-CAN). MS-CAN обычно находится на контактах 3 и 11 и работает со скоростью 125 кбит / с на автомобилях Ford и Volvo.
Инструменты
Вам понадобится как устройство, способное интерпретировать данные CAN, так и программное обеспечение для анализа данных.
Аппаратное обеспечение
Для приема и передачи CAN-пакетов вам необходимо устройство, способное на это. Вы часто будете сталкиваться с устройствами на базе ELM327. Хотя они имеют свое применение, они ужасны для взлома. Они слишком медленные, чтобы контролировать шину CAN.
Есть также устройства высокого класса, такие как Kvaser, Peak или EMS Wünsche. Они выполнят свою работу, но являются чрезмерными и довольно дорогими.
Некоторые высокопроизводительные устройства также требуют, чтобы вы приобретали вместе с ними программное обеспечение. USB2CAN - это собственный CAN-интерфейс для Linux, который предлагает отличное соотношение цены и качества.
Вы также можете использовать Cantact или CANUSB. Однако это не собственные устройства CAN в Linux и используют протокол на основе ASCII. Это означает, что они немного сложнее в настройке и имеют меньшую производительность. С другой стороны, они хорошо поддерживаются в нескольких операционных системах.
Я использую CANalyze, созданный для моих нужд. Он похож на USB2CAN в том, что это доступный собственный интерфейс CAN, но он использует более новый микроконтроллер, имеет открытый исходный код и может быть построен с использованием инструментов с открытым исходным кодом. В остальной части этого руководства предполагается, что вы используете собственный интерфейс CAN.
Программное обеспечение
Для связи с устройством вам необходимо установить пакет can-utils на ваш Linux-компьютер. Вы можете сделать это, набрав в командной строке Linux следующее:
sudo apt-get install can-utils
Can-utils упрощает отправку, получение и анализ CAN-пакетов. Это команды, которые мы будем использовать.
- cansniffer отображает только изменяющиеся пакеты
- candump выгрузить все полученные пакеты
- cansend отправить пакет
Linux имеет встроенную поддержку CAN в ядро через SocketCAN. Это упрощает написание собственных дополнительных программ. Вы можете взаимодействовать с CAN-шиной так же, как и с любой другой сетью, то есть через сокеты.
CAN-шина
Прежде чем начать движение задним ходом, вы должны иметь некоторое представление о том, как работает CAN-шина. Он состоит из 2-х проводов и использует дифференциальную сигнализацию. Поскольку это шина, к этим двум проводам можно подключить несколько устройств. Когда кадр CAN отправляется по шине, он принимается всеми ЭБУ, но обрабатывается только в том случае, если он полезен для ЭБУ. Если несколько кадров CAN отправляются одновременно, выигрывает тот, у которого наивысший приоритет. Фрейм CAN состоит из 3 частей, которые имеют отношение к нам.
- идентификатор арбитража. Идентификатор сообщения. ЭБУ использует его, чтобы решить, обработать или проигнорировать полученный кадр. Он также представляет приоритет сообщения. Меньшее число имеет более высокий приоритет. Так, например, если вы будете инженером, проектирующим сеть, вы должны дать рамке для развертывания подушек безопасности очень высокий приоритет или низкий идентификатор арбитража. С другой стороны, вы бы дали более низкий приоритет или более высокий идентификатор арбитража для данных, предназначенных для дверных замков.
- код длины данных (DLC) Указывает длину поля данных в байтах. Кадр CAN может содержать не более 8 байтов данных.
- поле данных. Содержит до 8 байтов данных.
Переключение CAN-шины
Общий подход к реверсированию CAN-шины состоит в том, чтобы сгенерировать поведение, которое вы хотите имитировать, и найти сообщение, которое вызывает такое поведение. Например, предположим, что система помощи при удержании полосы движения (LKAS) на вашем автомобиле - дерьмо, и вы сделали свою собственную.
Чтобы он мог управлять рулевым управлением, вам нужно знать, какие сообщения отправлять. Способ выяснить это - включить исходный LKAS, контролировать шину CAN и определить пакеты, ответственные за поворот рулевого колеса. После того, как вы определили эти пакеты, вы можете настроить свой собственный LKAS для отправки этих пакетов на шину CAN для управления рулевым колесом.
В нашем случае мы хотим подделать тахометр, поэтому нам нужно изменить обороты, нажав на газ при включенной машине и на нейтрали, а затем попытаться найти пакет, ответственный за изменение оборотов.
Настраивать
Подключите устройство CAN к порту OBD-II автомобиля и порту USB компьютера. Вызовите интерфейс CAN, выполнив в командной строке Linux следующее:
sudo ip link set can0 up type can bitrate 500000
который вызывает can0
интерфейс (всегда can0
, если у вас подключено только одно устройство) со стандартной скоростью передачи данных 500 кбит / с.
Идентифицировать
Когда автомобиль выключен, ЭБУ обычно спят, поэтому вам нужно включить автомобиль или перевести его в режим аксессуаров. Вы можете просмотреть необработанные данные CAN, запустив это в командной строке Linux:
candump can0
При этом данные CAN выводятся на экран сразу после их получения. Однако это очень неорганизовано, и очень трудно увидеть, какие пакеты соответствуют определенному событию. Вы можете нажать ctrl + c, чтобы остановить программу. Чтобы сделать данные более читабельными, мы используем cansniffer, который группирует пакеты по идентификатору арбитража и показывает только изменяющиеся пакеты. Чтобы запустить его, выполните команду в командной строке Linux:
cansniffer -c can0
где -c
раскрашивает изменяющиеся байты, а can0
- интерфейс для сниффинга. Удаление постоянных пакетов занимает несколько секунд.
Вы должны увидеть что-то похожее на изображение ниже, хотя числа, вероятно, будут совершенно другими.
Первый столбец (дельта) показывает скорость в секундах, с которой принимаются пакеты с этим идентификатором арбитража. Второй столбец (ID) содержит ID арбитража. Остальные буквенно-цифровые столбцы (данные…) содержат байты данных. Если данные имеют представление ASCII, они отображаются справа, в противном случае это точка.
Когда вы нажимаете на дроссельную заслонку при работающем двигателе, чтобы увеличить обороты, на экране могут появиться новые сообщения CAN и / или измениться существующие.
Нам нужно найти сообщение CAN, в котором изменение байтов коррелирует с изменением числа оборотов в минуту. Мы, вероятно, можем ожидать, что значение будет увеличиваться / уменьшаться по мере увеличения / уменьшения числа оборотов.
Первый кадр CAN в cansniffer, который, кажется, зависит от RPM, - это кадр с идентификатором арбитража C9
. Вероятно, существует несколько потенциальных пакетов, которые меняются в зависимости от RPM, это только первый.
В этом сообщении есть 4 байта, которые изменяются (окрашены в красный цвет), но не все из них обязательно указывают RPM. Изменения в третьем байте 07
, похоже, не связаны с изменением числа оборотов в минуту. Последний байт 1B
делает.
Однако, как только мы убираем ногу с дроссельной заслонки, она переходит на 00
. Это будет означать, что он представляет положение дроссельной заслонки, а не число оборотов в минуту.
Наконец, есть два байта 21 C0
, которые, похоже, соответствуют изменению RPM. Более того, оно изменяется как 16-байтовое целое число, т.е. когда второй байт C0
переполняется, первый байт 21
увеличивается на единицу. Также кажется, что 21
соответствует примерно 2000 об / мин. Это полезно отметить при повторном воспроизведении сообщения.
Воспроизвести
Когда у вас есть кандидат, отправьте его на шину CAN с помощью следующей команды в командной строке Linux:
cansend can0 0C9#8021C0071B101000
где кадр имеет формат <arb_id>#{data}
и должен быть заменен вашим собственным CAN-сообщением.
Для этого ваша машина может быть запущена или находиться в дополнительном режиме. Обязательно используйте пакет, который вы получили, когда двигатель не работал на холостом ходу, иначе вы не увидите никаких изменений при воспроизведении его на холостом ходу.
Если вы просто отправите пакет один раз, вы, вероятно, не увидите никаких изменений на комбинации приборов. Это связано с тем, что исходное сообщение по-прежнему непрерывно отправляется по шине с интервалом в 0,2 секунды ЭБУ, поэтому ваше сообщение будет просто проигнорировано.
Напомним, что ставка указана в первом столбце cansniffer. Есть два способа обойти это, кроме отключения блока управления двигателем, который генерирует эти сообщения. Один из вариантов - отправлять пакеты с гораздо большей частотой, чем те, которые отправляются в настоящее время. Вы можете сделать это, запустив в командной строке Linux следующее:
while true; do cansend can0 0C9#8021C0071B101000; sleep 0.002; done
и замените сообщение CAN тем, которое вы определили. Для остановки нажмите ctrl + c.
Другой вариант - контролировать шину, и каждый раз, когда вы обнаруживаете пакет, который хотите подделать, сразу же после этого отправляйте свой собственный пакет. Это можно сделать, запустив в командной строке Linux:
candump can0 | grep " 0C9 " | while read line; do cansend can0 0C9#8021C0071B101000; done
где вам нужно заменить сообщение CAN и 0C9
на сообщение CAN, которое вы указали, и это идентификатор арбитража соответственно. Вы можете поэкспериментировать с обоими подходами, чтобы увидеть, какой из них работает лучше.
Если тахометр поменяется, молодец, вы его нашли! Если нет, определите следующее сообщение, которое связано с числом оборотов в минуту, и воспроизведите его.
Расплывание
Теперь, когда у вас есть CAN-фрейм, который устанавливает обороты на комбинации приборов, вы можете поиграть с данными, которые вы отправляете, чтобы увидеть, что происходит. Мы отметили, что два байта, соответствующие RPM, ведут себя как 16-битное целое число, поэтому, чтобы установить тахометр на 8k RPM, мы запускаем в командной строке Linux следующее:
while true; do cansend can0 0C9#0080000000101000; sleep 0.002; done
и результат ...
Вот и все! Теперь вы можете попробовать управлять спидометром, радио, фарами, дверными замками и т. Д., Используя тот же подход.
Возможные проблемы
- Хотя шина CAN является самой популярной сетью, это не единственная сеть. Если вы не можете найти искомое сообщение на шине CAN, попробуйте другую сеть. Особенно некритичные сообщения, такие как радио, свет и дверные замки, вероятно, будут в другой сети.
- Как уже упоминалось, точные данные, передаваемые по CAN, зависят от марки, модели и года выпуска автомобиля. Некоторые автомобили используют счетчик в сообщении CAN, чтобы гарантировать, что одно и то же сообщение не будет обработано несколько раз. Это немного сложнее, но вы сможете сделать это, используя предоставленную информацию. Некоторые автомобили также используют контрольную сумму для обеспечения целостности данных. Вычислить эту контрольную сумму может быть сложно. Если у вас Toyota, посмотрите Приключения в автомобильных сетях и блоках управления, стр. 10, Checksum-Toyota. Каждый действительно должен прочитать газету целиком.
- При воспроизведении идентифицированного пакета на шине ваше устройство CAN-USB может перейти в состояние «bus off». Это часть стандарта CAN и происходит, когда в устройстве возникло слишком много ошибок. Обычно это происходит, когда в автобусе много пробок. Чтобы обойти это, вы можете поиграть с задержками и таймингом, возможно, попробуйте воспроизвести сообщение сразу после перевода автомобиля в режим дополнительных принадлежностей, попробуйте немного подождать, попробуйте это с автомобилем и т. Д. Если вы определили, что такое ЭБУ подключенные к шине, вы также можете вытащить их предохранитель, чтобы они не отправляли сообщения и уменьшали трафик в автобусе.
Должен читать
- Справочник автомобильного хакера
- Исследование Чарли Миллера и Криса Валасека, да, все
- Исследования Калифорнийского университета в Сан-Диего и Вашингтонского университета.
Обязательно посмотрите Открытые гаражи и их ролики.