Как да хакна кола - бърз курс на катастрофа

Целта на тази статия е да започнете да хакнете автомобили - бързо, евтино и лесно. За да направим това, ще подменим манометъра на RPM като пример.

Следното по никакъв начин не е изчерпателен урок. Вместо това той има за цел да предостави достатъчно информация, за да ви подготви за работа. Ако искате да копаете по-дълбоко, можете да разгледате задължителните четения в края.

Ако решите да извършите този урок в реалния живот, ще ви трябва компютър с Linux (или виртуална машина с Linux) и устройство CAN-to-USB (което ще разгледаме по-късно).

Колата е мрежа

Автомобилът се състои от множество компютри за управление на двигателя, трансмисията, прозорците, бравите, светлините и др. Тези компютри се наричат ​​електронни контролни блокове (ECU) и комуникират помежду си по мрежа.

Например, когато натиснете бутона на волана, за да увеличите силата на звука на радиото, ECU на волана изпраща команда за увеличаване на силата на звука в мрежата, след което ECU на радиото вижда тази команда и действа по съответния начин.

В колата има множество мрежи, обикновено най-малко две:

  • Един за критични данни като съобщения за двигател и задвижващ механизъм
  • И един за по-малко важни данни като радио и ключалки на вратите

Критичната мрежа използва бърз и надежден протокол, докато некритичната мрежа използва по-бавен, по-малко надежден, но по-евтин протокол. Броят на мрежите, както и кои ECU са свързани в мрежа, зависи от марката на автомобила, модела и годината. ECU също може да бъде свързан към множество мрежи.

Свързване към мрежа

До някои мрежи може да се осъществи достъп през 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 kbps) протокол, наричан още високоскоростен CAN (HS-CAN). Използва се за критични данни. Едножичната CAN шина (SW-CAN) или GMLAN е по-бавна (33,3 kbps) и по-малко надеждна, но по-евтина, тъй като използва само един проводник. Тази шина се използва за некритични данни.

Ако видите специфичен за производителя щифт и не знаете кой протокол се използва, Google „OBD pinout“. Има и CAN с ниска скорост (LS-CAN) и CAN със средна скорост (MS-CAN). MS-CAN обикновено е на щифтове 3 и 11 и работи със 125 kbps на автомобили 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 автобус

