Cómo hackear un coche: curso intensivo rápido

El objetivo de este artículo es que empieces a piratear coches de forma rápida, económica y sencilla. Para hacer esto, usaremos el indicador de RPM como ejemplo.

El siguiente no es de ninguna manera un tutorial exhaustivo. En cambio, su objetivo es proporcionar la información suficiente para que pueda comenzar a trabajar. Si desea profundizar, puede consultar las lecturas obligatorias al final.

Si decide llevar a cabo este tutorial en la vida real, necesitará una computadora Linux (o una máquina virtual Linux) y un dispositivo CAN-to-USB (que veremos más adelante).

Un coche es una red

Un automóvil consta de varias computadoras para controlar el motor, la transmisión, las ventanas, las cerraduras, las luces, etc. Estas computadoras se denominan unidades de control electrónico (ECU) y se comunican entre sí a través de una red.

Por ejemplo, cuando presiona el botón en el volante para aumentar el volumen de la radio, la ECU del volante envía un comando para aumentar el volumen a la red, la ECU de la radio ve este comando y actúa en consecuencia.

Hay varias redes en un automóvil, generalmente al menos dos:

  • Uno para datos críticos, como mensajes de motor y tren motriz
  • Y uno para datos menos críticos como radio y cerraduras de puertas

La red crítica utiliza un protocolo rápido y confiable, mientras que la red no crítica usa un protocolo más lento, menos confiable pero más económico. El número de redes, así como las ECU que están conectadas en red, depende de la marca, el modelo y el año del automóvil. Una ECU también podría conectarse a múltiples redes.

Conectarse a una red

Se puede acceder a algunas redes a través del puerto OBD-II. OBD-II es obligatorio en todos los automóviles y camiones ligeros fabricados en EE. UU. Después de 1996 y en Europa después de 2004.

El conector está al alcance de los brazos del asiento del conductor. Es posible que deba levantar una cubierta de plástico, pero siempre se puede acceder a ella sin herramientas.

El estándar OBD-II permite cinco protocolos de señalización. Depende del fabricante decidir cuál usar. CAN es el más popular y es el que discutiremos. Es accesible a través de los pines 6 y 14 del conector OBD-II. Si su automóvil tiene un bus CAN, verá cables metálicos en los pines como en la imagen de arriba.

El bus CAN es un bus confiable de alta velocidad que se utiliza para enviar datos críticos. Desafortunadamente, los paquetes de datos en el bus no están estandarizados, por lo que deberá invertirlos para saber qué significan. El estándar OBD-II también deja espacio para pines específicos del proveedor que se pueden usar para protocolos específicos del proveedor. Esto facilita al distribuidor el diagnóstico de problemas.

En mi automóvil (GM), tengo un bus CAN estándar en los pines 6 y 14, y un bus CAN de un solo cable específico del proveedor en el pin 1. El bus CAN estándar es un protocolo confiable de alta velocidad (500 kbps) también conocido como CAN de alta velocidad (HS-CAN). Se utiliza para datos críticos. El bus CAN de un solo cable (SW-CAN) o GMLAN es más lento (33,3 kbps) y menos confiable, pero más económico, ya que solo usa un cable. Este bus se utiliza para datos no críticos.

Si ve un pin específico de un proveedor y no sabe qué protocolo se está utilizando, busque el "pinout OBD" de Google. También hay CAN de baja velocidad (LS-CAN) y CAN de velocidad media (MS-CAN). MS-CAN generalmente se encuentra en los pines 3 y 11, funcionando a 125 kbps en automóviles Ford y Volvo.

Herramientas

Necesitará tanto un dispositivo que sea capaz de interpretar datos CAN como un software para analizar los datos

Hardware

Para recibir y transmitir paquetes CAN, necesita un dispositivo que sea capaz de hacerlo. A menudo se encontrará con dispositivos basados ​​en ELM327. Si bien estos tienen su uso, son terribles para piratear. Son demasiado lentos para monitorear el bus CAN.

También hay dispositivos de alta gama como Kvaser, Peak o EMS Wünsche. Estos harán el trabajo, pero son excesivos y bastante caros.

Algunos dispositivos de gama alta también requieren que compre software junto con él. USB2CAN es una interfaz CAN nativa para Linux que ofrece una excelente relación calidad-precio.

También puede utilizar Cantact o CANUSB. Sin embargo, estos no son dispositivos CAN nativos en Linux y utilizan un protocolo basado en ASCII. Esto significa que son un poco más complicados de configurar y tienen un rendimiento menor. Por otro lado, son compatibles con múltiples sistemas operativos.

Utilizo CANalyze que he diseñado para mis necesidades. Es similar a USB2CAN en que es una interfaz CAN nativa asequible, pero utiliza un microcontrolador más nuevo, es de código abierto y se puede construir con herramientas de código abierto. El resto de este tutorial asume que está utilizando una interfaz CAN nativa.

Software

Para comunicarse con el dispositivo, debe instalar el paquete can-utils en su máquina Linux. Puede hacer esto escribiendo lo siguiente en el indicador de Linux:

