Як зламати машину - швидкий аварійний курс

Мета цієї статті - допомогти вам почати злом автомобілів - швидко, дешево та легко. Для цього ми на прикладі підробимо датчик частоти обертання.

Далі - далеко не вичерпний підручник. Натомість він має на меті надати достатньо інформації, щоб налагодити роботу. Якщо ви хочете копати глибше, ви можете перевірити обов’язкові збірки в кінці.

Якщо ви вирішите виконати цей підручник у реальному житті, вам знадобиться комп’ютер 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 кбіт / с) і менш надійною, але дешевшою, оскільки використовує лише один провід. Ця шина використовується для некритичних даних.

Якщо ви бачите контактний номер постачальника і не знаєте, який протокол використовується, Google “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 скидає всі отримані пакети
  • може відправити пакет

Linux має підтримку CAN, вбудовану в ядро ​​через SocketCAN. Це полегшує написання власних додаткових програм. Ви можете взаємодіяти з шиною 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) містить арбітражний ідентифікатор. Решта буквено-цифрові стовпці (дані ...) містять байти даних. Якщо дані мають представлення ASCII, їх можна побачити праворуч, інакше це крапка.

Коли ви натискаєте на дросель під час роботи двигуна, щоб збільшити оберти на хвилину, на екрані можуть з'являтися нові повідомлення CAN та / або змінюватися існуючі.

Нам потрібно знайти повідомлення CAN, де байти, що змінюються, співвідносяться зі зміною RPM. Можливо, ми можемо очікувати, що значення буде збільшуватися / зменшуватися в міру збільшення / зменшення обертів на хвилину.

Перший кадр CAN у кансниффері, який, як видається, змінюється залежно від RPM - це кадр з ідентифікаційним судом арбітражу C9. Ймовірно, існує кілька потенційних пакетів, які змінюються залежно від RPM, це лише перший.

У цьому повідомленні є 4 байти, які змінюються (кольорово червоними), але не всі з них обов’язково вказують RPM. Варіації третього байту 07, схоже, не співвідносяться з різними обертами на хвилину. Останній байт 1Bробить.

Однак, як тільки ми знімаємо ногу з дросельної заслінки, вона переходить до 00. Це означало б, що воно відображає положення дросельної заслінки, а не частоту обертання.

Нарешті, є два байти, 21 C0які, здається, відповідають зміні RPM. Більш того, воно змінюється як ціле число 16 байт, тобто коли другий байт C0переповнюється, перший байт 21збільшується на одиницю. Також, здається, це 21відповідає приблизно 2000 об / хв. Це добре зауважити, коли ви будете відтворювати повідомлення.

Повтор

Отримавши кандидата, надішліть його на шину CAN за допомогою наступної команди у вашому запиті Linux:

cansend can0 0C9#8021C0071B101000

де кадр має формат #{дані} і повинен бути замінений вашим власним повідомленням CAN.

Для цього ваш автомобіль може працювати або в режимі аксесуарів. Обов’язково використовуйте пакет, який ви отримали, коли двигун не працював в режимі очікування, інакше ви не побачите, що щось зміниться при його відтворенні, коли ваш двигун не працює.

Якщо ви просто надішлете пакет один раз, ви, ймовірно, не побачите нічого змінного на приладовій панелі. Це тому, що оригінальне повідомлення все ще надходить безперервно на шину з інтервалом 0,2 секунди ЕБУ, тому ваше повідомлення буде просто проігноровано.

Нагадаємо, що ставка вказана в першій колонці канснифера. Є два способи обійти це, окрім відключення ЕБУ, яке генерує ці повідомлення. Одним із варіантів є відправка пакетів з набагато більшою частотою, ніж ті, що зараз надсилаються. Ви можете зробити це, запустивши в підказці 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, яке ви визначили, і це ідентифікаційний арбітраж відповідно. Ви можете експериментувати з обома підходами, щоб побачити, який з них працює краще.

Якщо тахометр зміниться, хороша робота, ви знайшли його! Якщо ні, визначте наступне повідомлення, яке відповідає RPM, і повторіть його.

Пухнастість

Тепер, коли у вас є кадр CAN, який встановлює частоту обертання на приладовій панелі, ви можете пограти з даними, які ви надсилаєте, щоб побачити, що станеться. Ми зауважили, що два байти, що відповідають RPM, поводяться як ціле 16-бітне число, тому для того, щоб встановити тахометр на 8k RPM, ми запускаємо наступне у вашому запиті Linux:

while true; do cansend can0 0C9#0080000000101000; sleep 0.002; done

і результат ...

Це воно! Тепер ви можете спробувати керувати спідометром, радіо, світильниками, дверними замками тощо, використовуючи той самий підхід.

Можливі проблеми

  • Хоча шина CAN є найпопулярнішою мережею, це не єдина мережа. Якщо ви не можете знайти потрібне повідомлення на шині CAN, спробуйте іншу мережу. Особливо некритичні повідомлення, такі як радіо, світло та замки дверей, ймовірно, будуть в іншій мережі.
  • Як вже зазначалося, точні дані, що передаються через CAN, залежать від марки автомобіля, моделі та року. Деякі машини використовують лічильник у повідомленні CAN, щоб переконатися, що одне і те ж повідомлення не обробляється кілька разів. Це трохи складніше, але ви зможете зробити це за допомогою наданої інформації. Деякі машини також використовують контрольну суму для забезпечення цілісності даних. Розрахунок цієї контрольної суми може бути складним. Якщо у вас Toyota, перегляньте «Пригоди в автомобільних мережах та блоках управління», стор. 10, контрольна сума Toyota. Кожен повинен справді прочитати цілу статтю.
  • Під час повторного відтворення ідентифікованого пакету на шині, ваш пристрій МОЖЕ на USB може перейти в стан "вимкнено шину". Це є частиною стандарту CAN і трапляється, коли пристрій зазнав занадто багато помилок. Зазвичай це трапляється, коли в автобусі багато руху. Для того, щоб обійти це, ви можете пограти із затримками та синхронізацією, можливо, спробуйте відтворити повідомлення відразу після переведення машини в режим аксесуарів, спробуйте трохи почекати, спробуйте з включеною машиною тощо. Якщо ви визначили, що таке ЕБУ підключені до автобуса, ви також можете витягнути їх запобіжник, щоб перешкодити їм надсилати повідомлення та зменшити трафік в автобусі.

Обов’язково читає

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

Не забудьте також переглянути «Відкриті гаражі» та їх відео.