Преди да започнете заден ход, трябва да разберете как работи CAN шината. Състои се от 2 проводника и използва диференциална сигнализация. Тъй като това е шина, към тези два проводника могат да бъдат свързани множество устройства. Когато CAN кадър е изпратен по шината, той се получава от всички ECU, но се обработва само ако е полезен за ECU. Ако се изпращат множество CAN кадри едновременно, печели този с най-висок приоритет. CAN рамката има 3 части, които са от значение за нас.

  • идентификатор на арбитраж Идентификаторът на съобщение. ECU го използва, за да реши да обработи или игнорира получения кадър. Той също така представлява приоритет на съобщението. По-ниското число има по-висок приоритет. Така например, ако сте инженер, проектиращ мрежата, ще дадете на рамката за разполагане на въздушни възглавници много висок приоритет или нисък арбитражен идентификатор. От друга страна бихте дали по-нисък приоритет или по-висок арбитражен идентификационен номер на данните, предназначени за бравите на вратите.
  • код за дължина на данни (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 kbps, което е стандартно.

Идентифицирайте

Когато колата е изключена, ECU обикновено спят, така че трябва да включите колата или да я поставите в режим на аксесоари. Можете да разгледате сурови CAN данни, като изпълните това в подканата за Linux:

candump can0

Това отпечатва CAN данни на екрана веднага след получаването им. Това обаче е много неорганизирано и е много трудно да се види какви пакети съответстват на определено събитие. Можете да натиснете ctrl + c, за да спрете програмата. За да направим данните по-четливи, използваме cansniffer, който групира пакетите по арбитражен идентификатор и показва само пакетите, които се променят. За да го стартирате, изпълнете командата във вашия Linux ред:

cansniffer -c can0

където -cоцветява променящите се байтове и can0е интерфейсът за нюхане. Отнема няколко секунди за премахване на постоянните пакети.

Трябва да видите нещо подобно на изображението по-долу, въпреки че номерата вероятно ще бъдат напълно различни.

Първата колона (делта) показва скоростта в секунди, с която се получават пакетите с този арбитражен идентификатор. Втората колона (ID) съдържа арбитражния идентификатор. Останалите буквено-цифрови колони (данни ...) съдържат байтове с данни. Ако данните имат представяне ASCII, те могат да се видят вдясно, в противен случай това е точка.

Когато стъпвате на газта с работещ двигател, за да увеличите оборотите, може да има нови съобщения CAN на екрана и / или да се променят съществуващи.

Трябва да намерим CAN съобщение, където променящите се байтове корелират с промяната в RPM. Вероятно можем да очакваме, че стойността ще се увеличи / намали с увеличаването / намаляването на RPM.

Първият CAN кадър в cansniffer, който изглежда варира в зависимост от RPM, е кадърът с арбитражен идентификатор C9. Вероятно има множество потенциални пакети, които варират в зависимост от RPM, това е само първият.

В това съобщение има 4 байта, които се променят (оцветени в червено), но не всички от тях задължително показват RPM. Вариациите в третия байт 07изглежда не корелират с променливите обороти в минута. Последният байт 1Bправи.

Въпреки това, веднага щом свалим крака си от дросела, той отива 00. Това би означавало, че тя представлява положението на дроселната клапа, а не RPM.

Накрая има два байта 21 C0, които изглежда отговарят на промяна в RPM. Нещо повече, тя варира като 16 байтово цяло число, т.е. когато вторият байт C0препълни, първият байт 21се увеличава с един. Също така изглежда, че 21съответства на приблизително 2000 RPM. Това е добре да се отбележи, когато ще повторите съобщението.

Повторете

След като имате кандидат, изпратете го в CAN шината със следната команда във вашия Linux подкана:

cansend can0 0C9#8021C0071B101000

където рамката има формат #{данни} и трябва да бъде заместена с вашето собствено CAN съобщение.

Колата ви може да работи или да е в режим на аксесоари за това. Не забравяйте да използвате пакет, който сте получили, когато двигателят не е бил на празен ход, иначе няма да видите нищо да се променя при повторното му възпроизвеждане, докато двигателят ви е на празен ход.

Ако просто изпратите пакета веднъж, вероятно няма да видите нищо да се промени на инструменталната група. Това е така, защото оригиналното съобщение все още се изпраща непрекъснато в шината на интервали от 0,2 секунди от ECU, така че вашето съобщение просто ще бъде игнорирано.

Спомнете си, че процентът е даден в първата колона на консерва. Има два начина да заобиколите това, освен да изключите ECU, което генерира тези съобщения. Единият вариант е да изпращате пакетите с много по-висока честота от изпращаните в момента. Можете да направите това, като изпълните следното в подканата си за 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 на инструменталната група, можете да играете с данните, които изпращате, за да видите какво се случва. Забелязахме, че двата байта, които съответстват на RPM, се държат като 16-битово цяло число, така че, за да настроим тахометъра на 8k RPM, изпълняваме следното във вашия Linux подкана:

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

и резултатът е ...

Това е! Вече можете да опитате да управлявате скоростомера, радиото, светлините, ключалките на вратите и т.н., като използвате същия подход.

Възможни проблеми

  • Въпреки че CAN шината е най-популярната мрежа, това не е единствената мрежа. Ако не можете да намерите съобщението, което търсите в CAN шината, опитайте друга мрежа. Особено некритичните съобщения като радио, осветление и брави вероятно ще бъдат в друга мрежа.
  • Както споменахме, точните данни, предавани през CAN, зависят от марката на автомобила, модела и годината. Някои автомобили използват брояч в съобщението CAN, за да гарантират, че едно и също съобщение не се обработва многократно. Това е малко по-трудно, но трябва да можете да го направите с предоставената информация. Някои автомобили също използват контролна сума, за да осигурят целостта на данните. Изчисляването на тази контролна сума може да бъде трудно. Ако имате Toyota, разгледайте Adventures in Automotive Networks and Control Units, p10, Checksum-Toyota. Всеки наистина трябва да прочете цялата хартия.
  • При повторно възпроизвеждане на идентифицирания пакет в шината, вашето CAN към USB устройство може да премине в състояние „bus off“. Това е част от стандарта CAN и се случва, когато устройството е имало твърде много грешки. Това обикновено се случва, когато в автобуса има много трафик. За да заобиколите това, можете да играете със закъснения и синхронизация, може би опитайте да възпроизведете съобщението веднага след поставянето на колата в режим на аксесоари, опитайте малко да изчакате, опитайте с включена кола и т.н. Ако сте идентифицирали какви са ECU свързани към шината, можете също да издърпате предпазителя им, за да им попречите да изпращат съобщения и да намалят трафика в автобуса.

Трябва да чете

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

Не забравяйте да разгледате и Open Garages и техните видеоклипове.