Как взломать машину - быстрый ускоренный курс

Цель этой статьи - научить вас взламывать автомобили - быстро, дешево и легко. Для того, чтобы сделать это, в качестве примера мы подменим датчик оборотов.

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

Если вы решите выполнить это руководство в реальной жизни, вам понадобится компьютер с Linux (или виртуальная машина с Linux) и устройство CAN-to-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 кбит / с) и менее надежна, но дешевле, поскольку использует только один провод. Эта шина используется для некритических данных.

Если вы видите пин-код производителя и не знаете, какой протокол используется, погуглите «Распиновка OBD». Есть также низкоскоростной 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

где кадр имеет формат #{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 и сообщение 0C9CAN, которое вы указали, и его идентификатор арбитража соответственно. Вы можете поэкспериментировать с обоими подходами, чтобы увидеть, какой из них работает лучше.

Если тахометр поменяется, молодец, вы его нашли! Если нет, определите следующее сообщение, которое соответствует RPM, и воспроизведите его.

Расплывание

Теперь, когда у вас есть 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 может перейти в состояние «шина отключена». Это часть стандарта CAN и происходит, когда устройство испытывает слишком много ошибок. Обычно это происходит, когда в автобусе много пробок. Чтобы обойти это, вы можете поиграть с задержками и таймингом, возможно, попробуйте воспроизвести сообщение сразу после перевода автомобиля в режим аксессуаров, попробуйте немного подождать, попробуйте это с автомобилем и т. Д. Если вы определили, что такое ЭБУ подключенные к шине, вы также можете вытащить их предохранитель, чтобы они не отправляли сообщения и уменьшали трафик в автобусе.

Должен читать

  • Справочник автомобильного хакера
  • Исследования Чарли Миллера и Криса Валасека, да, все
  • Исследования Калифорнийского университета в Сан-Диего и Вашингтонского университета.

Не забудьте также посмотреть «Открытые гаражи» и их видео.