sudo apt-get install can-utils

Can-utils hace que sea extremadamente fácil enviar, recibir y analizar paquetes CAN. Estos son los comandos que usaremos.

  • cansniffer muestra solo los paquetes que están cambiando
  • candump volcar todos los paquetes recibidos
  • puedo enviar un paquete

Linux tiene soporte CAN integrado en el kernel a través de SocketCAN. Esto facilita la escritura de sus propios programas adicionales. Puede interactuar con el bus CAN de la misma manera que lo haría con cualquier otra red, es decir, a través de enchufes.

Puede transportar

Antes de comenzar a dar marcha atrás, debe comprender cómo funciona el bus CAN. Consta de 2 hilos y utiliza señalización diferencial. Dado que es un bus, se pueden conectar varios dispositivos a estos dos cables. Cuando se envía una trama CAN en el bus, todas las ECU la reciben, pero solo se procesa si es útil para la ECU. Si se envían varias tramas CAN al mismo tiempo, gana la que tenga la prioridad más alta. Un marco CAN tiene 3 partes que son relevantes para nosotros.

  • identificador de arbitraje El identificador de un mensaje. Una ECU lo usa para decidir procesar o ignorar la trama recibida. También representa la prioridad del mensaje. Un número más bajo tiene una prioridad más alta. Entonces, por ejemplo, si fuera un ingeniero que diseña la red, le daría al marco para el despliegue de bolsas de aire una prioridad muy alta o una identificación de arbitraje baja. Por otro lado, daría una prioridad más baja o una identificación de arbitraje más alta a los datos destinados a las cerraduras de las puertas.
  • código de longitud de datos (DLC) Indica la longitud del campo de datos en bytes. Una trama CAN puede tener como máximo 8 bytes de datos.
  • campo de datos Contiene hasta 8 bytes de datos.

Inversión del bus CAN

El enfoque general para invertir el bus CAN es generar el comportamiento que desea imitar y encontrar el mensaje que causa ese comportamiento. Por ejemplo, digamos que el sistema de asistencia para mantenerse en el carril (LKAS) de su automóvil es una mierda y que usted creó el suyo.

Para que controle la dirección, necesita saber qué mensajes enviar. La forma de resolver esto es encender el LKAS original, monitorear el bus CAN e identificar los paquetes responsables de girar el volante. Una vez que haya identificado estos paquetes, puede hacer que su propio LKAS envíe estos paquetes al bus CAN para controlar el volante.

En nuestro caso, queremos falsificar el tacómetro, por lo que debemos cambiar las RPM pisando el acelerador con el automóvil encendido y en neutral y luego tratar de encontrar el paquete responsable de cambiar las RPM.

Preparar

Conecte el dispositivo CAN al puerto OBD-II del automóvil y al puerto USB de la computadora. Abra la interfaz CAN ejecutando lo siguiente en su indicador de Linux:

sudo ip link set can0 up type can bitrate 500000

que abre la can0interfaz (siempre can0si solo tiene un dispositivo conectado) a una tasa de bits de 500 kbps, que es estándar.

Identificar

Cuando el automóvil está apagado, las ECU generalmente están inactivas, por lo que debe encender el automóvil o ponerlo en modo accesorio. Puede ver los datos CAN sin procesar ejecutando esto en su indicador de Linux:

candump can0

Esto imprime datos CAN en la pantalla tan pronto como se reciben. Sin embargo, esto está muy desorganizado y es muy difícil ver qué paquetes corresponden a un evento determinado. Puede presionar ctrl + c para detener el programa. Para hacer que los datos sean más legibles, usamos cansniffer, que agrupa los paquetes por ID de arbitraje y solo muestra los paquetes que están cambiando. Para iniciarlo, ejecute el comando en su indicador de Linux:

cansniffer -c can0

donde -ccolorea los bytes cambiantes y can0es la interfaz a rastrear. Se necesitan unos segundos para eliminar los paquetes constantes.

Debería ver algo similar a la imagen de abajo, aunque los números probablemente serán completamente diferentes.

La primera columna (delta) muestra la velocidad en segundos a la que se reciben los paquetes con ese ID de arbitraje. La segunda columna (ID) contiene la ID de arbitraje. Las columnas alfanuméricas restantes (datos…) contienen los bytes de datos. Si los datos tienen una representación ASCII, se pueden ver a la derecha; de lo contrario, es un punto.

Cuando pisa el acelerador con el motor en marcha para aumentar las RPM, es posible que aparezcan nuevos mensajes CAN en la pantalla y / o que los existentes cambien.

Necesitamos encontrar un mensaje CAN donde los bytes cambiantes se correlacionen con el cambio en RPM. Probablemente podamos esperar que el valor aumente / disminuya a medida que las RPM aumentan / disminuyen.

El primer cuadro CAN en latasniffer que parece variar con las RPM es el cuadro con id de arbitraje C9. Probablemente hay varios paquetes potenciales que varían con RPM, este es solo el primero.

