Seguridad en electrónica automotriz - hello world en el tablero de instrumentos

Después de experimentar con el autobús CAN en el automóvil, hubo un deseo salvaje de profundizar un poco más en el lugar más sagrado. Creo que todos conocen un término como "ajuste de chip", en ruso, este es un firmware simple para unidades de control (motor, caja de cambios, etc.). El fabricante del equipo inicialmente establece la funcionalidad en sus dispositivos para actualizar o cambiar el software del microcontrolador, pero su mecanismo no se revela a nadie por razones obvias, y para complicar este proceso, el programa en sí, con el que funciona con memoria no volátil, no se almacena en el firmware, sino que se carga en el firmware. controlador solo en el momento del servicio. Este artículo trata sobre cómo hacer que el microcontrolador del tablero ejecute el código de otra persona mientras tiene acceso al conector de diagnóstico automático.

En general, el mecanismo de carga de datos en la ECU (unidad de control electrónico) se describe en el protocolo de diagnóstico UDS , a saber, las funciones:

34 - Solicitar descarga
36 - Transferencia de datos

Pero en términos de implementar UDS, los fabricantes de automóviles no son aprensivos para hacer cambios / adiciones al protocolo, creando un complemento propietario. En mi caso, el proceso de actualización se ve así:

  1. Iniciar sesión en una sesión de diagnóstico extendida
  2. Reiniciar en el gestor de arranque
  3. Obtención de acceso de seguridad para permitir una operación de carga de datos
  4. Transferencia de la dirección en la memoria donde se guardará el volumen de registros y datos.
  5. Carga de datos
  6. Haciendo lo que estaba cargado
  7. Lo siguiente es programar la EEPROM con el programa que descargaste antes.

Los puntos 1-3 no fueron difíciles, pero ¿qué hacer a continuación? ¿Dónde obtener la dirección y la cantidad máxima de datos? ¿Cómo después del arranque hacer lo que se descargó? En realidad, por el bien de esto, se está escribiendo un artículo.

Se eligió una combinación de dispositivos como sujeto de prueba, porque, en primer lugar, tengo uno más en caso de un apocalipsis, y en segundo lugar, su controlador se puede leer con un simple adaptador USB-RS232. Habiendo estudiado el interior, tenemos el controlador Fujitsu MB91F223. Este es un micrón de 32 bits con un núcleo FR60Lite, 512 KB de memoria y 16 KB de RAM. Hoja de datos, RM, manual del ensamblador, un programador para buscarlo fácilmente en Internet, no me detendré aquí. Aquí él es guapo:



Plan de acción:

  1. Encuentre manejadores de solicitud de diagnóstico
  2. Encuentra direcciones en la memoria donde puedes escribir algo
  3. Encuentre una forma de ejecutar código grabado

Para realizar el paso 1, debe estudiar el controlador de interrupciones desde el bus CAN y comprender dónde se almacenan los datos para su posterior procesamiento. Muchos controladores tienen una llamada tabla de vectores de interrupción, que contiene las direcciones de las funciones responsables de procesarlos. En la familia Fujitsu FR, esta tabla está en su industria, y el puntero a esta se almacena en el registro TBR (registro base de tabla). Una simple búsqueda de texto en la IDA da un resultado positivo y la dirección de la tabla de interrupciones con nosotros.



Según el manual, la dirección de interrupción CAN se encuentra en el desplazamiento 0x370 desde el comienzo del TBR. Ahí está.



Él, pero ya en pleno crecimiento, también es un manejador de mensajes que utiliza el protocolo ISO-TP

El controlador ISO-TP no está completo, pero donde los marcos de diferentes tipos divergen


Desde la base de datos del software de diagnóstico del distribuidor, tenía los identificadores SID y LID (31E1) del protocolo UDS que inició el procedimiento de ejecución del código, esto simplificó la tarea y me permitió actuar desde el principio hasta el principio. En el controlador de funciones 31E1, se encontró un fragmento donde se carga la dirección que pertenece al área de RAM, y luego se realiza una llamada a esta dirección. ¿No es esto lo que estamos buscando?



La búsqueda del uso de la constante 0x3F100 nos lleva a otro lugar en el firmware, al controlador de funciones UDS 34: ¡solicite la descarga! Esto es exactamente lo que necesita, se encuentra la dirección para escribir datos y la cantidad máxima (0x700 bytes) en RAM.



Ahora, después de enviar un comando para solicitar permiso para descargar datos 34 03F100 00 00010C (la dirección que se muestra en cursiva se indica en negrita), el tablero responde con un buen 740401 en respuesta. A continuación, los datos del usuario se cargan usando la función Transferir datos y se emite un comando para cumplir Descubrimos la carga y ejecución, pero ahora necesita encontrar qué descargar. No encontré un entorno de desarrollo de código abierto para este microcontrolador, pero después de un mes hubo un golpe en el soporte técnico de cipreses (sí, no fujitsu, o los absorbieron, en general, no lo sé) dieron un enlace a un IDE llamado Shaggy Softune Workbench 97 años con los que el compilador vino bajo el núcleo FR.

Eso es lo que parece, no un par vscode.

En la captura de pantalla, un fragmento del programa para parpadear LED (no patear por el estilo de escritura en ensamblador, esta es mi primera experiencia).



El mismo código, pero ya en si

void delay(int loops) { while(--loops) { #pragma asm NOP NOP #pragma endasm __asm(" nop"); } } #define DDR2 (*((char*)0x402)) #define PDR2 (*((char*)0x2)) #define WPR (*((char*)0x485)) #define LVRC (*((char*)0x57D)) void wdt_reset(void) { WPR = 0xA5; WPR = 0x5A; LVRC = 0x10; } void main(void) { int current_pin = 2; DDR2 |= 0x7E; while(1) { wdt_reset(); PDR2 |= current_pin; delay(0x7FFF); PDR2 &= ~current_pin; delay(0x7FFF); current_pin <<= 1; if(current_pin >= 0x80) { current_pin = 2; } } } 

Bueno, el resultado en sí


Con otros nodos, todo se ve más o menos igual, con la excepción de la arquitectura del controlador y el orden en que se ejecutan los comandos. ¿Es seguro dejar tales lagunas en los equipos automotrices? Aparentemente sí, ya que el fabricante lo hace. ¿Por qué estoy haciendo esto? Fue interesante, bueno, el ensamblador me interesó durante mucho tiempo, lo conocí, por así decirlo.

Asunto: panel de instrumentos Mitsubishi 8100B197, la comunicación en el bus CAN se realizó mediante el adaptador Tactrix OpenPort 2.0, software en una computadora de diseño propio.

Source: https://habr.com/ru/post/474718/


All Articles