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

Излъган тахометър, двигателят не работи.

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

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

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

Кола е мрежа

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

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

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

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

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

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

До някои мрежи можете да получите достъп чрез OBD-II порта. OBD-II е задължителен за всички автомобили и лекотоварни автомобили, построени в САЩ след 1996 г. и Европа след 2004 г.

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

OBD-II конектор.

Стандартът 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 извеждане". Има също 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 - вземете инсталирайте can-utils

Can-utils прави изключително лесно да изпращате, получавате и анализирате CAN пакетите. Това са командите, които ще използваме.

  • cansniffer показва само пакетите, които се променят
  • изхвърляне на всички получени пакети
  • мога да изпратя пакет

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 set link can0 up type може да битретира 500000

което извежда интерфейса can0 (винаги can0, ако имате свързано само едно устройство) с битова скорост от 500 kbps, което е стандартно.

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

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

кендъмп консерва0

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

cansniffer -c can0

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

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

Cansniffer с двигател на празен ход.

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

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

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

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

Открит пакет, корелиращ в RPM.

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

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

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

просвирване

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

cansend can0 0C9 # 8021C0071B101000

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

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

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

Спомнете си, че тарифата е дадена в първата колона на канисфер. Има два начина да заобиколите това, като изключите изключването на ECU, генериращ тези съобщения. Една от възможностите е да изпращате пакетите с много по-висока честота от тези, които се изпращат в момента. Можете да направите това, като стартирате следното във вашата подкана Linux:

докато е вярно; направете cansend can0 0C9 # 8021C0071B101000; сън 0,002; Свършен

и замяна на CAN съобщението с това, което сте идентифицирали. Натиснете ctrl + c, за да спрете.

Друг вариант е да наблюдавате шината и всеки път, когато откриете пакета, който искате да излъжете, изпращайте свой собствен пакет веднага след това. Това може да стане, като стартирате във вашата подкана Linux:

тенджера консерва0 | греп "0C9" | докато четете ред; направете cansend can0 0C9 # 8021C0071B101000; Свършен

където трябва да замените CAN съобщението и 0C9 с CAN съобщението, което сте идентифицирали и съответно това е арбитражен идентификатор. Можете да експериментирате и с двата подхода, за да видите кой от тях работи по-добре.

Ако тахометърът се промени, добра работа, намерихте го! Ако не, идентифицирайте следващото съобщение, което е свързано с RPM, и го преиграйте.

грапавини

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

докато е вярно; направя cansend can0 0C9 # 0080000000101000; сън 0,002; Свършен

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

Измамен RPM с изключен двигател.

Това е! Сега можете да опитате да контролирате скоростомера, радиото, светлините, бравите на вратите и т.н., като използвате същия подход.

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

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

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

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

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