Hay 4 bytes que están cambiando (de color rojo) en este mensaje, pero no todos indican necesariamente el RPM. Las variaciones en el tercer byte 07no parecen correlacionarse con la variación de RPM. El último byte lo 1Bhace.

Sin embargo, tan pronto como quitamos el pie del acelerador, pasa a 00. Esto indicaría que representa la posición del acelerador y no las RPM.

Finalmente, están los dos bytes 21 C0que parecen corresponder a un cambio en RPM. Más aún, varía como un entero de 16 bytes, es decir, cuando el segundo byte se C0desborda, el primer byte 21aumenta en uno. También parece que 21corresponde aproximadamente a 2000 RPM. Es bueno tener en cuenta cuándo volverá a reproducir el mensaje.

Repetición

Una vez que tenga un candidato, envíelo al bus CAN con el siguiente comando en su indicador de Linux:

cansend can0 0C9#8021C0071B101000

donde el marco tiene el formato #{datos} y debe ser sustituido por su propio mensaje CAN.

Su automóvil puede estar funcionando o en modo accesorio para esto. Asegúrese de usar un paquete que obtuvo cuando el motor no estaba inactivo o de lo contrario no verá ningún cambio cuando lo vuelva a reproducir mientras el motor está inactivo.

Si solo envía el paquete una vez, probablemente no verá ningún cambio en el grupo de instrumentos. Esto se debe a que el mensaje original todavía se envía continuamente en el bus a intervalos de 0,2 segundos por la ECU, por lo que su mensaje simplemente será ignorado.

Recuerde que la tasa se da en la primera columna de latasniffer. Hay dos formas de evitar esto además de desconectar la ECU que genera estos mensajes. Una opción es enviar los paquetes a una frecuencia mucho más alta que los que se envían actualmente. Puede hacer esto ejecutando lo siguiente en su indicador de Linux:

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

y sustituyendo el mensaje CAN por el que ha identificado. Presione ctrl + c para detener.

Otra opción es monitorear el bus, y cada vez que detecte el paquete que desea falsificar, envíe su propio paquete inmediatamente después. Esto se puede hacer ejecutando en su indicador de Linux:

candump can0 | grep " 0C9 " | while read line; do cansend can0 0C9#8021C0071B101000; done

donde debe sustituir el mensaje CAN y 0C9con el mensaje CAN que identificó y su identificación de arbitraje respectivamente. Puede experimentar con ambos enfoques para ver cuál funciona mejor.

Si cambia el tacómetro, buen trabajo, ¡lo encontró! Si no es así, identifique el siguiente mensaje que se correlacione con las RPM y reprodúzcalo.

Fuzzing

Ahora que tiene el cuadro CAN que establece las RPM en el grupo de instrumentos, puede jugar con los datos que envía para ver qué sucede. Hemos notado que los dos bytes que corresponden a RPM se comportan como un entero de 16 bits, por lo que para configurar el tacómetro en 8k RPM, ejecutamos lo siguiente en su indicador de Linux:

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

y el resultado es ...

¡Eso es! Ahora puede intentar controlar el velocímetro, la radio, las luces, las cerraduras de las puertas, etc. utilizando el mismo enfoque.

Posibles problemas

  • Si bien el bus CAN es la red más popular, no es la única. Si no puede encontrar el mensaje que busca en el bus CAN, pruebe con una red diferente. Especialmente los mensajes no críticos, como la radio, las luces y las cerraduras de las puertas, probablemente estarán en una red diferente.
  • Como se mencionó, los datos exactos transmitidos a través de CAN dependen de la marca, el modelo y el año del automóvil. Algunos automóviles utilizan un contador en el mensaje CAN para garantizar que el mismo mensaje no se procese varias veces. Esto es un poco más difícil, pero debería poder hacerlo con la información proporcionada. Algunos coches también utilizan una suma de comprobación para garantizar la integridad de los datos. Calcular esta suma de comprobación puede resultar complicado. Si tiene un Toyota, consulte Adventures in Automotive Networks and Control Units, p10, Checksum-Toyota. Todo el mundo debería leer el periódico completo.
  • Al reproducir el paquete identificado en el bus, su dispositivo CAN a USB puede entrar en el estado de "bus apagado". Esto es parte del estándar CAN y ocurre cuando el dispositivo experimentó demasiados errores. Esto generalmente sucede cuando hay mucho tráfico en el autobús. Para evitar esto, puede jugar con demoras y tiempos, tal vez intente reproducir el mensaje inmediatamente después de poner el automóvil en modo accesorio, intente esperar un poco, intente con el automóvil encendido, etc. Si ha identificado qué ECU son conectados al autobús, también puede tirar de su fusible para evitar que envíen mensajes y reducir el tráfico en el autobús.

Debe leer

  • Manual del hacker de coche
  • La investigación de Charlie Miller y Chris Valasek, sí, toda
  • Investigación de la Universidad de California en San Diego y la Universidad de Washington.

Asegúrese de ver también los garajes abiertos y sus videos.